Чтобы добавить базовую обработку ошибок, я хотел переписать фрагмент кода, который использовал jQuery $ .getJSON для извлечения некоторых фотографий с Flickr. Причина в том, что $ .getJSON не поддерживает обработку ошибок и не работает с тайм-аутами.
Поскольку $ .getJSON - это просто оболочка вокруг $ .ajax, я решил переписать эту штуку и удивить сюрприз, она работает безупречно.
Но теперь начинается самое интересное. Когда я намеренно вызываю 404 (путем изменения URL-адреса) или вызываю тайм-аут сети (не будучи подключенным к межсетевым соединениям), событие ошибки вообще не срабатывает. Я не понимаю, что делаю не так. Помощь очень ценится.
Вот код:
$(document).ready(function(){
// var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404
$.ajax({
url: jsonFeed,
data: { "lang" : "en-us",
"format" : "json",
"tags" : "sunset"
},
dataType: "jsonp",
jsonp: "jsoncallback",
timeout: 5000,
success: function(data, status){
$.each(data.items, function(i,item){
$("<img>").attr("src", (item.media.m).replace("_m.","_s."))
.attr("alt", item.title)
.appendTo("ul#flickr")
.wrap("<li><a href=\"" + item.link + "\"></a></li>");
if (i == 9) return false;
});
},
error: function(XHR, textStatus, errorThrown){
alert("ERREUR: " + textStatus);
alert("ERREUR: " + errorThrown);
}
});
});
Хочу добавить, что этот вопрос был задан, когда jQuery был на версии 1.4.2.
<script>
теги Javascript , которые вставляются динамически. Таким образом, вы можете знать только то, что запрос завершился неудачно, а не код состояния. Если вы хотите получить коды состояния, вам необходимо использовать традиционные запросы Ajax или другие междоменные методы.Это известное ограничение встроенной реализации jsonp в jQuery. Текст ниже взят из IBM DeveloperWorks
Однако в GoogleCode доступен плагин jsonp, который обеспечивает поддержку обработки ошибок. Для начала просто внесите в свой код следующие изменения.
Вы можете либо скачать его, либо просто добавить ссылку на скрипт в плагин.
<script type="text/javascript" src="http://jquery-jsonp.googlecode.com/files/jquery.jsonp-1.0.4.min.js"> </script>
Затем измените свой вызов ajax, как показано ниже:
$(function(){ //var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404 $.jsonp({ url: jsonFeed, data: { "lang" : "en-us", "format" : "json", "tags" : "sunset" }, dataType: "jsonp", callbackParameter: "jsoncallback", timeout: 5000, success: function(data, status){ $.each(data.items, function(i,item){ $("<img>").attr("src", (item.media.m).replace("_m.","_s.")) .attr("alt", item.title) .appendTo("ul#flickr") .wrap("<li><a href=\"" + item.link + "\"></a></li>"); if (i == 9) return false; }); }, error: function(XHR, textStatus, errorThrown){ alert("ERREUR: " + textStatus); alert("ERREUR: " + errorThrown); } }); });
источник
Решение, если вы застряли на jQuery 1.4:
var timeout = 10000; var id = setTimeout( errorCallback, timeout ); $.ajax({ dataType: 'jsonp', success: function() { clearTimeout(id); ... } });
источник
.abort()
ожидающего jqXHR после периода ожидания может быть лучшим способом.Это может быть «известное» ограничение jQuery; однако, похоже, это плохо документировано. Сегодня я потратил около 4 часов, пытаясь понять, почему мой тайм-аут не работает.
Я переключился на jquery.jsonp, и он работал как шарм. Спасибо.
источник
Кажется, решено с jQuery 1.5. Я пробовал приведенный выше код и получил обратный вызов.
Я говорю «похоже», потому что в документации обратного вызова ошибки для jQuery.ajax () все еще есть следующее примечание:
источник
Плагин jquery-jsonp jQuery, упомянутый в ответе Хосе Базилио, теперь можно найти на GitHub .
К сожалению, документация несколько спартанская, поэтому я привел простой пример:
$.jsonp({ cache: false, url: "url", callbackParameter: "callback", data: { "key" : "value" }, success: function (json, textStatus, xOptions) { // handle success - textStatus is "success" }, error: function (xOptions, textStatus) { // handle failure - textStatus is either "error" or "timeout" } });
Важно. Включите параметр callbackParameter в вызов $ .jsonp (), иначе я обнаружил, что функция обратного вызова никогда не вставляется в строку запроса вызова службы (текущая с версии 2.4.0 jquery-jsonp).
Я знаю, что это старый вопрос, но проблема обработки ошибок с использованием JSONP до сих пор не решена. Надеюсь, это обновление поможет другим, так как этот вопрос занимает первое место в Google по "обработке ошибок jquery jsonp".
источник
А как насчет прослушивания события onerror сценария? У меня была эта проблема, и я решил ее, исправив метод jquery, в котором был создан тег script. Вот интересный фрагмент кода:
// Attach handlers for all browsers script.onload = script.onreadystatechange = function( _, isAbort ) { if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { cleanup(); // Callback if not abort if ( !isAbort ) { callback( 200, "success" ); } } }; /* ajax patch : */ script.onerror = function(){ cleanup(); // Sends an inappropriate error, still better than nothing callback(404, "not found"); }; function cleanup(){ // Handle memory leak in IE script.onload = script.onreadystatechange = null; // Remove the script if ( head && script.parentNode ) { head.removeChild( script ); } // Dereference the script script = undefined; }
Что вы думаете об этом решении? Может ли это вызвать проблемы с совместимостью?
источник