Как прервать загрузку внешнего HTML-ресурса из JavaScript? - PullRequest
2 голосов
/ 25 февраля 2009

Я пишу виджет JavaScript, который предназначен для использования на другом веб-сайте и загружает дополнительные файлы сценариев с моего собственного веб-сайта (что в основном означает отсутствие XHR из-за междоменных ограничений). Теперь я хочу корректно обработать сбои - если не удается загрузить один скрипт, я хочу загрузить скрипт с альтернативного сервера.

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

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

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

Я попытался установить для атрибута src исходного скрипта значение null и даже удалить тег из элемента HEAD с помощью removeNode (), но безрезультатно.

Это все было опробовано в Firefox - я еще не пробовал IE, но решение должно работать на обоих. Я хотел бы услышать любые предложения.

Ответы [ 3 ]

2 голосов
/ 04 марта 2009

К сожалению, отменить запрос на теги невозможно. Исторически браузеры допускают только 2 запроса одновременно к одному имени хоста, поэтому должна быть возможность загрузить второй скрипт с другого сервера.

Вы запускаете загрузку скрипта перед body.onload? Для нормальной загрузки страницы браузер ждет загрузки каждого сценария, прежде чем продолжить, так как сценарии могут изменять документ. Если скрипт не изменяет документ, вы можете использовать атрибут defer, чтобы браузер продолжал отображать документ во время загрузки скрипта.

jQuery имеет несколько открытых запросов на похожую функцию: http://dev.jquery.com/ticket/1863 http://dev.jquery.com/ticket/3442

0 голосов
/ 04 марта 2009

Если вы можете изменить загружаемый скрипт, вы можете добавить туда обратный вызов. Просто установите таймер вверху вашей страницы и очистите его внизу файла скрипта. Таким образом, если ваш скрипт не загружается должным образом, запрос резервного копирования будет выполнен, когда закончится таймер.

В верхней части вашей страницы запустите следующее в блоке встроенного скрипта:

doneLoading = function() {
  clearTimeout(timeout);
}

timeout = setTimeout(function() {
             ... change the .src on the old inline script element here ...
                     }, 15000);

В нижней части вашего внешнего файла JavaScript просто наберите doneLoading(). Если ваш первоначальный запрос занимает более 15 секунд, будет запущен новый запрос к серверу резервного копирования. Я не думаю, что вы можете прервать первоначальный запрос, но запрос на резервное копирование будет выполнен как ожидалось.

0 голосов
/ 25 февраля 2009

Я думаю, вы, возможно, захотите структурировать свой виджет, чтобы использовать XMLHttpRequest, который можно прервать с помощью window.setTimeout ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...