jQuery/JavaScript在循环中分配click事件(闭包?)

mbm*_*414 2 javascript jquery closures loops

可能重复:
循环内部的Javascript闭包 - 简单实用的例子

我正在为"仪表板"网页创建一个状态表.每个状态都处于"开"或"关"状态.

我正在尝试使用jQuery button/buttonset来切换/切换控件以允许用户切换状态的值.我作为ajax数据库查询的结果动态创建表和按钮.

当用户点击其中一个按钮时,我基本上试图触发ajax查询,但我很难正确分配点击事件.

无论点击什么按钮,我的第一个轮次都有最终列表值.

所以,啊哈!这是一个标准的"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
    });
}
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试的当前代码版本:

$(itemOnButton).click(
    function (_item) {
        SetStatus(_item, 'On');
    } (itemName)
);
Run Code Online (Sandbox Code Playgroud)

结果是,一旦从数据库获得结果(在它们甚至显示之前),立即SetStatus触发最后一项status=='开'.

我知道这很简单,我仍然相信这是一个基本的封闭问题,但我正在撞墙!谢谢你的帮助!

met*_*ngs 5

$(itemOnButton).click(
    function (_item) {
        SetStatus(_item, 'On');
    } (itemName)
);
Run Code Online (Sandbox Code Playgroud)

目前,当您点击它时,您正在触发"关闭"功能.尝试

$(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');
    }
);
Run Code Online (Sandbox Code Playgroud)

你也可以这样做

$(itemOnButton).click(
    function (_item) {
        return function (ev) {
            SetStatus(_item, 'On');
        };
    } (itemName)
);
Run Code Online (Sandbox Code Playgroud)

现在它像你一样触发,但它不立即执行,而是返回click的事件处理函数.

返回的事件处理函数现在是_item的闭包.匿名函数是_item的范围,通过参数设置为itemName.