Обработка ошибок в динамической загрузке JS

Я загружаю файл JS, необходимый только для одной части моей веб-страницы, только когда пользователь переходит на эту вкладку на странице.

var scriptFile = document.createElement("script");
scriptFile.setAttribute("type", "text/javascript");
scriptFile.setAttribute("src", scriptURL);

Я пытаюсь найти механизм обработки ошибок для этой динамической загрузки, чтобы я мог показать сообщение об ошибке, если время загрузки JS истекло или JS недоступен в месте, указанном в URL.

Вот как я пытаюсь реализовать обработку ошибок (для IE):

scriptFile.onreadystatechange = function() { // For IE
    if (this.readyState == 'complete' || this.readyState == 'loaded') {
        // Display content in tab
    } else {
        // Display error message
    }
}

Это вызывает одну проблему. Когда все в порядке, и JS присутствует, как и ожидалось, сначала я получаю сообщение об ошибке, а затем правильный контент.

После некоторого мозгового штурма я обнаружил, что readyState меняется сначала с «неинициализированного» на «загрузочный», а затем на «загруженный». Когда состояние находится в состоянии «загрузка», отображается сообщение об ошибке. После этого состояние меняется на «загружен», и в этот момент отображается контент.

Любые идеи, как справиться с этим, чтобы ошибка не отображалась изначально?

5.11.2009 11:06:53
Обновление: мне нужно отобразить сообщение об ошибке, даже если JS отсутствует по указанному URL. Даже в случае ошибки 404 для JS состояние переходит в «завершено», и страница пытается отобразить данные… показывая ошибку JS. Как я могу справиться с этим?
Phanindra K 5.11.2009 11:35:03
4 ОТВЕТА
РЕШЕНИЕ

Так как нет "ой я умерла!" состояние, вы не можете отображать сообщения об ошибках.

редактировать: удалил код, так как я считаю, что вы не можете сделать это. С помощью запроса AJAX вы можете проверить ответ и посмотреть, является ли это 404, но вы не можете сделать это с помощью тега script.

edit2: подумав, почему вы не получите скрипт через AJAX и не вставите '<script type = "text / javascript">' + responseText + '</ script>' в document.body?

Чтобы проверить, сработал ли запрос AJAX, проверьте свойство status объекта XMLHTTPRequest. Если это 404, то это 404.

Кроме того, вы не должны делать это вручную. Я всегда советую использовать Prototype или jQuery. Поскольку я был испорчен Prototype, я не должен пытаться объяснить, как проверить статус запроса. Почему бы вам не спросить, как обрабатывать запросы AJAX в другом вопросе здесь? Профессионалы обязательно расскажут вам, как справляться со всеми видами сбоев, а не только с 404.

3
5.11.2009 11:53:10
Хе-хе .. весь смысл моих упражнений заключается в отображении сообщений об ошибках. :)
Phanindra K 5.11.2009 11:30:58
Я знаю, но вы не можете сказать, если сценарий потерпел неудачу. По крайней мере, моя версия не сдается после первого изменения объекта.
Kaze no Koe 5.11.2009 11:34:01
Пожалуйста, проверьте мое обновление. Мне нужно обработать случай, когда JS тоже не загружался (HTTP 404).
Phanindra K 5.11.2009 11:38:24
Итак, я загружаю содержимое JS с помощью вызова AJAX и загружаю его тело документа, а? Стоит попробовать. Извините за то, что я нуб AJAX, но как вы можете проверить, есть ли статус 404?
Phanindra K 5.11.2009 11:43:52
Вы проверяете заголовки ответа. Позвольте мне найти некоторые документы, которые вы можете использовать.
Kaze no Koe 5.11.2009 11:47:59

как насчет того, чтобы иметь одну (глобальную) переменную для проверки, загружена ли она (например, скрипт установит ее после завершения загрузки), а затем установить другую функцию (уже на странице до функции загрузки) с таймером для проверки этой переменной (например, 5 секунд задержка?)

если переменная не установлена ​​(по истечении заданного промежутка времени), отобразить ошибку пользователю.

1
5.11.2009 11:15:44
Но это означает, что вы можете позволить скрипту загрузить только 5 секунд; после того, как они прошли, если он все еще кодирует, вы по-прежнему отображаете сообщение об ошибке. Что делать , если модем пользователя сильно загружен из - за сильного потокового хардкор порно или очень большое количество запросов на LOLcats?
Kaze no Koe 5.11.2009 11:31:35
Вы можете сделать это 10, что угодно :-)
dusoft 5.11.2009 11:36:06
Знаешь, Лолкэтс может быть очень тяжелым. Они едят много чизбургерз. Серьезно, я не согласен. Я думаю, что фиксированный таймаут неправильный.
Kaze no Koe 5.11.2009 11:41:20
Я понимаю вашу озабоченность, но, как вы сказали выше, другого решения не существует, так что это всего лишь обходной путь.
dusoft 5.11.2009 13:26:26

Я думаю, вам нужно удалить «else», так как оно всегда будет проходить через это «загруженное» состояние, будет ли оно работать или нет, поэтому ветвь «else» не делает ничего полезного.

Вместо этого установите тайм-аут.

var scriptTimer = setTimeout(function() {
  // show error message
  // (should ideally precede with a check the content hasn't
  // been displayed, in case of race condition)
});
scriptFile.onreadystatechange = function() { // For IE
    if (this.readyState == 'complete' || this.readyState == 'loaded') {
       clearTimeout(scriptTimer);
       // now display content in tab
    }
}
1
5.11.2009 11:16:46
Что произойдет, если даже после тайм-аута скрипт не загрузится? Как мне справиться с этим?
Phanindra K 5.11.2009 11:29:57
Вы показали сообщение об ошибке; больше нечего делать Если вы хотите, вы можете попробовать еще несколько раз, то есть начать со счетчика «var scriptAttempts = 3», и попытаться снова загрузить скрипт из обработчика setTimeout. Каждый раз, когда вы запускаете функцию для загрузки scrpt, она проверяет, если scriptAttempts> 0, и уменьшает значение scriptAttempts, пока не сдается и не показывает сообщение об ошибке. Я бы также показал индикатор прогресса, если бы вы все это делали, так как задержка может быть довольно большой.
mahemoff 5.11.2009 13:40:54

РЕДАКТИРОВАТЬ: мой метод был неправильным - используйте AJAX, как предложил Kaze

0
5.11.2009 11:50:42
Если он не «завершен» или «загружен», как он не может быть «загрузкой»?
Kaze no Koe 5.11.2009 11:28:16
Так как он отображал сообщение об ошибке в другой части, я предположил, что будет какое-то состояние «ошибки», которое он искал - погуглил и обнаружил, что это не работает таким образом. Я думаю, что загрузка AJAX и проверка на 404 - это путь.
Amarghosh 5.11.2009 11:49:09