【问题标题】:jQuery constantly ping for Ajax responcejQuery 不断 ping Ajax 响应
【发布时间】:2009-03-31 04:55:47
【问题描述】:

如何使用 jQuery 不断运行 PHP 脚本并每秒获得响应,并将鼠标上的少量数据发送到同一个脚本?

我真的必须添加一些随机扩展才能让这样一个简单的计时器工作吗?

【问题讨论】:

  • 每秒得到响应有点过分...你能把它改成至少 15 秒吗?

标签: php jquery ajax


【解决方案1】:

迭代是人,递归是神。
-L. Peter Deutsch

var req = function () {
    $.ajax({
        url : 'http://example.com/yourscript.php',
        complete : function () {
            req();
        }
    });
};
req();

如果不是很明显,上面的请求会在前一个请求完成后立即发出一个新请求,直到永远。您还可以在请求之间设置 1 秒延迟,如下所示:

var req = function () {
    $.ajax({
        url : 'http://example.com/yourscript.php',
        complete : function () {
            setTimeout(function () {
                req();
            }, 1000);
        }
    });
};
req();

【讨论】:

  • 每秒会发生很多次,并导致服务器负载下降
  • 我想你在我添加第二个版本之前投了反对票。基本思想是使用回调而不是简单地每秒轮询一次。
  • 而且,无论如何,它每秒不会发出很多请求。它将一次发出 1 个请求。 1 个请求,完成后,发出下一个请求。那么,也许您应该撤消您的反对票?
  • 安德鲁说得对,该代码不仅有效,而且正是史蒂夫要求的。
  • 这通常可以正常工作 - 尽管我认为更强大的方法是让响应告诉应用程序在再次联系服务器之前应该等待多长时间,因为它通常可以计算出最佳的持续时间。
【解决方案2】:
function doAjax(data){
    $.ajax({
    type: "POST",
    data: data,
    url: 'http://example.com/yourscript.php',
  });
}
// Set interval
setInterval('doAjax()',1000);
// Set event handler
$(document).mousedown(function(){
  doAjax({key: 'value'});
});

如果您不想捕获整个页面上的点击,您可以将 $(document) 替换为实际元素。

如果您正在寻找回调等,您可以使用 ajax 函数做更多事情: http://docs.jquery.com/Ajax/jQuery.ajax

【讨论】:

    【解决方案3】:

    //您需要的所有 ping:

    ping.pushCallback(function() { YourCallback(); });
    $.data(document.body, 'data_ping', ping);
    

    //--------------------------------------------- --------- //脚本

    $.ping = function(url, options) {
        this.url = url;
        this.options = $.extend({
            delay: 2000,
            dataType: 'json',
            timeout: 10000,
            data: {},
            callbacks: []
        }, options);
        this.queue();
    };
    $.ping.prototype = {
        queue: function() { var self = this;
            setTimeout(function() {
                self.send();
            }, self.options.delay);
        },
        send: function() { var self = this;
            $.ajax(self.url, {
                success: function(data) {
                    for (var i in self.options.callbacks) {
                        self.options.callbacks[i](data);
                    }
                },
                complete: function() {
                    self.queue();
                },
                dataType: self.options.dataType,
                data: self.options.data,
                type: "GET",
                cache: false,
                timeout: self.options.timeout
            });
        },
        setData: function(key, value) { 
            this.options.data[key] = value;
        },
        pushCallback: function(callback) {
            this.options.callbacks.push(callback);
        }
    };
    

    【讨论】:

      【解决方案4】:

      您可以将 ping 服务器的代码放在一个函数中,然后执行以下操作:

      setInterval('ping()',1000); //this will ping 1000 milliseconds or 1 second
      

      【讨论】:

        【解决方案5】:

        您不必添加一些随机扩展。有本机 javascript 函数 setInterval and setTimeout 用于在设定的时间间隔内做事。您可能想要做类似的事情

        function ajaxPing() {
          ...
        }
        
        setInterval("ajaxPing()", 1000);
        
        $(element).mousedown(ajaxPing);
        

        另一方面,如果您真的想每秒进行一次 ping 操作,只需将数据存储在 mousedown 上的变量中并在下一次 ping 时提交就足够了(即将在不到一秒的时间内发生)。

        【讨论】:

          猜你喜欢
          • 2016-08-14
          • 2020-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多