【问题标题】:jquery stop/start div refresh after x minutesx分钟后jquery停止/启动div刷新
【发布时间】:2012-05-09 02:34:26
【问题描述】:

我编写了一个小的 jQuery 聊天框,它在 div 中加载一个页面并每 4 秒刷新一次:

点击向下滑动并在 div 中加载页面并刷新:

$('#toggle').click( function () { 
    $('#sbox').slideDown('fast');
    var refreshId = setInterval(function() {
        $('#shout').load('shout.php?randval='+ Math.random());
    }, 4000);
    return false;
});

不过,我猜这有点消耗资源,所以想想如果在 x 分钟后没有检测到活动,则停止刷新,但一旦再次有活动继续刷新......

我找到了这个 sn-p ... https://stackoverflow.com/a/7026769/1359310 ...它检查活动(鼠标移动)并且看起来非常适合我的需求,但似乎无法将两者结合起来。

总结一下我所追求的是在div中单击加载页面并开始刷新,x分钟后如果没有活动停止刷新,一旦再次检测到活动再次开始刷新。

【问题讨论】:

    标签: jquery settimeout partial-page-refresh


    【解决方案1】:

    这样的事情应该可以做到。您应该能够使其适应您的需求。我基本上从您链接的 SO 问题中复制了代码。这会在正文中添加一个活动/非活动类。当您运行我的代码时,您会看到这一点。当页面处于活动状态时,屏幕为蓝色。这表明发生了刷新。当屏幕为灰色时,请不要费心刷新。

    然后您只需在代码中检查活动/非活动类。

    http://jsfiddle.net/scgEs/1

    var refreshrate = 4000;
    var inactivitytime = 15000;
    var refreshid; //set to global scope so that you can clear it later
    var activityTimeoutId; //store timeout for inactivity
    $('#sbox').slideUp();
    
    $('#toggle').click(function() {
        $('#sbox').slideDown('fast');
        refreshId = setInterval(function() {
            if ($('body.inactive').length == 1) {
                $('#sbox').append('<div>No refresh</div>');
            }
            else {
                console.log('Refreshing data');
                $('#sbox').append('<div>Refreshed...</div>');
                //$('#shout').load('shout.php?randval=' + Math.random());
            }
        }, refreshrate);
        return false;
    });
    
    // If theres no activity for X seconds do something
    activityTimeoutId = setTimeout(inActive, inactivitytime);
    
    function resetActive() {
        $(document.body).attr('class', 'active');
        clearTimeout(activityTimeoutId);
        activityTimeoutId = setTimeout(inActive, inactivitytime);
    }
    
    // No activity do something.
    
    
    function inActive() {
        $(document.body).attr('class', 'inactive');
    }
    
    // Check for mousemove, could add other events here such as checking for key presses ect.
    $(document).bind('mousemove', function() {
        resetActive()
    });​
    

    【讨论】:

    • 刚刚更新了我的答案。忘记替换我的变量。
    • 谢谢 mrtsherman,不得不稍微调整一下以满足我自己的需要(显然),但效果很好,标记为答案 :)
    【解决方案2】:
    // If theres no activity for 2 minutes do something
    var isActive = true;
    var isRefreshing = false;
    var refreshChatboxWait = 4000;
    var activityTimoutWait = 120000;
    var activityTimeout = setTimeout(inactive, activityTimoutWait);
    
    function resetActive(){
        isActive = true;
        clearTimeout(activityTimeout);
        if ( ! isRefreshing ) {
            var refreshId = setInterval(refreshChatbox, refreshChatboxWait);
        }
        activityTimeout = setTimeout(inactive, activityTimoutWait);
    }
    
    // No activity do something.
    function inactive(){
        isActive = false;
    }
    
    function refreshChatbox(){
        $('#shout').load('shout.php?randval='+ Math.random());
        if ( ! isActive ) {
            clearInterval(refreshId);
        }
    }
    
    // Check for mousemove, could add other events here such as checking for key presses ect.
    $(document).bind('mousemove', function(){resetActive()});
    
    $('#toggle').click( function () { 
        $('#sbox').slideDown('fast');
        if ( ! isRefreshing ) {
            var refreshId = setInterval(refreshChatbox, refreshChatboxWait);
        }
        return false;
    });
    

    试试看。 :)

    【讨论】:

    • 做我想做的事,但我得到了主要的页面加载延迟,并且影响了在浏览器 (FireFox) 中打开的所有选项卡,而不仅仅是我的页面,我什至有时不得不打开任务管理器来杀死 FF过程:(
    • 可能是因为它设置了多个间隔实例 - 现在试试?
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多