admin管理员组文章数量:1332395
var check; function 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();
}
}
i wonder why my browser keeps telling me that check_trigger() doesn't exist? I'm initiating a setInterval inside of my showLoader() function. It should trigger check_trigger. When one of the two divs (.mc_error_msg or .mc_success_msg) exists i want to clear the Interval.
What am I doing wrong?
var check; function 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();
}
}
i wonder why my browser keeps telling me that check_trigger() doesn't exist? I'm initiating a setInterval inside of my showLoader() function. It should trigger check_trigger. When one of the two divs (.mc_error_msg or .mc_success_msg) exists i want to clear the Interval.
What am I doing wrong?
Share Improve this question asked Aug 4, 2010 at 5:39 mattmatt 44.4k107 gold badges268 silver badges402 bronze badges 2- have you try to put check_trigger() above check_init()? – airmanx86 Commented Aug 4, 2010 at 5:41
- @mathiregister, what's the scope of the code? because setInterval() would be running under "window" / global object, it might not find check_trigger(). – airmanx86 Commented Aug 4, 2010 at 5:50
5 Answers
Reset to default 1it should be check_trigger only remove outside the single or double quote...
also use setTimeout instead of setInterval so you can get rid of the global variable
Avoid double evaluation
By putting that function into quotes
, ECMA-/Javascript will eval
that code, which is just unbelievable slow'ish. So always use a function reference
withing setTimeout
/ setInterval
:
setInterval(function(){
check_trigger();
}, 300);
or directly
setInterval(check_trigger, 300);
If you remove the elements in question by yourself somewhere, it might be an interesting approach to hook the jQuery .remove()
or .detach()
method (If you call those to remove the element).
That could look like:
var hookRemove = $.fn.remove;
$.fn.remove = function(){
if(this.id === 'something'){
// hoorray! we found it
}
hookRemove.apply(this, arguments);
};
Remember your're dealing with an jQuery object
within the hook. So actually this
could also be a wrapped set
of elements. Therefore a call to
this.each(function(){
});
within the hook should be more save for checking. That way you have an exact
knowledge of when an object is removed without an intervall timer
.
Combining the various suggestions here is as simplified version which should work regardless of the scope in which it is defined.
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);
}
I find passing strings to setTimeout
and setInterval
just leads to problems :)
Try:
setInterval(check_trigger, 300);
本文标签: jQueryJavascript setInterval check if DOM element existsStack Overflow
版权声明:本文标题:jQueryJavascript: setInterval check if DOM element exists? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742280026a2445921.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论