javascript - 关于闭包的问题

查看:104
本文介绍了javascript - 关于闭包的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

        var blockLength=0;
        $("#divadd"+blockLength).click(function(){
            if(blockLength < 5){
                $(".muiltiRouteClass"+blockLength).attr("style","");
                $("#divminus"+blockLength).show();
                if(blockLength == 5){$("#divadd"+blockLength).css("visibility","hidden");}
            if(blockLength == 2){$("#divminus"+blockLength).css("display","none");}
            }
            blockLength++;
        });

如上面代码,最开始的按钮id是divadd2, 点击之后,将隐藏的divadd3显示出来。这时候blockLength++ 按钮的id是divadd3,请问点击之后,怎么重新给点击的按钮赋新的id。在线等,谢谢

解决方案

就你的问题来说,应该是通过一个循环来为每个 route 绑定事件

for (var i = 0; i < 5; i++) {
    // 使用 IIFE 是处理循环变量在闭包中的问题
    (function(blockLength) {
        $(".muiltiRouteClass" + blockLength).attr("style", "");
        $("#divminus" + blockLength).show();
        if (blockLength == 5) { $("#divadd" + blockLength).css("visibility", "hidden"); }
        if (blockLength == 2) { $("#divminus" + blockLength).css("display", "none"); }
    })(i);
}

一般我会按下面的思路来处理

// 假设 muiltiRouteClass# 都有一个共同的 class 叫 multiRoutteClass
// 顺便:muilti 拼写错误,应该是 multi

// 先找出来,统计赋予一个 index,ID 也可以在这个时候生成
$(".multiRouteClass").forEach(function(index) {
    $(this)
        .data("index", index)
        .prop("id", "multiRoute" + index);
});

// 这样做会为每一个 multiRouteClass 注册 click 事件处理函数
// 如果它们有共用的父 DOM,可以在父 DOM 上注册事件代理
$(".multiRouteClass").on("click", function() {
    var $route = $(this);
    var index = $route.data("index");
    $route.attr("style", "");
    $("#divminus" + index).show();
    if (index == 5) { .... }
    if (index == 2) { .... }
});

如果使用事件代理的话,假设父 DOM 是 #parent

$("#parent").on("click", ".multiRouteClass", function() {
    ...
});

这篇关于javascript - 关于闭包的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆