重新启动jquery的setInterval而不重新初始化它

时间:2014-05-06 13:23:24

标签: javascript jquery html setinterval restart

正如我的标题所示,我想重新启动jquery的setInterval而不重新初始化它。

我的方案是考虑一个完全加载的页面。在此页面上,div会在页面完全加载后随时动态添加。我没有从我的代码中添加此div,所以我对此没有任何控制权。这个div有一个类lpInviteChatHrefClose。这是固定的,即div将始终具有此类。当用户点击此div时,会执行一些javascript函数,并隐藏此div。此外,还可能会添加多个div代码(使用相同的类名称),但如果未点击现有的可见div代码,则不会添加新的div

现在,我想要实现的是我想点击这个div来调用javascript函数。现在,由于动态添加了此div,因此无法编写以下内容,因为jquery将无法在div上找到document.ready

$('.lpInviteChatHrefClose').click(function(){...});

所以我做的是创建了一个setInterval来检查是否存在div,如果是,则绑定click事件。第一次添加动态div时,我能够完成这项工作。

当第二次将此动态div添加到html时,我的问题就出现了。这里我再次需要处理新动态添加的div的点击事件。

到目前为止我所做的工作如下

外部文件。已经(全球)

 var interval;

 var onInterval;

在document.ready中

onInterval = function () {
    //check if an element with this class exists
    if ($('.lpInviteChatHrefClose').length) {
        $(".lpInviteChatHrefClose").click(function () {
            outbound_reject_omniture_setting(this);
            //This should restart the interval but it doesnt
            interval = setInterval(onInterval, 1000);
        });
        clearInterval(interval);
    }
};

interval = setInterval(onInterval, 1000);

我会取消此检查if ($('.lpInviteChatHrefClose').length),但只要动态setInterval出现,div每1秒后会附加一个功能。我不想要这个。我希望我的javascript函数只能被调用一次。

clearInterval(interval);将停止/暂停间隔。但我不知道如何重新启动它。

请帮忙!

很抱歉这么长的说明。提前谢谢!

3 个答案:

答案 0 :(得分:0)

您需要使用委托事件处理程序将事件附加到DOMready被触发后创建的元素。忘记与setTimeoutsetInterval

有关的任何事情
$(document).on('click', '.lpInviteChatHrefClose', function(){
    // your code here...
});

答案 1 :(得分:0)

您不必将setInterval用于动态元素。使用事件委托

$(document).on('click','.lpInviteChatHrefClose',function(){...});

答案 2 :(得分:0)

我能够做到这一点。

问题是setInterval正在重新启动(你可以说是一个观察错误),但它立即被绑定到一个动态创建的早期元素,因此新元素在一段时间后被添加没有受到约束。

另外正如我提到的那样被调用的方法即outbound_reject_omniture_setting正在做一些工作然后元素被隐藏,所以我无法检查点击是否被绑定到同一个元素。

解决方案是循环遍历迄今为止动态添加的所有元素,并检查其中任何一个元素是visible。如果是,则将click事件绑定到元素并清除间隔。在单击功能中,重新启动间隔。

onInterval = function () {
    $('.lpInviteChatHrefClose').each(function (index) {
        if ($(this).css('visibility') == 'visible') {
            $(this).click(function () {
                outbound_reject_omniture_setting(this);
                interval = setInterval(onInterval, 1000);
            });
            clearInterval(interval);
        }

    })
};

interval = setInterval(onInterval, 1000);

谢谢大家的帮助。