Обработка ошибок jQuery ajax с помощью «script» dataType - PullRequest
5 голосов
/ 29 июля 2010

Я использую функцию-обертку вокруг функции AJAX в jQuery, например:

$.getAjax = function(url, type, callback){
    $.ajax({
        url: url,
        cache: false,
        dataType: type,

        success: function(){
            alert("success");
        },
        complete: function(XMLHttpRequest, textStatus){
            alert("complete");

            if (callback != undefined) {
                callback();
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown){
            alert("error");
        }
    });
}

Когда я использую это с «text» в качестве dataType, он отлично работает, даже если URL недействителен.Когда URL-адрес недействителен, он сначала вызывает ошибку, а затем завершает функцию.Это нормально.Но когда я использую «скрипт» в качестве dataType, он ничего не вызывает, когда URL недействителен.Что мне делать, чтобы перехватить ошибки HTTP 404 и другие, когда я использую «script» в качестве dataType?

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Я посмотрел на исходный код jQuery и обнаружил, что он не вызывает метод обработки ошибок.На самом деле, он вызывает функции success () и complete () только тогда, когда запрос http get будет успешным.

// If we're requesting a remote document
        // and trying to load JSON or Script with a GET
        if ( s.dataType === "script" && type === "GET" && remote ) {
            var head = document.getElementsByTagName("head")[0] || document.documentElement;
            var script = document.createElement("script");
            script.src = s.url;
            if ( s.scriptCharset ) {
                script.charset = s.scriptCharset;
            }

            // Handle Script loading
            if ( !jsonp ) {
                var done = false;

                // Attach handlers for all browsers
                script.onload = script.onreadystatechange = function() {
                    if ( !done && (!this.readyState ||
                            this.readyState === "loaded" || this.readyState === "complete") ) {
                        done = true;
                        success();
                        complete();

                        // Handle memory leak in IE
                        script.onload = script.onreadystatechange = null;
                        if ( head && script.parentNode ) {
                            head.removeChild( script );
                        }
                    }
                };
            }

            // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
            // This arises when a base node is used (#2709 and #4378).
            head.insertBefore( script, head.firstChild );

            // We handle everything using the script element injection
            return undefined;
        }
0 голосов
/ 10 декабря 2014

Плохие новости: эта проблема до сих пор не решена в jquery 1.x.Хорошая новость: разрешен в jquery 2.x (который не поддерживает IE <= 8).Мне удалось заставить мой <code>complete обратный вызов работать, который получает уведомление об ошибке.См. здесь для кода jquery или связанного фрагмента:

send: function( _, complete ) {
    script = jQuery("<script>").prop({
        async: true,
        charset: s.scriptCharset,
        src: s.url
    }).on(
        "load error",
        callback = function( evt ) {
            script.remove();
            callback = null;
            if ( evt ) {
                complete( evt.type === "error" ? 404 : 200, evt.type );
            }
        }
    );
    document.head.appendChild( script[ 0 ] );
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...