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

时间:2010-09-20 13:19:08

标签: javascript jquery ajax google-chrome opera

我有这个功能

//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中,everythig很好,但在Opera和Chrome中,函数update_news未执行,beforeSend被触发但onreadystatechange未被触发,但是当我添加

setTimeout(update_news, 0);

然后,当我通过将async: false置于$.ajax通话中或当我将超时timeout: 1放入时创建同步通话时,它也是正常的通话。在点击处理程序中,它也按预期运行。

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

任何人都知道为什么会这样。

0 个答案:

没有答案
相关问题