Странная проблема с setTimeout () в Google Chrome - PullRequest
8 голосов
/ 24 сентября 2010

Я искал здесь и нашел быстрое решение для вызова действия, когда пользователь бездействует на странице. Это в основном хорошо работает во всех браузерах.

Но когда я использую предупреждение или диалоговое окно подтверждения на странице, в Google Chrome возникает странная проблема.

После того, как окно предупреждения или подтверждения исчезает (нажата OK, Отмена или Перекресток), функция ожидания неожиданно работает.

  • После того, как окно подтверждения или оповещения исчезло, которое появилось после щелчка ссылки, я сразу получил окно «3 секунды прошло»

Проверено на FF, IE и Chrome (последняя версия). Это просто происходит в Chrome.

Мой код здесь: http://jsbin.com/ifule3

  window.onload = idleTimer;
  function idleTimer() {
    var idleDuration;
    document.onmousemove = idleReset;
    function  idleReset() {
      if (idleDuration) {
        clearTimeout(idleDuration);
        idleDuration = 0;
      }
      idleDuration = setTimeout(function() {
        alert('3 seconds passed.');
      }, 3000)
    }
  };

<a onclick="if(confirm( '?' )) { alert('Ok Pressed.') } else { return false; };">First Link!</a>
<a onclick="alert('test');" >Second Link!</a>

Кажется, моего объяснения недостаточно: /

Я изменил код с помощью jQuery;

jQuery(document).ready(function() {
    var idleDuration;
    jQuery(document).mousemove(function() {
        if (idleDuration) {
            clearTimeout(idleDuration);
            idleDuration = 0;
        }

        idleDuration = setTimeout(function() {
            someIdleAction();
            window.location = 'some url';
        }, 3000)
    })
});

Когда я размещаю этот код на своей странице. Он работает как шарм. Я открываю страницу, делаю какие-то действия с мышью или нет, затем через 3 секунды, не двигая мышь, я получил предупреждение о простое. Это то, что мне нужно.

Когда я помещаю ссылку, которая просто вызывает окно предупреждения и щелкаю по нему, появляется окно предупреждения. Затем я закрываю коробку и получаю предупреждение о простое, которое «прошло 3 секунды».

    <a onclick="if(confirm( 'Are you OK?' )) { alert('Nice.') } else { return false; };">First Link!</a>
    <a onclick="alert('An alert.');" >Second Link!</a>

Это происходит только в Google Chrome. С IE и FF все нормально. Увеличение таймаута ничего не меняет.

1 Ответ

1 голос
/ 24 сентября 2010

Если вы получаете коробку сразу после отклонения предупреждения или подтверждения, это не странно, это нормально.confirm и alert полностью прекращают выполнение JavaScript.Следующий вызов таймера будет стоять в очереди, ожидая, когда переводчик снова станет доступным, поэтому я не удивлюсь, если я укажу окно с сообщением.Это единственное поведение, которое вы видите, это проблема?

...