Я использую JavaScript для включения некоторого содержания, поданного из php файла на другом сервере. Однако этот другой сервис может иногда становиться облупленным и или требоваться много времени для загрузки или не загрузится вообще.
Существует ли путь в JS, чтобы попытаться получить внешние данные для x числа секунд прежде, чем перестать работать и отобразиться, "попробуйте еще раз" сообщение?
<script type="text/javascript" src="htp://otherserver.com/myscript.php"></script>
Пара вопросов: вы можете использовать пороги таймаута с XMLHttpRequest
(также известный как ajax), но тогда, так как он находится на othererver.com
, вы не можете использовать XMLHttpRequest
(и поддерживать все браузеры A-класса) из-за ограничения политики Same Origin Policy restriction.
Если сценарий вводит любое глобальное имя (например, имя любой переменной, имя функции и т.д.) Вы можете попробовать setTimeout
, чтобы продолжить проверку:
var TIMELIMIT = 5; // seconds until timeout
var start = new Date;
setTimeout(function() {
// check for something introduced by your external script.
// A variable, namespace or function name here is adequate:
var scriptIncluded = 'otherServerVariable' in window;
if(!scriptIncluded) {
if ((new Date - start) / 1000 >= TIMELIMIT) {
// timed out
alert("Please try again")
}
else {
// keep waiting...
setTimeout(arguments.callee, 100)
}
}
}, 100)
Проблема, как я вижу, вы не можете отменить запрос на сценарий. Пожалуйста, кто-нибудь поправьте меня, если я ошибаюсь, но удаление из DOM все равно оставит запрос браузера для ресурса активным. Поэтому, хотя вы можете обнаружить, что загрузка скрипта занимает больше x секунд, вы не можете отменить запрос.
Я думаю, что вам не повезло.
.Единственный способ сделать это - создать прокси на другом (с поддержкой PHP) сервере, который будет получать данные за вас, но остановится, когда будет достигнут определенный таймаут (и он может просто вернуть пустой результат).
Это чисто, чисто теоретически:
тэги могут быть динамически вставлены в DOM, после чего скрипт будет извлечен и обработан. Динамическое впрыскивание тегов в скрипт - это то, как некоторые достигают кросс-доменного "AJAX".
Я бы представил себе, что вы можете объявить глобальную переменную var hasLoaded = false;
. В конце скрипта, который вы пытаетесь загрузить, вы можете установить эту переменную в true hasLoaded=true;
. После вставки тега скрипта в DOM вы можете запустить функцию setTimeout(), чья функция обратного вызова проверяет, установлено ли значение "hasLoaded" в true. Если нет, то можно предположить, что скрипт еще не полностью загрузился в браузер. Если да, то можно предположить, что он загрузился полностью.
Опять же, это теоретически, но если вы проверите его, то обязательно доложите об этом, мне очень любопытно.
.Я думаю, что единственный способ сделать это - это взять содержимое файла через ajax, а затем установить таймер. Если запрос завершится раньше таймера, вы можете оценить respons с помощью eval (это все равно не лучшее решение), иначе вы можете остановить ajax запрос и написать сообщение об ошибке.
.