JQuery Ajax, не работающий в Internet Explorer

Я пытаюсь сделать jQuery ajax, и он работает в Firfox и Chrome, но не в Internet explorer 9.

Конечный код должен будет проходить через поддомены, и это не работает, т.е. с транспортом по умолчанию.

Итак, я пытаюсь создать настраиваемый транспорт для использования в Internet Explorer

Метод 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();
            }
        };
    }
});

Я создал простую примерную страницу, чтобы продемонстрировать первую технику здесь: http://services.whygo.net/sendAjax.htm

Обратите внимание, что если вы используете настраиваемый перенос, нормальная транспортировка завершится неудачей, если вы не обновите

Идея исходит отсюда: http://forum.jquery.com/topic/cross-domain-ajax-and-ie#14737000002203097

Это не дает сообщения об ошибке, кроме "ошибки" внутри метода "error", вызываемого в $ajax, когда он терпит неудачу. Я получаю метод 405, который не разрешен на вкладке "Сеть", если инструменты dev, но выполняются элементы на стороне сервера.

Метод 2 Я также попробовал другой метод, описанный здесь: Перекрестный субдомен AJAX работает в Chrome, а не в IE

if ('XDomainRequest' in window && window.XDomainRequest !== null) {

    // override default jQuery transport
    jQuery.ajaxSettings.xhr = function() {
        try { return new XDomainRequest(); }
        catch(e) { }
     };
}

Это можно найти здесь: http://www.whygo.net/sendAjax2.html

На этом я фактически получаю 200 кодов на вкладке "сеть", то есть dev tools, но не вызывает "ошибку" или "успех" pararm $ajax.

Если я поставлю таймаут на этот второй, то он вернется к функции "error" с сообщением "timeout".

Ответ 1

Вот решение, с которым я пошел примерно через день, борясь с этой несогласованностью...

// new method as to not overwrite jQuery defaults
var cors = (window.XDomainRequest) ? function(url, callback) {

    var xdr = new XDomainRequest();
    xdr.open('get', url);
    xdr.onload = function() { callback(xdr.responseText); }
    xdr.send();

} : $.get; // else, use jQuery method

Использование...

cors(url, function(msg) { alert(msg); }); // pretty well same as $.get

Скопируйте и вставьте, это, конечно, не служит всем целям, но это начало, и оно работает.

Ответ 2

На странице http://services.whygo.net/sendAjax2.html я вижу, что ожидаемый dataType ответ AJAX возвращается с сервера как JSON, но ответ на самом деле возвращается как текстовая строка ( "Электронная почта успешно отправлена" ).

Возможно, вы могли бы попробовать прокомментировать dataType и позволить jQuery выяснить, какой тип ответа возвращается.