javascript / jQuery setTimeout - PullRequest
       15

javascript / jQuery setTimeout

0 голосов
/ 26 октября 2009

у меня есть этот код:

$('.myButton').live('click',function(){
    var checkTextValue = setTimeout(function() {
    var textVal = $('p').text();
    if (textVal == 'expectedValue'){
        alert('done');
    } else {
       setTimeout(arguments.callee, 10);
    }
    },10);
 });

когда кнопка нажимается в первый раз, она работает просто отлично, но когда кнопка нажата более чем один раз, предупреждение вызывается n + раз (если я нажимаю еще раз на кнопку, появляется предупреждение -> я нажимаю «ок» "а затем появляется еще одно предупреждение; после этого, если я нажимаю еще раз, 3 предупреждения появляются); Есть ли способ удалить функцию после того, как textVal == «Ожидаемое значение» возвращает истину?

Ответы [ 4 ]

0 голосов
/ 04 июня 2013

Вы можете использовать setInterval() для достижения этой цели, а не setTimeout():

var intervalId = 0;
$('.myButton').live('click', function(){
    if (intervalId != 0) {
        clearInterval(intervalId);
    }
    intervalId = setInterval(function() {
        var textVal = $('p').text();
        if (textVal == 'expectedValue'){
            clearInterval(intervalId);
            intervalId = 0;

            alert('done');
        }
    }, 10);
});

Еще одним преимуществом этого подхода является то, что вы можете определить, щелкнули ли они по нему, и упомянуть, что он уже проверен.

var intervalId = 0;
$('.myButton').live('click', function(){
    if (intervalId != 0) {
        alert('check already in progress... please wait');
        return false;
    }
    intervalId = setInterval(function() {
        var textVal = $('p').text();
        if (textVal == 'expectedValue'){
            clearInterval(intervalId);
            intervalId = 0;

            alert('done');
        }
    }, 10);
});

В качестве альтернативы вы можете запросить их и спросить пользователя, хотят ли они прекратить проверку (в этом случае просто очистите интервал и установите значение intervalId равным 0).

0 голосов
/ 26 октября 2009

В условии else вы просто устанавливаете тайм-аут ... вы также должны обновлять значение вашего «Ожидаемого значения» ... верно?

И return логическое значение соответственно для условного.

Вы можете использовать новый логический флаг ... или использовать существующие значения для той же цели. Дайте мне знать, если вам нужна проработка.

0 голосов
/ 26 октября 2009

Вам необходимо очистить тайм-аут (используя clearTimeout) перед вызовом setTimeout, чтобы предотвратить одновременное выполнение.

0 голосов
/ 26 октября 2009

Вы можете попробовать поставить return false; в конце этой ветви оператора if?

В качестве альтернативы, вы можете просто установить флаг, такой как hasRun = 1, и просто проверить это значение, прежде чем запускать что-либо внутри этой ветви оператора if ...

...