Gram z tym XmlHttpRequest
rzeczy. W niektórych samouczkach i książkach jest to funkcja onload
, która jest wywoływana po zakończeniu żądania. W moim małym eksperymencie funkcja ta nigdy nie jest wywoływana. Oto mój kod:XmlHttpRequest.onload nie nazywa się
window.onload = function() {
var url = "http://www.google.com";
var request = new XMLHttpRequest();
request.onload = function() {
var state = this.readyState;
var responseCode = request.status;
console.log("request.onload called. readyState: " + state + "; status: " + responseCode);
if (state == this.DONE && responseCode == 200) {
var responseData = this.responseText;
alert("Success: " + responseData.length + " chars received.");
}
};
request.error = function(e) {
console.log("request.error called. Error: " + e);
};
request.onreadystatechange = function(){
console.log("request.onreadystatechange called. readyState: " + this.readyState);
};
request.open("GET", url);
request.send(null);
};
Testuję to w ostatnim wydaniu Firefoksa (właśnie dziś zaktualizowane). Linia dziennika w onload
nigdy nie jest drukowana, a punkt przerwania ustawiony w pierwszej linii nigdy nie zostanie trafiony. Jednak funkcja onreadystatechange
jest wywoływana dwa razy, a żądanie HTTP jest faktycznie wykonywane. To właśnie konsoli Firebug pokazuje:
request.onreadystatechange called. readyState: 1
GET http://www.google.com/ 302 Found 174ms
request.onreadystatechange called. readyState: 4
NS_ERROR_FAILURE: Failure
request.send(null);
Jest błąd w linii send
. Próbowałem zmienić go na request.send()
z identycznym wynikiem.
Początkowo myślałem, że to może być przeglądarka próbująca zapobiec XSS, więc przeniosłem swoją stronę sterownika html do instancji Tomcat w mojej maszynie dev, ale wynik jest taki sam.
Czy można zagwarantować tę funkcję? Jak już wspomniano powyżej, jest wspólna być postrzegane w większości tutoriali, ale z drugiej strony w W3C spec page dalej, fragment hello world wykorzystuje onreadystatechange
zamiast:
function processData(data) {
// taking care of data
}
function handler() {
if(this.readyState == this.DONE) {
if(this.status == 200 &&
this.responseXML != null &&
this.responseXML.getElementById('test').textContent) {
// success!
processData(this.responseXML.getElementById('test').textContent);
return;
}
// something went wrong
processData(null);
}
}
var client = new XMLHttpRequest();
client.onreadystatechange = handler;
client.open("GET", "unicorn.xml");
client.send();
Sprawdza readyState == this.DONE
. DONE
ma wartość 4, co widzę w dzienniku. Więc jeśli był to problem związany z XSS, a przeglądarka uniemożliwiała mi nawiązanie połączenia z inną domeną, to dlaczego nawiązano połączenie i odebrano status DONE ???
PS: Tak, wiem, że istnieją potężne biblioteki, które mogą to łatwo zrobić, ale nadal jestem noobem JavaScript, więc najpierw chciałbym zrozumieć niski poziom.
UPDATE:
Zmieniłem adres URL do jednego w mojej domenie (localhost), a błąd zniknął ale funkcja onload
nadal nie miano. Testowany w IE8 i nie działa. Testowane w Chrome i działa. Jak to?
UPDATE 2:
Testowany ponownie w Firefoksie, a teraz działa. Prawdopodobnie stara strona była nadal przechowywana w pamięci podręcznej, dlatego nie mogłem tego natychmiast zauważyć. Nadal nieudane w IE8, spróbuję przetestować go w nowszej wersji.
Należy pamiętać, że jQuery rozwiązuje że już. Nawet jeśli nie chcesz go używać, możesz przestudiować jego kod. –
Tak właśnie mi powiedzieli webdevowie w pracy. Bez problemu użyłbym go w prawdziwym projekcie. Który plik źródłowy powinienem wyszukać? –
jQuery jest zawijany w pliku. Nie polecam używania wersji minified, ponieważ jest trudniej ją odczytać. Poszukaj metody 'ajax', kopiuj w razie potrzeby. –