For循环不循环对象的值——对每个元素应用相同的处理程序
For loop doesn't loop values of an object - applies same handler to each element
我编写了一个函数,旨在提供一种创建右键单击(上下文)菜单的简便方法。很好,但是你作为点击处理程序传递给它的函数不会应用到正确的菜单项上。
调用该函数时,向它传递click事件和一个包含菜单项名称及其处理函数的对象文本,如下所示:
context.menu(e,{
"Hello": function() {
alert("Hi");
},
"World": function() {
alert("Hello world!");
},
});
假设,对象字面值在for
循环中循环,并且每个处理程序函数应用于相应的菜单项。然而,似乎传入的第一个处理程序函数被应用于所有菜单项。
函数是这样的:
this.menu = function(e,options) {
e.preventDefault();
var x = e.clientX;
var y = e.clientY;
var id = math.floor(math.random()*8192);
id = "menu-"+id;
var menu = "<div class='menu-wrapper'></div>";
menu = $(menu);
menu.attr("id",id);
var i = 0;
for(var key in options) {
var option = $("<span class='menu-item' id='menu-item-"+i+"'>"+key+"</span>");
var fn = options[key];
option.appendTo(menu);
option.on("click",function() {
// $(this).css("background","yellow"); - just a test, not needed any more
fn.call();
});
i++;
}
menu.appendTo("body");
menu.css({
top: y,
left: x,
});
$(document).click(function() {
$("#"+id).remove();
});
$("#"+id).click(function(e) {
e.stopPropagation();
});
}
我如何改变这一点,以便在正确的地方应用处理程序?
实时JSFiddle演示
更新:
我试过添加代码(使用typeof(options[key]);
,所以它检查你传递的函数的类型,但仍然没有运气。console.log
也给了我正确的值,所以我不知道为什么它不循环。
这是一个常见的陷阱。JS没有块作用域——你的fn
变量每次迭代都会被重写。试着把它包在闭包里。
this.menu = function(e,options) {
e.preventDefault();
var x = e.clientX;
var y = e.clientY;
var id = math.floor(math.random()*8192);
id = "menu-"+id;
var menu = "<div class='menu-wrapper'></div>";
menu = $(menu);
menu.attr("id",id);
var i = 0;
for(var key in options) {
(function(key){ // start closure
var option = $("<span class='menu-item' id='menu-item-"+i+"'>"+key+"</span>");
var fn = options[key];
option.appendTo(menu);
option.on("click",function() {
// $(this).css("background","yellow"); - just a test, not needed any more
fn.call();
});
})(key); // end closure
i++;
}
menu.appendTo("body");
menu.css({
top: y,
left: x,
});
$(document).click(function() {
$("#"+id).remove();
});
$("#"+id).click(function(e) {
e.stopPropagation();
});
}
相关文章:
- 如何在foreach循环中对每个产品单独应用评级系统
- jQuery:如何在没有for循环的情况下将事件处理程序应用于$('#text'+'任意整数
- 在循环遍历对象 HTMLDivElement 时,应用 ChileNode 样式 zindex 在 firefox 和
- 谷歌应用程序脚本:如何修复循环将一个谷歌文档的段落插入另一个
- 在javascript for循环的迭代之间应用延迟
- GAE/Angular应用程序中window.init()上的无限循环
- Angular应用程序中FOR循环的意外行为
- if-else循环和jquery在热应用程序或冷应用程序中不起作用
- 弹出循环:添加数据时停止重复/三次应用/X
- 循环使用CSS规则遍历数组,并将它们应用于元素
- 编写脚本以循环遍历数组并为DOM元素应用值
- 应用函数javascript循环额外
- 使用Javascript SDK在Facebook应用程序上的无限登录循环
- 如何分解循环代码以创建大型应用程序
- 循环访问未显示在 Express 应用程序中的虚拟数据
- 将 DRY 应用于整个文件中的多个循环
- jquery循环遍历锚点以匹配悬停锚点类并应用css
- 无法对循环中的最后一项应用函数
- 将Node.js应用程序部署到heroku时出现Async.times错误(重复循环)
- 在javascript中使用for-in循环应用样式