Странное поведение Ajax в JQuery в Opera и Chrome - PullRequest
1 голос
/ 20 сентября 2010

У меня есть эти функции

//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);

Тогда это нормальный вызов, также когда я создаю синхронный вызов, помещая async: false в $.ajax вызов или когда я ставлю тайм-аут, timeout: 1. В обработчиках кликов он также работает как ожидалось.

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

Кто-нибудь знает, почему это происходит.

...