JQuery绑定上下文

时间:2012-07-08 05:09:35

标签: jquery binding

我有类似这样的代码:

        for (var i = 0; i < interactions.length; i++) {
            action = interactions[i].split(':');

            if (events.indexOf(action[0]) >= 0) {
                $(this).bind(action[0], function (e) {
                    if (action.length == 2) {
                        model[action[1]]();
                    }
                    else if (action.length == 3) {
                        var args = action[2].split('|');
                        model[action[1]].apply(null, args);
                    }
                });
            }
        }

变量“events”只是一个字符串,其中的事件名称如“click,dblclick”等...问题是当我进入事件时,“action”变量正在丢失上下文。这似乎是一种封闭式的结构,其中“行动”应保持在上下文中,但事实并非如此。在这个例子中,我有两个交互,如:

1)点击:保存

2)禁用:SomeCustomFunction

因此,当我执行点击事件时,我希望动作[1]为“保存”,但它实际上是“禁用”。所以,就像它最后设定的那样,这就是我所得到的。

任何想法如何保持上下文?

非常感谢,

1 个答案:

答案 0 :(得分:0)

当事件处理程序运行时(单击或实际发生的任何事情)action将等于for循环的最后一次迭代时的任何内容。如果action是每个迭代上调用的函数中的局部变量,那么就会得到你需要的闭包构造。

由于您正在使用jQuery,因此最简单的更改是使用$.each()而不是普通的for循环,从而将每次迭代的处理放入其自己的闭包中,并使用自己的action

   $.each(interactions, function(i, item) {
        var action = item.split(':');

        if (events.indexOf(action[0]) >= 0) {
            $(this).bind(action[0], function (e) {
                if (action.length == 2) {
                    model[action[1]]();
                }
                else if (action.length == 3) {
                    var args = action[2].split('|');
                    model[action[1]].apply(null, args);
                }
            });
        }
    });