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

Javascript Opera和Chrome中JQuery中奇怪的Ajax行为,javascript,jquery,ajax,google-chrome,opera,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({

我有这个功能

//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"});
    }
})();

当我用rpc创建函数时

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

$(document).ready(function() {
    ...
    update_news();
    ...
});
在Firefox中,一切正常,但在Opera和Chrome中,
update\u news
功能没有执行,
beforeSend
被触发,但是
onreadystatechange
没有,但是当我添加

setTimeout(update_news, 0);
然后是正常调用,也就是当我通过在
$中放入
async:false
来创建同步调用时。ajax
调用或者当我放入timeout时,
timeout:1
。在单击处理程序中,它也按预期运行

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

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

您是否忘记了“request”变量的第一个函数中的
var
?我更改了它,它的行为是一样的。浏览器的错误控制台中有错误吗?另外,如果您可以链接到demoNo errors,那么会更容易帮助您,只要函数
update\u news()
没有启动。
$('#some_id').click(function() {
  update_news();
});