Я динамически добавляю <script>
теги к странице <head>
, и я хотел бы иметь возможность узнать, не удалось ли каким-либо образом загрузить - 404, ошибка скрипта в загруженном скрипте и т. Д.
В Firefox это работает:
var script_tag = document.createElement('script');
script_tag.setAttribute('type', 'text/javascript');
script_tag.setAttribute('src', 'http://fail.org/nonexistant.js');
script_tag.onerror = function() { alert("Loading failed!"); }
document.getElementsByTagName('head')[0].appendChild(script_tag);
Однако это не работает в IE или Safari.
Кто-нибудь знает, как заставить эту работу работать в других браузерах, кроме Firefox?
(Я не думаю, что решение, требующее размещения специального кода в файлах .js, является хорошим. Оно неэлегантно и негибко.)
javascript
onerror
script-tag
Дэвид
источник
источник
if
+ опрос - это досадная ерунда, которую я не хочу помещать во все JS.Ответы:
Для тега сценария нет события ошибки. Вы можете сказать, когда он был успешным, и предположить, что он не загрузился после тайм-аута:
источник
Если вас интересуют только браузеры html5, вы можете использовать событие ошибки (поскольку это только для обработки ошибок, должно быть нормально поддерживать это только в браузерах следующего поколения для KISS IMHO).
Из спецификации:
~
Это означает, что вам не нужно проводить опрос, подверженный ошибкам, и вы можете комбинировать его с атрибутами async и defer, чтобы убедиться, что сценарий не блокирует рендеринг страницы:
Подробнее на http://www.w3.org/TR/html5/scripting-1.html#script
источник
<script src="nonexistent.js" onerror="alert('error!')"></script>
скрипкуUncaught SyntaxError: Unexpected token '<'
(в последней версии Chrome)<script src="nonexistent.js" onerror="alert('error!')"></script>
должен быть в вашем HTML-файле, а не в JS.Скрипт от Эрвинуса отлично работает, но не очень четко написан. Я взял на себя смелость очистить его и расшифровать, что он делал. Я внес эти изменения:
prototype
.require()
использует переменную аргументаalert()
сообщений не возвращаются по умолчаниюЕще раз спасибо Erwinus, сама функциональность на высоте.
источник
мое рабочее чистое решение (2017)
Как указал Мартин, использовал это так:
ИЛИ
источник
loaderScript("myscript.js").then(() => { console.log("loaded"); }).catch(() => { console.log("error"); });
Я знаю, что это старая ветка, но у меня есть для вас хорошее решение (я думаю). Он скопирован из моего класса, который обрабатывает все AJAX.
Если скрипт не может быть загружен, он устанавливает обработчик ошибок, но когда обработчик ошибок не поддерживается, он возвращается к таймеру, который проверяет наличие ошибок в течение 15 секунд.
источник
Чтобы проверить,
nonexistant.js
не вернул ли javascript ошибку, вам нужно добавить переменную внутриhttp://fail.org/nonexistant.js
like,var isExecuted = true;
а затем проверить, существует ли она при загрузке тега script.Однако, если вы хотите только проверить, что
nonexistant.js
возвращается без 404 (что означает, что он существует), вы можете попробовать сisLoaded
переменной ...Это покроет оба случая.
источник
Я надеюсь, что это не будет отвергнуто, потому что в особых обстоятельствах это самый надежный способ решить проблему. Каждый раз, когда сервер позволяет вам получить ресурс Javascript с помощью CORS ( http://en.wikipedia.org/wiki/Cross-origin_resource_sharing ), у вас есть богатый набор возможностей для этого.
Использование XMLHttpRequest для извлечения ресурсов будет работать во всех современных браузерах, включая IE. Поскольку вы хотите загрузить Javascript, вам в первую очередь доступен Javascript. Вы можете отслеживать прогресс с помощью readyState ( http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener ). Наконец, как только вы получите содержимое файла, вы можете выполнить его с помощью eval (). Да, я сказал eval - потому что с точки зрения безопасности это не отличается от обычной загрузки скрипта. Фактически, Джон Ресиг предлагает аналогичную технику для создания более удобных тегов ( http://ejohn.org/blog/degrading-script-tags/ ).
Этот метод также позволяет отделить загрузку от eval и выполнять функции до и после выполнения eval. Это становится очень полезным при параллельной загрузке скриптов, но при их оценке один за другим - браузеры могут легко это сделать, когда вы размещаете теги в HTML, но не позволяют вам, добавляя скрипты во время выполнения с помощью Javascript.
CORS также предпочтительнее JSONP для загрузки скриптов ( http://en.wikipedia.org/wiki/XMLHttpRequest#Cross-domain_requests ). Однако, если вы разрабатываете свои собственные сторонние виджеты для встраивания в другие сайты, вам следует фактически загрузить файлы Javascript из вашего собственного домена в свой собственный iframe (опять же, используя AJAX).
Коротко:
Попробуйте посмотреть, сможете ли вы загрузить ресурс с помощью AJAX GET
Используйте eval после успешной загрузки
Чтобы улучшить это:
Проверьте отправленные заголовки управления кешем
Посмотрите, как иначе кэшировать контент в localStorage, если вам нужно
Посмотрите "деградирующий javascript" Resig, чтобы получить более чистый код.
Посмотрите require.js
источник
Этот трюк у меня сработал, хотя я признаю, что это, вероятно, не лучший способ решить эту проблему. Вместо того, чтобы пытаться это сделать, вы должны увидеть, почему не загружаются javascripts. Попробуйте сохранить локальную копию сценария на своем сервере и т. Д. Или обратитесь к стороннему поставщику, откуда вы пытаетесь загрузить сценарий.
В любом случае, вот обходной путь: 1) Инициализируйте переменную как false 2) Установите ее в true, когда загружается javascript (с использованием атрибута onload) 3) проверьте, является ли переменная истинной или ложной после загрузки тела HTML
источник
Вот еще одно решение на основе JQuery без таймеров:
Благодаря: https://stackoverflow.com/a/14691735/1243926
Пример использования (исходный образец из документации JQuery getScript ):
источник
cache:true
для вызова $ .getScript (по умолчанию он отключен). Таким образом, для большинства запросов он автоматически использует кешированную версию для вызова getScript (экономя время ожидания)Это можно безопасно сделать с помощью обещаний
и использовать вот так
источник
Причина, по которой он не работает в Safari, заключается в том, что вы используете синтаксис атрибутов. Это будет работать нормально:
... кроме IE.
Если вы хотите проверить успешное выполнение сценария, просто установите переменную с помощью этого сценария и проверьте, задана ли она во внешнем коде.
источник
<script>
. Если вы попытаетесь добавить его раньше, вы получите сообщение об ошибке, что тег не существует, а если вы добавите его после, то сценарий уже запущен и инициировал свои события. Единственный способ - это искать побочные эффекты, вызванные скриптом.onerror Событие
* Обновление от августа 2017 г .: onerror запускается Chrome и Firefox. onload запускается Internet Explorer. Edge не запускает ни ошибку, ни загрузку. Я бы не стал использовать этот метод, но в некоторых случаях он может работать. Смотрите также
<link> onerror не работает в IE
*
Определение и использование Событие onerror запускается, если возникает ошибка при загрузке внешнего файла (например, документа или изображения).
Совет: При использовании на аудио / видео носителях, связанные события, которые происходят, когда есть какие-то нарушения в процессе загрузки мультимедиа, включают:
В HTML:
element onerror = "myScript">
В JavaScript с помощью метода addEventListener ():
object.addEventListener («ошибка», myScript);
Примечание: Метод addEventListener () не поддерживается в Internet Explorer 8 и более ранних версиях.
пример Выполните JavaScript, если при загрузке изображения возникает ошибка:
img src = "image.gif" onerror = "myFunction ()">
источник
Было предложено установить тайм-аут, а затем предполагать сбой нагрузки после тайм-аута.
Проблема с этим подходом в том, что предположение основано на случайности. По истечении вашего тайм-аута запрос все еще ожидает обработки. Запрос ожидающего скрипта может загрузиться даже после того, как программист предположил, что загрузки не произойдет.
Если запрос может быть отменен, программа может ждать некоторое время, а затем отменить запрос.
источник
Вот как я использовал обещание для обнаружения ошибок загрузки, возникающих в объекте окна:
источник
Что ж, единственный способ, которым я могу делать все, что ты хочешь, довольно уродлив. Сначала выполните вызов AJAX, чтобы получить содержимое файла Javascript. Когда это будет завершено, вы можете проверить код состояния, чтобы решить, было ли это успешным или нет. Затем возьмите responseText из объекта xhr и оберните его в try / catch, динамически создайте тег скрипта, а для IE вы можете установить свойство text тега скрипта на текст JS, во всех других браузерах вы должны иметь возможность добавить текстовый узел с содержимым в тег скрипта. Если есть какой-либо код, который ожидает, что тег сценария действительно будет содержать местоположение файла src, это не сработает, но в большинстве ситуаций должно подойти.
источник