Я делаю кучу json-запросов с динамическими тегами сценариев. Можно ли обнаружить, есть ли ошибка в запросе (например, ошибка 503, ошибка 404) и что-то запустить при обнаружении ошибки?Теги динамического сценария для запросов JSON ... обнаружение ошибки XXX?
ответ
вместо этого использовать ajax. AFAIK не существует способа определить, загружен ли тег скрипта или нет, а если нет, то почему он не загружается. Используя ajax, вы можете загрузить json, и он скажет вам, почему он не загружается.
Используя библиотеку как JQuery это становится очень просто:
$.ajax({
type: "GET",
url: "test.js",
dataType: "script",
error: function(xhr, error, exception){
alert(xhr.status); //Will alert 404 if the script does not exist
}
});
Но ... но ... есть способ. –
AFAIK, нет доступа к коду состояния какого-либо внешнего актива, загруженного из документа (например, сценарий, стиль или изображение). Даже обнаружение ошибки (через, скажем, onerror
обработчик событий) не так широко поддерживается в браузерах.
Если все, что вы загружаете, находится под SOP, используйте XHR, который дает вам доступ к заголовкам ответов. В противном случае вы можете попробовать изучить недавно введенный X-domain XHR.
Это, кажется, решение. Если бы вы добавили текст, объясняющий его и/или включив в ответ образец кода с ссылочной страницы, вы можете получить некоторые проценты и вознаградить принятый ответ. –
ссылка объясняет это в значительной степени, не хочу загрязнять пространство копией/пастой, увеличивая энтропию lol. – Kane
Я не считаю эту ссылку актуальной. Связанная статья посвящена обнаружению успешной загрузки, а не обнаружению ошибок. –
Если вы хотите обнаружить ошибки, послушайте событие error
и сравните свойство ошибки fileName
ошибки с именем файла скрипта. Если они совпадают, вы обрабатываете ошибку. Дело в том, что я считаю, что свойство fileName
- это Firefox и Opera. Большинство браузеров, которые имеют стек для ошибок, также могут имитировать это поведение.
Вот пример, по просьбе Эрика Bréchemier:
var getErrorScriptNode = (function() {
var getErrorSource = function (error) {
var loc, replacer = function (stack, matchedLoc) {
loc = matchedLoc;
};
if ("fileName" in error) {
loc = error.fileName;
} else if ("stacktrace" in error) { // Opera
error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer);
} else if ("stack" in error) { // WebKit
error.stack.replace(/at (.*)/gm, replacer);
loc = loc.replace(/:\d+:\d+$/, "");
}
return loc;
},
anchor = document.createElement("a");
return function (error) {
anchor.href = getErrorSource(error);
var src = anchor.href,
scripts = document.getElementsByTagName("script");
anchor.removeAttribute("href");
for (var i = 0, l = scripts.length; i < l; i++) {
anchor.href = scripts.item(i).src;
if (anchor.href === src) {
anchor.removeAttribute("href");
return scripts.item(i);
}
}
};
}());
как вы можете это сделать? любой пример? –
Эрик: Я добавил пример. –
Я предполагаю, что вы хотите, чтобы это работать кросс-домен, поэтому вы не можете использовать XHR?
Попробуйте создать два тега сценария для каждого запроса, первый - ваш стандартный запрос JSONP, второй - в основном обработчик ошибок.
Если выполняется первый скриптовый тег, очистите обработчик ошибок в своем обратном вызове. Но если первый получает 404, будет выполняться обработчик ошибок во втором теге скрипта.
Возможно, вы также захотите установить тайм-аут, чтобы справиться с медленным ответом JSONP.
Если вам нужно перекрещивать домены (и нужно, чтобы страница работала переносимо), вам нужно использовать теги динамического сценария.
Если у вас есть доступ к удаленному серверу, вы можете передать код ошибки, с сервера, и есть возвращение страницы сервера 200.
Имеете ли вы доступ или нет, вы можете использовать SetTimeout при создании тег сценария, передающий функцию, которая вызовет ошибку, если она истечет до вызова обработчика jsonp. Убедитесь, что обработчик jsonp прерывается, если обработчик ошибок был вызван.
Вам нужно будет отслеживать каждый запрос через глобальную коллекцию, но вы сможете отменить и подсчитать запросы. Это похоже на то, как объекты XHR управляются библиотекой типа jQuery.
Если вы используете jQuery, ознакомьтесь с jQuery-JSONP, который является плагином jQuery, который выполняет довольно приличную работу по установке вставки для вас, а также для обнаружения ошибок выборки.
Цитирования со страницы проекта, JQuery-JSONP характеристики:
- исправления ошибок в случае отказа сети или плохо сформированных ответов JSON,
- точного контроля над обратным вызовом именованием и как она передается в URL-адрес,
- несколько запросов с тем же именем обратного вызова, работающих одновременно,
- два механизма кэширования (на основе браузера и на основе страницы),
- возможность вручную ABO rt запрос, как и любой другой запрос AJAX,
- механизм тайм-аута.
Но не существует способа узнать фактический код состояния неудавшегося запроса, есть ли? – kangax
- 1. Загрузка динамического сценария и ошибки в Firefox
- 2. обнаружение ошибки для $ q.all
- 3. Теги сценария в Express
- 4. ASP.NET Обнаружение запроса динамического файла
- 5. Ошибки для фонового сценария
- 6. Обнаружение изменения динамического сегмента
- 7. Разбор для динамического json
- 8. Не содержит определения для ошибки XXX
- 9. SQL запросов для конкретного сценария
- 10. Динамического создание ссылки сценария
- 11. Обнаружение динамического класса в DOM
- 12. Обнаружение фонового сценария выгрузки
- 13. Как удалить теги сценария
- 14. Динамического создания ввода-теги только для чтения
- 15. Ошибки Oracle для запросов
- 16. CSV для JSON сценария
- 17. Диспетчер динамического сценария для Python Behave
- 18. SQL - Теги поисковых запросов
- 19. JavaScript: обнаружение запросов AJAX
- 20. использовать теги Attr для json?
- 21. JSON схемы для динамического массива
- 22. Сериализация динамического свойства для JSON
- 23. обнаружение JSON, загруженное браузером
- 24. XPath обнаружение корневого элемента теги
- 25. XML и JSON-теги для структуры Golang?
- 26. Использование медиа-запросов для динамического содержимого изображения
- 27. создание динамического linq для sql запросов
- 28. теги сценария встроить дротик в HTML
- 29. Откуда берутся теги случайного сценария?
- 30. Обнаружение перегрузки сервера для ограничения запросов mysql
Как вы делаете эти запросы JSON? –
Я использую document.createElement ('script'), меняя src элемента на нужный URL, а затем добавляя этот элемент в DOM. Я попытался поставить appendChild в блок try/catch, но это ничего не делает. – rawrrrrrrrr
Можете ли вы обновить вопрос с помощью фрагмента кода или сообщения на http://jsbin.com/, это помогает для полноты? –