Opera 和 Chrome 中 JQuery 中奇怪的 Ajax 行为

发布于 2024-09-19 19:56:36 字数 2365 浏览 1 评论 0原文

我有这个功能

//send JSON-RPC request
var json_rpc = (function() {
    var id = 1;
    return function(url, method, params, success) {

        if (typeOf(params) != 'array') {
            params = [params];
        }
        var request = JSON.stringify({
                       'jsonrpc': '2.0',
                       'method': method, 
                       'params': params, 
                       'id': id++});
        return $.ajax({
            url: url, 
            data: request,
            success: success,
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                  error_msg('XHR error ' + XMLHttpRequest.status + ' ' +
                     XMLHttpRequest.responseText);
            },
            beforeSend: function(xhr) {
       console.log('before send');
       console.log(dir(xhr));
       xhr.onreadystatechange = function(){
          console.log('state');
      };
        },
            contentType: 'application/json',
            dataType: 'json',
            type:"POST"});
    }
})();

 

var rpc = function(method, success_callback) {
    //I use functional javascript library
    var fun = json_rpc.partial('rpc.php', method, _, function(data) {
        if (data['error']) {
            var e = 'Json-RPC (' + method + ') ' + data['error']['code'] + ": " + 
               data['error']['message'];
            error_msg(e);
        } else {
            info_msg("rpc sucess for method '" + method + "'");
            success_callback(data['result']);
        }
    });
    return function() {
        fun(Array.slice(arguments));
    };
};

当我使用 rpc 创建函数

var update_news = rpc('get_news', function(data) {
    if (data) {
       //update news
    }
});

并调用它

$(document).ready(function() {
    ...
    update_news();
    ...
});

时,在 Firefox 中一切都很好,但在 Opera 和 Chrome 中,函数 update_news 未执行,beforeSend 被触发,但 onreadystatechange 不是,但是当我添加

setTimeout(update_news, 0);

然后它会正常调用时,当我通过在 $.ajax 调用中放置 async: false 来创建同步调用时或者当我放置超时,超时:1。在单击处理程序中,它也按预期运行。

$('#some_id').click(function() {
  update_news();
});

任何人都知道为什么会发生这种情况。

I have this functions

//send JSON-RPC request
var json_rpc = (function() {
    var id = 1;
    return function(url, method, params, success) {

        if (typeOf(params) != 'array') {
            params = [params];
        }
        var request = JSON.stringify({
                       'jsonrpc': '2.0',
                       'method': method, 
                       'params': params, 
                       'id': id++});
        return $.ajax({
            url: url, 
            data: request,
            success: success,
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                  error_msg('XHR error ' + XMLHttpRequest.status + ' ' +
                     XMLHttpRequest.responseText);
            },
            beforeSend: function(xhr) {
       console.log('before send');
       console.log(dir(xhr));
       xhr.onreadystatechange = function(){
          console.log('state');
      };
        },
            contentType: 'application/json',
            dataType: 'json',
            type:"POST"});
    }
})();

 

var rpc = function(method, success_callback) {
    //I use functional javascript library
    var fun = json_rpc.partial('rpc.php', method, _, function(data) {
        if (data['error']) {
            var e = 'Json-RPC (' + method + ') ' + data['error']['code'] + ": " + 
               data['error']['message'];
            error_msg(e);
        } else {
            info_msg("rpc sucess for method '" + method + "'");
            success_callback(data['result']);
        }
    });
    return function() {
        fun(Array.slice(arguments));
    };
};

and when I create function with rpc

var update_news = rpc('get_news', function(data) {
    if (data) {
       //update news
    }
});

and call it

$(document).ready(function() {
    ...
    update_news();
    ...
});

In Firefox everythig is fine, but in Opera and Chrome the function update_news is not executing, beforeSend is fired but onreadystatechange is not, but when I add

setTimeout(update_news, 0);

Then It's call normaly, also when I create synchronous call by putting async: false in $.ajax call or when I put timeout, timeout: 1. In click handlers it also run as expected.

$('#some_id').click(function() {
  update_news();
});

Anybody know why this is happening.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文