【问题标题】:a for loop to concatenate selector jquery用于连接选择器 jquery 的 for 循环
【发布时间】:2013-04-01 05:10:00
【问题描述】:

在使用 for 循环连接 jquery 选择器时,我遇到了一小段 jquery 代码的奇怪问题:

不工作:

for(j = 1; j <= myHypervisors.length; j++)
{
    $("#status_vm" + j + "_dev").hide();
        $("#title_hypervisor_" + j).toggle(function(){
        $("#status_vm" + j + "_dev").show();
        $("#show_hypervisor_" + j).toggleClass('icon-plus icon-minus');
    },function(){
        $("#status_vm" + j + "_dev").hide();
        $("#show_hypervisor_" + j).toggleClass('icon-minus icon-plus'); 
    });
}//for

myHypervisors.length == 2

工作:

$("#status_vm1_dev").hide();
    $("#title_hypervisor_1").toggle(function(){
    $("#status_vm1_dev").show();
    $("#show_hypervisor_1").toggleClass('icon-plus icon-minus');
 },function(){
    $("#status_vm1_dev").hide();
    $("#show_hypervisor_1").toggleClass('icon-minus icon-plus');    
 });

$("#status_vm2_dev").hide();
    $("#title_hypervisor_2").toggle(function(){
    $("#status_vm2_dev").show();
    $("#show_hypervisor_2").toggleClass('icon-plus icon-minus');
 },function(){
    $("#status_vm2_dev").hide();
    $("#show_hypervisor_2").toggleClass('icon-minus icon-plus');    
 });

关于 DOM:

<h3 id="title_hypervisor_1"><i class="icon-plus" id="show_hypervisor_1"></i> Hypervisor : vm1-dev </h3>

<table class="table table-bordered" id="status_vm1_dev"></table>
...

提前感谢您的帮助

【问题讨论】:

    标签: jquery loops for-loop concatenation selector


    【解决方案1】:

    那是因为j 发生了变化:当回调被执行时,它的值是循环结束的值之一。您可以使用立即调用的函数来保护它:

    for(j = 1; j <= myHypervisors.length; j++){
       (function(j){
        $("#status_vm" + j + "_dev").hide();
        $("#title_hypervisor_" + j).toggle(function(){
            $("#status_vm" + j + "_dev").show();
            $("#show_hypervisor_" + j).toggleClass('icon-plus icon-minus');
        },function(){
            $("#status_vm" + j + "_dev").hide();
            $("#show_hypervisor_" + j).toggleClass('icon-minus icon-plus'); 
        });
       })(j);
    }
    

    对于不喜欢在循环中创建函数的人,这里有另一个解决方案(作为奖励,它与最新版本的 jQuery 兼容):

    for(j = 1; j <= myHypervisors.length; j++) $("#status_vm" + j + "_dev").hide();
    $('[id^="title_hypervisor_"]').click(function(){
       var j = this.id.slice('title_hypervisor_'.length);
       $("#status_vm" + j + "_dev").toggle();
       $("#show_hypervisor_" + j).toggleClass('icon-plus icon-minus');
    });
    

    【讨论】:

    • 我仍然不喜欢看到在循环中创建的函数,但这不是你的错 :)
    • @MarkSchultheiss 我为你做了第二个解决方案。
    • 顺便说一句,我认为将函数作为参数的切换功能确实消失了,不是吗?编辑:stackoverflow.com/questions/14301935/…
    • “伪”功能,如用于鼠标输入/输出的 .hover 和这种形式的切换,以前已弃用,然后在 1.9+ 中作为一般的“清理以获得更好的方式”策略被删除。发行说明清楚地说明了这一点。
    • 感谢您快速而宝贵的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多