SetTimeout делает многократный вызов функции, как этого избежать - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть 2 функции setTimeout, которые вызывают 2 разные функции, но в некоторых случаях вызов функции из setTimeout происходит несколько раз, не зная, как решить эту проблему, любая помощь будет принята.Я использую этот скрипт для поиска времени простоя пользователя на веб-странице и обновляю время простоя до своей БД.

window.onmousemove = resetTimer('y');
window.onload = resetTimer('y');
window.onmousemove = resetTimer('y');
window.onmousedown = resetTimer('y');
window.onmouseup = resetTimer('y');
window.ontouchstart = resetTimer('y');
window.onclick = resetTimer('y');
window.onkeypress = resetTimer('y');
window.onscroll = resetTimer('y');
var t;

function resetTimer(v) {
  clearTimeout(t);
  if (v == 'y') {
    t = setTimeout(Ytimepop, 4000);
  }
  if (v == 'z') {
    t = setTimeout(Ztimepop, 5000);
  }
}

function Ytimepop() {
  // ajax code
  resetTimer('z');
}

function Ztimepop() {
  // ajax code
}

При наведении мыши на окно и других событиях я вызывал функцию, которая будет вызывать resetTimer ('y') и начинать вычислять таймер Ytimepop, а функция вызывается несколько раз.для таймера Ztimepop тоже.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Проблема возникает в этом фрагменте кода:

window.onmousemove = resetTimer('y');

По сути, то, что вы делаете, сродни этому:

let returnValue = resetTimer('y'); // resetTimer executed, returns `undefined`
window.onmousemove = returnValue; // Also `undefined`

После этого первоначального вызова ваш resetTimerникогда не выполняется снова, не говоря уже о mousemove.Поэтому просто оберните его другой функцией для вызова resetTimer, либо традиционным способом:

window.onmousemove = function(){ resetTimer('y'); };

, либо с новым arrow function:

window.onmousemove = () => resetTimer('y');
0 голосов
/ 25 сентября 2018

вы должны использовать

var t;
window.onmouseover = function() {
  resetTimer('y');
}
function resetTimer(v) {
    clearTimeout(t);
    // --- rest of your code                     
}

Не ясно, хотите ли вы использовать onmouseover или onmousemove

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