【问题标题】:jQuery/JavaScript assign click event in loop (closures?) [duplicate]jQuery / JavaScript在循环中分配点击事件(闭包?)[重复]
【发布时间】:2012-10-29 23:45:02
【问题描述】:

可能重复:
Javascript closure inside loops - simple practical example

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

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

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

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

结果是,在从数据库中获取结果后(甚至在它们显示之前),SetStatus 会为最后一个带有 status == 'On' 的项目触发。

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

【问题讨论】:

    标签: javascript jquery loops closures


    【解决方案1】:
    $(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。

    【讨论】:

    • 您的第一个示例摆脱了自动点击,但无论按钮如何,仍然只传入最后一项。第二个示例是使页面正常工作的原因。谢谢!
    • 不客气。另请阅读 stackoverflow 上的 this very good answer
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2012-02-13
    • 2018-12-26
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多