Я пытаюсь ожидать и затем получить сообщение, когда все изображения в массиве завершили загрузку (использующий .complete) на ответ здесь. Как таковой я настроил бесконечный цикл как ниже. однако, когда я выполняю это, я получаю ошибку, что checkForAllImagesLoaded () не определяется. Этот код выполняется через bookmarklet и как таковой, он все обернут в конструкции анонимной функции (как ниже). Если я переопределяю свою функцию и переменную за пределами той конструкции, она работает. Но это, кажется, плохой способ записать bookmarklet. Как я могу зафиксировать это так, это все еще распознает функцию после setTimeout?
(function() {
//var images = array of images that have started loading
function checkForAllImagesLoaded(){
for (var i = 0; i < images.length; i++) {
if (!images[i].complete) {
setTimeout('checkForAllImagesLoaded()', 20);
return;
}
}
}
checkForAllImagesLoaded();
})();
Удалите вызов функции и удалите кавычки. Если вы не поместите кавычки, setTimeout
получит прямую ссылку на функцию, которую он может вызвать позже. Однако, если внутри строки, такой как «checkForAllImagesLoaded»
или «checkForAllImagesLoaded ()»
, тогда он выполнит переданный код по истечении времени ожидания.
В это время будет выполняться поиск checkForAllImagesLoaded
в глобальном объекте (окне), но он там не определен, причина в том, что вы получаете ошибку undefined
.
Ваш код заключен в самовызывающуюся анонимную функцию, и вне ее checkForAllImagesLoaded
не существует. Поэтому передайте прямую ссылку на функцию в вызове setTimeout вместо строки.
setTimeout(checkForAllImagesLoaded, 20);
setTimeout
может быть вызван либо функцией (и необязательными аргументами), либо строкой, содержащей код JavaScript:
var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);
С помощью кода вы устанавливаете количество тайм-аутов для каждого звонка. Вам следует просто установить тайм-аут один раз для каждого вызова checkForAllImagesLoaded ()
и, возможно, увеличить период ожидания (20 миллисекунд - это слишком быстро). Например.
function checkForAllImagesLoaded() {
var allComplete=true;
var i=0;
while (i<images.length && allComplete) {
allComplete=images[i++].complete;
}
if (!allComplete) { // Any incomplete images?
setTimeout('checkForAllImagesLoaded()',1000); // Wait a second!
}
}
Удалите () в вызове settimeout.
setTimeout ('checkForAllImagesLoaded', 20);