admin管理员组

文章数量:1356017

I have a <div> on my page that refreshes automatically every two minutes with updated log entries. When I first load my webpage, I call the following function.

function getLogs() {
    var filter = $('#filter').val();
    $.get("index-ajax.asp", { queryType: "getLogs", filter: filter, 
        uTime: new Date().getTime() },

        function(data){
            $("#logEntries").html(data);
            window.setTimeout("getLogs()",120000);
    });
}

I know the above code could be cleaner with window.setInterval(...); but I just like the control of window.setTimeout(...);.

My question, is it possible to cancel the next timeout execution? In the event that I change the filter, I'd like to cancel the next timeout, and call the function right away, which would reschedule the timeout function. Is there a better way to achieve that result?

Note that the above code is in jQuery.

I have a <div> on my page that refreshes automatically every two minutes with updated log entries. When I first load my webpage, I call the following function.

function getLogs() {
    var filter = $('#filter').val();
    $.get("index-ajax.asp", { queryType: "getLogs", filter: filter, 
        uTime: new Date().getTime() },

        function(data){
            $("#logEntries").html(data);
            window.setTimeout("getLogs()",120000);
    });
}

I know the above code could be cleaner with window.setInterval(...); but I just like the control of window.setTimeout(...);.

My question, is it possible to cancel the next timeout execution? In the event that I change the filter, I'd like to cancel the next timeout, and call the function right away, which would reschedule the timeout function. Is there a better way to achieve that result?

Note that the above code is in jQuery.

Share Improve this question asked Sep 24, 2012 at 18:30 dangowansdangowans 2,4233 gold badges27 silver badges40 bronze badges 2
  • 7 Note: Do NOT pass strings to setTimeout, it uses eval! Pass functions. window.setTimeout(getLogs, 120000); – gen_Eric Commented Sep 24, 2012 at 18:32
  • @RocketHazmat Thanks for the tip on the strings. – dangowans Commented Sep 24, 2012 at 18:36
Add a ment  | 

3 Answers 3

Reset to default 8

Yes, use clearTimeout.

Ex:

var clr = window.setTimeout(getLogs,120000);

The when you wan to clear it:

clearTimeout(clr);

setTimeout returns a timerID that you can pass to clearTimeout:

// Note we are passing the *function* rather than a string
// Also note the lack of () - we are *not* calling the function
// setTimeout will do that for us
var timerID = setTimeout(getLogs, 120000);
// Fake condition - we cancel the timer if the timerID is even
if (timerID % 2 === 0) {
    clearTimeout(timerID);
}

You could always define a new variable based on a filter value and if that filter value is set, use a while statement to omit the timeout:

if(filter == "whatevs"){
    var i=true;
}
function(data){
    $("#logEntries").html(data);
    while(i!=true){
        window.setTimeout("getLogs()",120000);
    }
}

本文标签: jqueryJavaScript windowsetTimeout()force early expireStack Overflow