jQuery/JavaScript分配循环中的点击事件(闭包?)

jQuery/JavaScript分配循环中的点击事件(闭包?),javascript,jquery,loops,closures,Javascript,Jquery,Loops,Closures,可能重复: 我正在为“仪表板”网页创建状态表。每个状态都处于“开”或“关”状态 我试图使用jQuery按钮/buttonset来设置开关/切换控件,以允许用户切换状态值。作为ajax数据库查询的结果,我动态创建表和按钮 我基本上是想在用户单击其中一个按钮时触发ajax查询,但我很难正确分配单击事件 无论单击哪个按钮,我的第一个循环都有最终的列表值fire 所以啊哈!!这是一个标准的“JavaScript闭包”问题。(所以我想……) 进一步玩弄它并没有产生任何效果,我对闭包问题的理解还不够透彻,

可能重复:

我正在为“仪表板”网页创建状态表。每个状态都处于“开”或“关”状态

我试图使用jQuery
按钮/buttonset
来设置开关/切换控件,以允许用户切换状态值。作为ajax数据库查询的结果,我动态创建表和按钮

我基本上是想在用户单击其中一个按钮时触发ajax查询,但我很难正确分配单击事件

无论单击哪个按钮,我的第一个循环都有最终的列表值fire

所以啊哈!!这是一个标准的“JavaScript闭包”问题。(所以我想……)

进一步玩弄它并没有产生任何效果,我对闭包问题的理解还不够透彻,无法弄清楚我的技术为什么是错误的

下面是我想调用的代码:

function SetStatus(item, status) {
    var params = '{itemName: "' + item + '", status: "' + status + '"}';
    $.ajax({
        type: "POST",
        url: "WebServices/Dashboard.asmx/SetItemStatus",
        data: params,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: StatusSet,
        error: ShowError
    });
}
以下是我正在尝试的代码的当前版本:

$(itemOnButton).click(
    function (_item) {
        SetStatus(_item, 'On');
    } (itemName)
);
结果是,从数据库中获取结果后(甚至在结果显示之前),
SetStatus
立即为状态为
的最后一个项目触发

我知道这很简单,我仍然相信这是一个基本的关闭问题,但我的头撞到墙上了!谢谢你的帮助

$(itemOnButton).click(
    function (_item) {
        SetStatus(_item, 'On');
    } (itemName)
);
当前,您正在启动“关闭”功能,同时单击它。试一试

$(itemOnButton).click(
    function (ev) { 
        // this is the clicked element
        // ev is the event object

        // how do you get the name?
        // var itemName = $(this).attr("name");

        SetStatus(itemName, 'On');
    }
);
你也可以这样做

$(itemOnButton).click(
    function (_item) {
        return function (ev) {
            SetStatus(_item, 'On');
        };
    } (itemName)
);
现在,它会像您一样启动,但不会立即执行,而是返回事件处理函数以供单击


返回的事件处理函数现在是_项的闭包。匿名函数是_item的作用域,通过参数设置为itemName。

您的第一个示例摆脱了自动单击,但仍然只传入了最后一个项,不管按钮是什么。第二个例子是使页面工作的原因。谢谢不客气。另请阅读stackoverflow。