Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   как остановить таймер первого вызова при втором вызове (https://javascript.ru/forum/events/52151-kak-ostanovit-tajjmer-pervogo-vyzova-pri-vtorom-vyzove.html)

Tecvid 05.12.2014 20:34

как остановить таймер первого вызова при втором вызове
 
есть такая ситуция:

function doSmth(arg1, arg2, callback) {
    // тут какие то действия
    if (callback) setTimeout(callback, 7000);
}

elem.onclick = function () {
    doSmth(arg1, arg2, function() {
        anotherElem.style.display = "none";
    });
};

elem2.onclick = function () {
    doSmth(arg1, arg2, function() {
        elemElem.style.display = "none";
    });
};


если кликнуть первый элемент, то через 7 секунд другой элемент должен исчезнуть, а если кликнуть второй элемент, то опять же тот самый другой элемент должен исчезнуть через 7 секунд, но если второй элемент был нажат до того как таймер первого вызова сработал, то второй таймер игнорируется (ну или мне так кажется), так как другой элемент исчезает через 7 секунд после клика первого, а надо чтобы исчез через 7 секунд после клика по второму, как бы клик по второму элементу увеличивает жизнь ещё на 7 секунд :) если опять нажать первый либо второй, то ещё на 7 секунд, и т д, пока ничего не кликнется и другой элемент исчезнет

я сделал так, через id, но пришлось использовать глобальную переменную:
function doSmth(arg1, arg2, callback) {
    if (window.timer) clearTimer(timer);
    // тут какие то действия
    if (callback) timer = setTimeout(callback, 7000);
}

можно ли этот же результат как-то получить бнз использования глобальной переменной?

Cuntmann 07.12.2014 17:48

извращение, конечно, но:

<!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>WTF</title>
 <style>
 body{text-align:center;font-family:Verdana,Helvetica;font-size:12px;color:#000;background-color:#fff;margin-top:250px;}
 input{margin-left:50px;margin-right:50px;cursor:pointer;letter-spacing:1px;font-weight:bold;border:none;background-color:transparent;}
 #elem{margin-bottom:50px;}
 </style>
 <script>
function _(id){return document.getElementById(id);}

function doSmth(arg1,arg2,callback){
// тут какие то действия
if(callback){
_('test').innerHTML='doSmth.timer = '+(doSmth.timer || 'is not defined yet');
doSmth.stoptimer();
doSmth.timer=setTimeout(callback,7000);
}
}

Function.prototype.stoptimer = function(){
try{clearTimeout(this.timer);}
catch(e){}
}


onload=function(){
var e1=_('el1'),e2=_('el2'),e3=_('elem');

e1.onclick=function(){
doSmth('','',function(){e3.style.visibility="hidden";});
};

e2.onclick=function(){
doSmth('','',function(){e3.style.visibility="hidden";});
};
}
 </script>
 </head>
 <body>
 <div id="elem">Исчезающий элемент<br /><br /><div id="test"></div></div>
 <input type="button" id="el1" value="Element 1" />
 <input type="button" id="el2" value="Element 2" />
 </body>
 </html>

Tecvid 07.12.2014 18:25

Цитата:

Сообщение от Cuntmann
извращение, конечно, но:

о Боже, пока что не смог вникнуть что там творится, но всё ольшое спасибо за желание и попытку помочь!)

Tecvid 07.12.2014 18:31

Cuntmann,
мне ещё вот такое посоветовали, через замыкание, держите, вдруг вам тоже понадобится :)

var doSmth = (function() {
    var timer = 0;
    return function(arg1, arg2, callback) {
        if(!timer) {
            if(callback)
                timer = setTimeout(function(){
                    callback();
                    timer = 0;
                }, 7000);
        }
    };
})();

Tecvid 07.12.2014 18:42

рони,
мм похоже что да, но точно такое я скопировал в другой форум, там меня поняли как ни странно) учту в след раз ваш совет)

рони 07.12.2014 18:44

Tecvid,
ok


Часовой пояс GMT +3, время: 16:13.