dojo 多个元素上的相同事件回调函数-由周期分配

oxiaedzo  于 2022-12-16  发布在  Dojo
关注(0)|答案(1)|浏览(127)

我编写了这样的代码,以便更容易地连接事件的回调:

dojo.ready(function() {
    for(var action in page.actions) {
        for(var key in page.actions[action]) {
            (function() {
                dojo.query(key).connect(action, function(evt) {
                    if(page.actions[action][key]() == false) 
                        dojo.stopEvent(evt); 
                });
            })();
        }
    }
});

page = {
    actions : 
    {
        onclick : 
        {
            "#page-action-one" : function()
            {
                alert("Action 1");
                return false;
            },
            "#page-action-two" : function()
            {
                alert("Action 2");
                return false;
            }
        }
    }
};

但点击“#page-action-one”和“#page-action-two”发出相同的警报(“Action 2”)。我尝试使用Cloer,但没有效果。我现在,我可以用不同的方式,但我想现在,为什么会发生这种情况。

ercv8c1e

ercv8c1e1#

你试图通过在匿名函数中 Package 你的事件处理器赋值来解决闭包问题,但是这个技巧的关键是你必须把循环变量作为参数传递给匿名函数,否则匿名函数 Package 器什么也不做。

dojo.ready(function() {
    for(var action in page.actions) {
        for(var key in page.actions[action]) {
            (function(action, key) {
                dojo.query(key).connect(action, function(evt) {
                    if(page.actions[action][key]() == false) 
                        dojo.stopEvent(evt); 
                });
            })(action, key);
        }
    }
});

这样就在调用匿名函数时“固定”了actionkey的值,因此在匿名函数中,这些变量名只应用于传递的参数,而不应用于外部作用域中的命名变量,后者将在下一次循环迭代时更新。

相关问题