jQuery:div的选择器在存储在变量中时是未定义的

时间:2014-03-13 03:27:55

标签: javascript jquery html undefined selector

好的,这个人开始吓坏我了: 我在类" tooltipBox"中有几个div容器,但内容不同。在我的小脚本中,我尝试将所有这些div的数组存储在一个变量中,如下所示:

var agents = $( ".tooltipBox" );

但是,当我想现在使用该数组时,它是未定义的。当我自己测试选择器时(就像通过alert()一样),它确实有效。 这里的问题是什么?

这是使用选择器的地方:

    $( "#runSimBtn" ).click(function runSimulation() {
        $( "#lContent h2" ).text("Simulation in progress...");

        var agents = $( "div.tooltipBox" );
        var falloutTimes = $( ".rFO" );

        var i, j = 0;

        for(i = 0, j = 0; i < agents.length, j < falloutTimes.length; i++, j++) {
            var ttl = falloutTimes[j].value;

            if((ttl != undefined) && (ttl != 999)) {
                setTimeout(function() {
                    agents[i].animate({ backgroundColor: "#FF0000" }, 500);
                }, ttl*1000);
            } else {
                continue;
            }
        }
    });

还尝试了浏览器控制台(Firefox)中的选择器,并且我可以选择div,但是只要我想将选择(甚至单个div)存储到变量,它返回undefined。

提前致谢...

3 个答案:

答案 0 :(得分:2)

正如我在评论中指出的那样,在循环中使用闭包变量是一个问题。

尝试

$("#runSimBtn").click(function runSimulation() {
    $("#lContent h2").text("Simulation in progress...");

    var agents = $("div.tooltipBox");
    var falloutTimes = $(".rFO");

    var i, j = 0;

    for (i = 0, j = 0; i < agents.length, j < falloutTimes.length; i++, j++) {
        var ttl = falloutTimes[j].value;

        if ((ttl != undefined) && (ttl != 999)) {
            (function (i, ttl) {
                setTimeout(function () {
                    agents[i].animate({
                        backgroundColor: "#FF0000"
                    }, 500);
                }, ttl * 1000);
            })(i, ttl);
        } else {
            continue;
        }
    }
});

答案 1 :(得分:0)

我认为这里发生的事情是当setTimeout在1秒后调用该函数时,声明代理的函数已经完成,并且不再可以访问代理变量。

 $( "#runSimBtn" ).click(function runSimulation() {
        $( "#lContent h2" ).text("Simulation in progress...");

        var agents = $( "div.tooltipBox" );
        var falloutTimes = $( ".rFO" );
        var timeoutFunction = function(agent){
            agent.animate({ backgroundColor: "#FF0000" }, 500);
        }

        var i, j = 0;

        for(i = 0, j = 0; i < agents.length, j < falloutTimes.length; i++, j++) {
            var ttl = falloutTimes[j].value;

            if((ttl != undefined) && (ttl != 999)) {
                setTimeout(timeoutFunction(agents[i]), ttl*1000);
            } else {
                continue;
            }
        }
    });

答案 2 :(得分:0)

至于将div选择器存储在变量中是一个问题,它适用于我:

<div class="aClass">div 1</div>
<div class="aClass">div 2</div>

和jQuery:

var agents = $("div.aClass");
$(agents).each(function(key, val) {
    alert($(val).text());
});

会提醒div 1div 2