2010-11-29 3 views
8

мне нужно addEventListener для прослушивания progress события перед тем открытия XMLHttp соединения (т.е. xhr.open()), но метод beforeSend возвращает экземпляр XHR уже открыт. Как бы я переопределить его, чтобы правильно добавить слушателя?

(Note: You need to add the event listeners before calling open() on the request. Otherwise the progress events will not fire.)

ответ

8

Вы можете переопределить функцию xhr в ajaxSetup или даже на каждом отдельном $.ajax вызова. Это задокументировано в документах $.ajax(спасибо Nick!).

Ваш код может выглядеть следующим образом (непроверенные), если вы хотите сделать это все время:

(function() { 
    var originalXhr = jQuery.ajaxSettings.xhr; 
    jQuery.ajaxSetup({ 
     xhr: function() { 
      var req = originalXhr(); 
      if (req) { 
       // Add your progress handler 
      } 
      return req; 
     } 
    }); 
})(); 

... или как это (live example) для всего конкретного запроса:

$.ajax({ 
    url: "path/to/resource", 
    xhr: function() { 
    var req = $.ajaxSettings.xhr(); 
    if (req) { 
     // Add your handler here 
    } 
    return req; 
    } 
}); 

К сожалению, несмотря на то, что зарегистрировано xhr, расположение сконфигурированного в настоящее время (jQuery.ajaxSettings.xhr) не похоже, так что технически вы все еще полагаетесь на недокументированное d с помощью jQuery.ajaxSettings.xhr в вашем коде. Вам просто нужно дважды проверить, что это все еще есть на каждом выпуске точки, вероятно, он не будет слишком много перемещаться (и jQuery.ajaxSettings не менее упомянул в документах, here).

+1

+1 - Просто отметьте, это задокументировано, последний вариант здесь: http://api.jquery.com/jQuery.ajax/ – 2010-11-29 12:10:29