Jquery Ajax, nie działa w Internet Explorerze
Próbuję zrobić trochę jQuery ajax i działa w Firfox i Chrome, ale nie w Internet Explorer 9.
Ostateczny kod będzie musiał przechodzić przez subdomeny, co nie działa w przypadku domyślnego transportu.
Próbuję więc utworzyć niestandardowy transport do użycia w programie Internet Explorer
Metoda 1
$.ajaxTransport("+*", function (options, originalOptions, jqXHR) {
if (jQuery.browser.msie && window.XDomainRequest) {
var xdr;
return {
send: function (headers, completeCallback) {
// Use Microsoft XDR
xdr = new XDomainRequest();
xdr.open("get", options.url);
xdr.onload = function () {
if (this.contentType.match(/\/xml/)) {
var dom = new ActiveXObject("Microsoft.XMLDOM");
dom.async = false;
dom.loadXML(this.responseText);
completeCallback(200, "success", [dom]);
} else {
completeCallback(200, "success", [this.responseText]);
}
};
xdr.ontimeout = function () {
completeCallback(408, "error", ["The request timed out."]);
};
xdr.onerror = function () {
completeCallback(404, "error", ["The requested resource could not be found."]);
};
xdr.send();
},
abort: function () {
if (xdr) xdr.abort();
}
};
}
});
Stworzyłem prostą przykładową stronę, aby zademonstrować tutaj pierwszą technikę:http://services.whygo.net/sendAjax.htm
Pamiętaj, że jeśli używasz niestandardowego transportu, normalny transport zakończy się niepowodzeniem, chyba że odświeżysz
Pomysł pochodzi stąd:http://forum.jquery.com/topic/cross-domain-ajax-and-ie#14737000002203097
To nie daje komunikatu o błędzie innego niż 'error' w metodzie 'error' wywołanej $ ajax, gdy zawodzi. Dostaję niedozwoloną metodę 405 na karcie „Sieć” narzędzi if dev, ale rzeczy po stronie serwera nie działają.
Metoda 2 Wypróbowałem również inną metodę opisaną tutaj:Cross-subdomena AJAX działa w Chrome, a nie w IE
if ('XDomainRequest' in window && window.XDomainRequest !== null) {
// override default jQuery transport
jQuery.ajaxSettings.xhr = function() {
try { return new XDomainRequest(); }
catch(e) { }
};
}
Można to znaleźć tutaj:http://www.whygo.net/sendAjax2.html
Na tym naprawdę otrzymuję 200 kodów na karcie „sieć” np. Narzędzi dev, ale nie nazywa się „błędu” ani „sukcesu” parametru $ ajax.
Jeśli ustawię limit czasu na ten drugi, to powróci on do funkcji „błędu” z komunikatem „timeout”.