[英]jQuery/Javascript: setInterval check if DOM element exists?
var check; 函数showLoader(){$('#mc_signup_form')。prepend('loading ...'); check_init(); }
function check_init() {
check = setInterval('check_trigger()', 300);
}
function check_clear() {
clearInterval(check);
}
function check_trigger() {
if ( $('.mc_error_msg').length == 0 || $('.mc_success_msg').length == 0 ) {
$('#mc_signup_form .loading').remove();
check_clear();
}
}
我想知道为什么我的浏览器不断告诉我check_trigger()不存在吗? 我正在showLoader()函数内部启动setInterval。 它应该触发check_trigger。 当两个div(.mc_error_msg或.mc_success_msg)之一存在时,我想清除时间间隔。
我究竟做错了什么?
应该只在单引号或双引号之外删除check_trigger ...
避免双重评估
通过将该函数加quotes
,ECMA- / Javascript将eval
该代码,这简直令人难以置信。 因此,请始终通过setTimeout
/ setInterval
使用function reference
:
setInterval(function(){
check_trigger();
}, 300);
或直接
setInterval(check_trigger, 300);
如果您自己在某处删除有问题的元素,则挂接 jQuery .remove()
或.detach()
方法可能是一种有趣的方法(如果调用这些元素以删除该元素)。
可能看起来像:
var hookRemove = $.fn.remove;
$.fn.remove = function(){
if(this.id === 'something'){
// hoorray! we found it
}
hookRemove.apply(this, arguments);
};
请记住,您正在处理挂钩中的jQuery object
。 因此,实际上this
也可能是一组wrapped set
元素。 因此,请致电
this.each(function(){
});
挂钩内应多保存检查。 这样一来,您将exact
了解何时没有intervall timer
就可以删除对象。
还可以使用setTimeout而不是setInterval,以便摆脱全局变量
我发现将字符串传递给setTimeout
和setInterval
只会导致问题:)
尝试:
setInterval(check_trigger, 300);
此处将各种建议合并为简化版本,无论定义范围如何,它都应起作用。
function showLoader () {
$('#mc_signup_form').prepend('<span class="loading"> loading …</span>');
setTimeout (function check_trigger () {
if ( $('.mc_error_msg').length == 0 || $('.mc_success_msg').length == 0 ) {
$('#mc_signup_form .loading').remove();
} else {
setTimeout (check_trigger, 300);
}
}, 300);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.