JavaScript - 动态创建事件侦听器
JavaScript - Dynamically Create Event Listeners
我正在这个项目中使用道场工具包。我有一个下拉按钮,它有一个作为孩子的菜单,然后有各种菜单项。由于这将是一个"活"的应用程序,菜单项将随着业务的增长而变化。我的目标是能够为 Menu 包含的所有菜单项创建事件侦听器。Dojo 提供了一个访问器函数 "getChildren((",我用它来生成我想循环遍历的所有菜单项的对象。菜单项具有标签和 ID,我希望在选择该项时能够使用它们。(注意:按钮、菜单和菜单项由另一个脚本包含,但全局存储在名为 layout 的数组中,就像我将函数和变量附加到 main = [] 下面一样。
main = [];
require([
"dojo/dom","dojo/on","dojo/parser","dojo/json","dojo/domReady!"
], function(dom,on,parser,JSON) {
parser.parse();
console.log("Main Start");
//flags
//Listeners
var gpMenuChildren = layout.gpMenu.getChildren();
for (i in gpMenuChildren) {
var id = gpMenuChildren[i].id;
var label = gpMenuChildren[i].label;
console.log(label);
console.log(id);
on(dom.byId(id),"click",function() {
console.log("dom node w/ 'id' of " + id +" was clicked!");
layout.gpButton.set("value",label);
main.updateQueryStr();
});
}
main.updateQueryStr = function updateQueryStr() {
console.log("updateQueryStr called...");
layout.cpCentTop.set("content", "Test updateQueryStr");
};
console.log("Main End");
});
通过 console.log((,我可以确认各个 id 和标签是正确的,我们可以通过此方法成功地遍历子级。
这就是问题所在
事件侦听器已成功连接到菜单列表中的每个项,但是侦听器的函数组件似乎每次都会覆盖,因此仅采用循环中最后一个子项的属性(id 和标签(。换句话说,单击每个菜单项时都会记录相同的 id 和标签值。
关于确保创建可以包含来自孩子的适当值的独立事件侦听器的任何想法?
提前感谢!
发生这种情况是因为变量的内容发生了变化。您可以使用this
直接从对象中检索 id 和标签:
console.log("dom node w/ 'id' of " + this.id +" was clicked!");
layout.gpButton.set("value",this.label);
能够通过简单地将变量从我的循环传递到外部函数中来解决闭包和作用域的问题,然后该函数对数据执行所需的操作(创建事件侦听器(。
main.createListener = function createListener (id,label) {
console.log("createListener called...");
on(dom.byId(id),"click", function () {
console.log("dom node w/ 'id' of " + id +" and a label of " + label + " was clicked!");
layout.gpButton.set("value",label);
main.updateQueryStr(label);
});
};
var gpMenuChildren = layout.gpMenu.getChildren();
for (i in gpMenuChildren) {
var id = gpMenuChildren[i].id;
var label = gpMenuChildren[i].label;
main.createListener(id,label);
}
相关文章:
- 如何在for循环中添加事件侦听器
- 未命中服务器发送的事件侦听器
- 如何覆盖原型中的事件侦听器
- 无法将事件侦听器附加到画布
- 如何在d3.js中自定义事件侦听器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- 事件侦听器未在chrome扩展中的options.js中启动
- IE8更改文本区域上的事件侦听器不工作
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- javascript删除事件侦听器
- 我应该/如何清除mousemove JQuery事件侦听器
- 在JQuery中使用谷歌地图Api事件/侦听器
- 如何使用我的Jquery代码创建委托事件侦听器
- 'mousemove'画布中的事件侦听器-指针仅在最后一个矩形中更改
- 为什么此事件侦听器不工作
- 是否可以在数字输入框中的小按钮中添加事件侦听器
- 在Google Chrome扩展中添加事件侦听器
- SVG元素在转换后会丢失事件侦听器
- jQuery事件侦听器多次启动
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器