JavaScript setTimeout не работает

0

Я не понимаю. В отладчике Chrome он работает, но когда я отключу его и обновляю страницу, мой div будет чистым.

<script type="text/javascript">
  $(document).ready(function() {
    function banner_change(span) {
      if ($(span).hasClass('show')) {
        $(span).removeClass('show');
      }
    }

    $('div#spec_banner span').each(function () { 
      if (!$(this).hasClass('show')) {
        $(this).addClass('show')
      }
      setTimeout(banner_change(this), 5000);
    });
  });
</script>

Спасибо, что ответили.

  • 0
    Я понимаю проблему. setTimer отправляет функцию в конец скрипта, поэтому jquery.each не работает.
Теги:
timer
settimeout
web

4 ответа

3
Лучший ответ

несколько проблем, синтаксис и область действия

При использовании setTimeout без анонимной функции синтаксис:

setTimeout(banner_change, 5000); /* no () */

Чтобы передать аргументы, выполните следующие действия:

setTimeout(function(){
      banner_change(this);
}, 5000);

Но также, обратно в область видимости, this потеряло контекст внутри setTimeout (теперь это скорее window), поэтому необходимо назначить переменную вне setTimeout

$('div#spec_banner span').each(function () { 
  if (!$(this).hasClass('show')) {
    $(this).addClass('show')
  }
    var span =this
  setTimeout(function(){
      banner_change(span);
  }, 5000);
});
  • 0
    Технически это не синтаксическая ошибка - он будет хорошо оцениваться и продолжит делать свое дело - он, безусловно, не будет работать так, как ожидалось.
1

Это проблема:

  setTimeout(banner_change(this), 5000);

Вы на самом деле вызываете banner_change здесь - попробуйте

  setTimeout(function(){
      banner_change('div#spec_banner span');
  }, 5000);

Звонок, который вы изначально делали, сразу же banner_change и передавал возвращаемое значение setTimeout

0

получить функцию из документа, готового к ее правильной работе

  • 0
    Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
  • 0
    это ответ! проблема в функции banner_change, которая должна быть определена вне функции готовности документа
0

вам нужно передать результат функции ссылки не на функцию вызова функции.

setTimeout( $.proxy(banner_change, this), 5000);

$.proxy для ссылки на функцию гарантирует, что ваша функция будет вызвана с помощью этого "контекста".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню