等到元素存在,但只运行一次代码

时间:2019-10-03 12:58:43

标签: javascript jquery

所以我当前正在使用以下代码执行我的jQuery。但是,如您所见,我在执行代码的第二部分时设置了一些计时器。我想看看#objectPrice是否存在,然后运行定时代码,但只能运行一次。这样我就可以更换计时器了。

var checkExist = setInterval(function() {
   if (jQuery('#objectPrice').length) {
     var content = jQuery('#prisen').html();
     objectPrice.value = content.replace(/\D/g,'');
   }
}, 200); // check every 200ms

setTimeout(function() { jQuery("#downPayment").focus(); }, 2200);
setTimeout(function() { jQuery("#downPayment").blur(); }, 2205);

1 个答案:

答案 0 :(得分:1)

正确的方法 您可以通过观察要检查的元素的直接父元素来做到这一点,假设您的元素将被添加到以下div中的页面中:

<div id="parent-div">
    <div>child 1</div>
    <div>child 2</div>
</div>

您将需要观察添加到#parent-div的任何新子级,并在发生这种情况时触发一个函数:

const callback = function(mutationsList, observer) {
    for(let mutation of mutationsList) {
        if( mutation.addedNodes.length > 0){
            for(let node of mutation.addedNodes) {
                let jqueryNode = jQuery(node);
                if(jqueryNode.is('#objectPrice')){
                    var content = jQuery('#prisen').html();
                    objectPrice.value = content.replace(/\D/g,'');
                }
            }
        }
    }
};
const observer = new MutationObserver(callback);
observer.observe(jQuery('#parent-div')[0], {childList: true});

但是,如果您不想更改当前代码,可以使其递归并在第一时间调用它,如下所示:

var checkingFunction = function () {
    if(jQuery('#objectPrice').length){
        var content = jQuery('#prisen').html();
        objectPrice.value = content.replace(/\D/g,'');
    }else{
        setTimeout(function() { checkingFunction() }, 200);
    }
}

checkingFunction();