2015-11-02 145 views
0

我利用这个资源来构造我的代码:http://www.w3schools.com/jsref/met_win_clearinterval.aspclearInterval函数不清除setInterval函数

var intervalID = setInterval(function(){ ogpeWrapper() }, 10); 

function ogpeWrapper() { 
    $("#breadcrumbWrapper, #leftColWrapper, #rightColWrapper").wrapAll('<div id="colWrapperContainer"></div>'); 
}(jQuery); 

function myStopFunction() { 
    if (document.getElementById('colWrapperContainer')) { 
    clearInterval(intervalID); 
    setIntervalID = undefined; 
    }  
} 

我ogpeWrapper功能正在运行,但调用clearInterval功能是没有的。

基本上,一旦$(“#breadcrumbWrapper,#leftColWrapper,#rightColWrapper”)。wrapAll('');运行,我想间隔停止运行它。

编辑 - 下午12点24分CST:

这是基本的代码,我利用来包装上市元素 -

(function($) { 
    $("#breadcrumbAds, #breadcrumbWrapper, #containerTopParsys, #leftColWrapper, #rightColWrapper").wrapAll('<div id="colWrapperContainer"></div>'); 
})(jQuery); 

此代码的工作,但它不办理变更手续后才DOM已完全加载。只要这些元素全部可用,我就需要该功能才能工作。所以我需要使用setInterval来处理函数,然后在处理函数后清除间隔。

如果有人知道另一种方法来做到这一点,除了setIterval,请让我知道。

+8

你在哪里调用'myStopFunction()'? – Rayon

+1

旁注:你将'jQuery'传递给'ogpeWrapper',但是无论如何都使用全局别名,因为你的'ogpeWrapper'定义没有参数 – Grundy

+0

我使用了基于http://www.w3schools.com/jsref的“function myStopFunction()上面引用的/met_win_clearinterval.asp链接。我对javascript完全陌生,所以我不知道我错了什么。 – typingoverworld

回答

0

您需要的变量中创建一个明确如果其他条件,所以你知道什么时候会开始何时会停止。此外,由于最小毫秒间隔时间为,在浏览器上不一致,尽管您希望它检测速度非常快,但我会建议使用“更安全”的号码,并使用100作为最小值。方法.length是一个方便的小方法来检查元素是否在页面上;您可以将其用作伪动态真/假条件。最后,在你的.wrapAll()标签中,我换了你的单引号和双引号,因为这是最好的做法。

var colWrapper = setInterval(function(){  
    if ($('div#colWrapperContainer').length > 0) { 
     var doNothing = ""; 
     clearInterval(colWrapper); 
    } else { 
     $("#breadcrumbWrapper, #leftColWrapper, #rightColWrapper").wrapAll("<div id='colWrapperContainer'></div>"); 
    } 
}, 100); 

这里是供您参考工作示例Wrap Example

更新:

示例把脚本<body>标签(没有 window.load /的document.ready)内,从而它一载入就可以独立运行。

<script type="text/javascript">//<![CDATA[ 

//http://stackoverflow.com/questions/33483000/clearinterval-function-not-clearing-setinterval-function/33483267#33483267 
//Auto Wrap Solution 
//Alexander Dixon [11-02-2015] 
var wrapThese = $("#breadcrumbWrapper, #leftColWrapper, #rightColWrapper"); 
var colWrapper = setInterval(function() { 
    if ($('div#colWrapperContainer').length > 0) { 
     var doNothing = ""; 
     clearInterval(colWrapper); 
    } else { 
     wrapThese.wrapAll('<div id="colWrapperContainer"></div>').addClass('success'); 
    } 
}, 100); 
//]]> 

</script> 
+0

此解决方案在包装元素时确实成功,但是,直到页面加载完成后才能工作。我需要使用间隔来处理这个问题的原因是,一旦检测到元素,就会加载它,而不是在整个DOM加载之后加载。 – typingoverworld

+0

我已更新我的示例以包含一个将立即激发脚本的方法。如果您想测试,请点击“Wrap Example”链接,并在左侧的下拉列表中选中“no wrap-in in body”。 –

+0

如果只有我能够这样做。不幸的是,我们的CMS限制了这种交互。 – typingoverworld