将jQuery对象传递给setTimeout递归函数

时间:2015-04-06 19:46:06

标签: javascript jquery

我正在尝试将jQuery对象传入setTimout函数,但无济于事。

这就是我现在所拥有的 - 它的工作原理:

var checkIfElementsExist = function () {

    var elements = $('.myElements');

    if (elements.length) {
        console.log('els are here!');
        $(window.document).trigger('elementsExist', [elements]);

    } else {
        console.log('nope, check it again');
        setTimeout(checkIfElementsExist, 500);
    }

}

checkIfElementsExist();

但是一旦我从函数中取出$('.myElements'),并尝试将其作为参数传递给函数,elements.length总是返回零。

var checkIfElementsExist = function (elements) {

    if (elements.length) {
        console.log('els are here!');
        $(window.document).trigger('elementsExist', [elements]);

    } else {
        console.log('nope, check it again');
        setTimeout(checkIfElementsExist, 500);
    }

}

checkIfElementsExist($('.myElements'));

我读到你不能将参数传递给setTimeout函数,所以我试图将元素作为附加参数传递给setTimeout调用,例如setTimout(checkIfElementsExist, 500, elements);,但仍然没有。

更新:

我已经完成了Pointy提到的更新,但它似乎仍无效。这是JSFIDDLE以更好地说明问题。

2 个答案:

答案 0 :(得分:5)

而不是

    setTimeout(checkIfElementsExist, 500);

你可以这样做:

    setTimeout(function( ) { checkIfElementsExist(".myElements"); }, 500);

通过在实际函数周围包装一个匿名函数,你可以传入你想要的任何参数。

答案 1 :(得分:1)

执行$('.myElements')遍历DOM并返回包含class="myElements"的所有元素的数组。

最初传递$('.myElements')时,您只是第一次构建该数组。以下处理时间您没有传递任何参数。

这里真正的问题是为什么在加载脚本时没有加载.myElements?它们是动态创建的吗?如果没有,您的脚本应该包含在$(document).ready(function(){ // ... code here })中,以等待加载整个页面。