Сам вызов функции не работает (бесконечный цикл, Javascript) - PullRequest
8 голосов
/ 30 июня 2010

Я пытаюсь подождать, а затем получить сообщение, когда все изображения в массиве завершили загрузку (с использованием .complete), согласно ответу здесь Поэтому я создал бесконечный цикл, как показано ниже. Однако, когда я запускаю это, я получаю сообщение об ошибке, что checkForAllImagesLoaded () не определен. Этот код выполняется через букмарклет, и поэтому он весь заключен в анонимную конструкцию функции (как показано ниже). Если я переопределю свою функцию и переменную вне этой конструкции, это сработает. Но это плохой способ написать букмарклет. Как я могу это исправить, чтобы он все еще распознавал функцию после 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();

})();

Ответы [ 3 ]

8 голосов
/ 30 июня 2010

Удалить вызов функции и убрать кавычки. Если вы не ставите кавычки, 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);
1 голос
/ 30 июня 2010

С помощью вашего кода вы устанавливаете количество тайм-аутов на звонок.Вы должны просто установить тайм-аут один раз на 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!
  }
}
1 голос
/ 30 июня 2010

Удалить () в вызове settimeout.

setTimeout('checkForAllImagesLoaded', 20);

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