3

可能重复:
循环内的 Javascript 闭包 - 简单的实际示例

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

我正在尝试使用 jQuerybutton/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
    });
}

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

$(itemOnButton).click(
    function (_item) {
        SetStatus(_item, 'On');
    } (itemName)
);

结果是,在从数据库中获取结果后(甚至在显示之前),使用== 'On'SetStatus触发最后一项。status

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

4

1 回答 1

6
$(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 的闭包。匿名函数是 _item 的作用域,通过参数设置为 itemName。

于 2012-11-09T16:20:54.397 回答