Я недавно дурачился с некоторыми методами опроса ajax. Однако кажется, что я не могу переписать обработчик onreadystatechange
из объекта XMLHttpRequest
в FireFox (3.6.7).
Отслеживая проблему, почему FF выдает исключение при попытке доступа к onreadystatechange
, я понял, что это зависит от того, был вызван метод send()
или нет.
Другими словами, вот пример (обычный js, пока нет jQuery), который работает:
(Это довольно просто для демонстрации)
var myxhr = new XMLHttpRequest();
myxhr.open("GET", "/my/index.php");
myxhr.onreadystatechange = function(){
console.log('ready state changed');
};
console.log("onreadystatechange function: ", myxhr.onreadystatechange);
myxhr.send(null);
Это работает, лучше сказать, что здесь можно получить доступ к myxhr.onreadystatechange
. Если я переключаю последние две строки кода, FF выдает исключение, в основном говоря мне, что мне не разрешен доступ к этому объекту.
myxhr.send(null);
console.log("onreadystatechange function: ", myxhr.onreadystatechange);
Не удается.
Так где же моя настоящая проблема?
Хорошо, я хочу использовать jQuery $.ajax()
. Но если я попытаюсь перезаписать метод onreadystatechange
объекта XHR
, который был возвращен из $.ajax()
, я получу то же исключение FireFox.
Хорошо, я уже выяснил, почему это происходит, поэтому я подумал: а что насчет свойства beforeSend
$.ajax()
? Итак, я в основном попробовал это:
var myxhr = $.ajax({
url: "/my/index.php",
type: "GET",
dataType: "text",
data: {
foo: "1"
},
beforeSend: function(xhr){
var readystatehook = xhr.onreadystatechange;
xhr.onreadystatechange = function(){
readystatehook.apply(this, []);
console.log('fired');
};
},
success: function(data){
console.log(data);
},
error: function(xhr, textStatus, error){
console.log(xhr.statusText, textStatus, error);
}
});
Угадайте, что FireFox выдает исключение. Так что же вы делаете сейчас? Вы копаетесь в исходном коде jQuery, как я. Но это принесло больше вопросов, чем ответов на самом деле. Похоже, что beforeSend()
действительно вызывается до выполнения xhr.send()
. Поэтому мне интересно, почему же FireFox не позволяет перезаписывать обработчик на этом этапе.
Заключение
Невозможно создать custom readystatechange handler
с помощью jQuery / Firefox?