jQuery不断地发送Ajax请求以获取响应。

5

如何使用jQuery来不断运行PHP脚本并每秒获取响应,同时在鼠标按下时向同一脚本发送小数据?

我是否真的需要添加一些随机扩展名才能使这样一个简单的定时器工作?


每秒获取一次响应有点过度了...你能把它改成至少15秒吗? - alex
5个回答

25
迭代是人性的,递归是神圣的。 -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();

2
而且,无论如何,它每秒钟不会发出太多请求。它一次只会发出1个请求。一个请求完成后,再发出下一个请求。所以,也许你应该取消你的踩? - Andrew Hedges
安德鲁是正确的,那段代码不仅能够正常运行,而且恰好符合史蒂夫的要求。 - mclaughj
这通常可以正常工作 - 尽管我认为更健壮的方法是让响应告诉应用程序在再次联系服务器之前应等待多长时间,因为它通常能够计算出最佳持续时间。 - Bittercoder
当然,这只是一个简化的情况。它应该检查响应并决定何时进行下一步操作。 - Andrew Hedges
优雅完美的解决方案 - Saad Suri
显示剩余2条评论

1

//你需要的所有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);
    }
};

1
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


0
你可以将用于ping服务器的代码放在一个函数中,然后像这样操作:
setInterval('ping()',1000); //this will ping 1000 milliseconds or 1 second

0

你不需要添加一些随机的扩展。原生的JavaScript函数setInterval和setTimeout可以在设定的时间间隔内执行操作。你可能想要做类似于以下的事情

function ajaxPing() {
  ...
}

setInterval("ajaxPing()", 1000);

$(element).mousedown(ajaxPing);

另一方面,如果你真的想要每秒钟进行一次ping操作,那么只需在mousedown事件中将数据存储在变量中,并在下一次ping操作(不到一秒钟)时提交即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接