0

我是一个 JavaScript 新手。我需要添加一个 EventListener 到 Node.on('click', foo); 我的第一次尝试是 - 当然 - 失败:

var i = 0;
Y.one('#btnDel' + i).on('click', function () {
    Y.one('#part' + i).remove(true);
});

我记得在“JavaScript:The Good Parts”一书中有类似的东西,我找到了它(第39页):

var add_the_handlers = function (nodes) {
    var i;
    for (i = 0; i < nodes.length; i += 1) {
        nodes[i].onclick = function (i) {
            return function (e) {
                alert(e);
            };
         }(i);
     }
};

但这也行不通。通过第二次(更多 21 次)查看,我有一些问题:您返回一个需要参数 'e' 的内部函数,但内部函数没有调用 'i' - 只是外部函数。我“修复”了这个问题,现在它适用于我的 YUI:

 Y.one('#btnDel' + i).on('click', function (i) {
    return function () {
        Y.one('#part' + i).remove(true);
    }
}(i));

勘误包上,也有人写了这个“修复”。但是作者(Crockford!)仍然坚持书本版本。有什么我监督的 - 我的版本适用于我的情况只是巧合吗?

ps:当我将我的匿名返回函数绑定i到 时this.i,这将是全局对象吗?

pps:对不起我的英语很棒。:|

4

3 回答 3

2

...或使用事件委托:http: //yuilibrary.com/yui/docs/node/node-evt-delegation.html

1)您最终将只有一个事件侦听器,该事件侦听器将委托给所需的元素(在您的情况下为按钮),2)它会更好地处理动态内容。如果您稍后添加另一个元素(例如按钮),则不必将另一个侦听器附加到它。它已经由代表团处理。

...您所指的示例(第 39 页)是一个典型的闭包,对于大多数新手来说都是一个问题。所以不用担心。您已经自己想出了令人印象深刻的解决方案。

于 2013-08-09T12:19:53.177 回答
0

尝试使用类选择器收集所有按钮。然后你可以简单地使用'each'函数:

Y.all(".buttonClassName").each(function (oneButtonNode) {
    oneButtonNode.on("click", function (event) {
        //do something
        alert(this.get("id"));
    })
});

YUI3 文档:http: //yuilibrary.com/yui/docs/node/#nodelist

于 2012-04-29T18:13:45.990 回答
0

因为 i 是在循环之外定义的,但在点击发生之前不会在订阅者函数中进行评估。同样的 i 被递增,直到它等于 node.length。所以当点击发生时,i 是 node.length。这是 JavaScript 新手的常见错误。有关正在发生的事情的详细信息,请参阅http://james.padolsey.com/javascript/closures-in-javascript/ 。

至于解决方案,请使用事件委托:http: //yuilibrary.com/yui/docs/event/delegation.html

于 2012-05-03T23:48:45.280 回答