Javascript 对jQuery插件的操作始终是最后一个选项?
我正在编写的插件是一个内部应用程序的右键单击上下文菜单,我不明白为什么会发生这种情况 以下是我的测试代码:Javascript 对jQuery插件的操作始终是最后一个选项?,javascript,jquery,plugins,jquery-plugins,contextmenu,Javascript,Jquery,Plugins,Jquery Plugins,Contextmenu,我正在编写的插件是一个内部应用程序的右键单击上下文菜单,我不明白为什么会发生这种情况 以下是我的测试代码: $('.item').rightClickMenu([ { icon:'http://cdn1.iconfinder.com/data/icons/silk2/exclamation.png', title:'Alert', action:function(){ alert('Here is an example alert!'); } }, { icon:'h
$('.item').rightClickMenu([
{
icon:'http://cdn1.iconfinder.com/data/icons/silk2/exclamation.png',
title:'Alert',
action:function(){
alert('Here is an example alert!');
}
},
{
icon:'http://cdn1.iconfinder.com/data/icons/silk2/error.png',
title:'Console.Log',
action:function(){
console.log('Here is an example console.log()!');
}
}
]);
相关的jQuery插件代码是:
for(x in items){
$list.append('<li class="rightClickMenuOption'+x+'"><img src="'+items[x].icon+'">'+items[x].title+'</li>')
.find('.rightClickMenuOption'+x)
.bind('click',function(){
items[x].action();
});
}
用于(项目中的x){
$list.append(““+items[x].title+” ”)
.find('.rightClickMenuOption'+x)
.bind('单击',函数()){
项[x]。操作();
});
}
演示:
这将修复它:
您正在创建一个闭包。在循环中,..in的中调用的所有方法将相同的父上下文从其激活对象复制到内部[[Scope]]
属性中。因此,所有方法都访问相同的变量x
。您需要调用另一个函数来修复此问题
for(x in items){
(function(index) {
$list.append('<li class="rightClickMenuOption'+index+'"><img src="'+items[index].icon+'">'+items[index].title+'</li>')
.find('.rightClickMenuOption'+index)
.bind('click',function(){
items[index].action();
});
}(x));
}
用于(项目中的x){
(功能(索引){
$list.append(“”+项[index].title+” ”)
.find('.rightClickMenuOption'+索引)
.bind('单击',函数()){
项目[索引]。操作();
});
}(x) );
}
更新
看看
这将非常令人印象深刻地演示for
和for..之间的速度差。在中,这将解决此问题:
您正在创建一个闭包。在
循环中,..in
的中调用的所有方法将相同的父上下文从其激活对象复制到内部[[Scope]]
属性中。因此,所有方法都访问相同的变量x
。您需要调用另一个函数来修复此问题
for(x in items){
(function(index) {
$list.append('<li class="rightClickMenuOption'+index+'"><img src="'+items[index].icon+'">'+items[index].title+'</li>')
.find('.rightClickMenuOption'+index)
.bind('click',function(){
items[index].action();
});
}(x));
}
用于(项目中的x){
(功能(索引){
$list.append(“”+项[index].title+” ”)
.find('.rightClickMenuOption'+索引)
.bind('单击',函数()){
项目[索引]。操作();
});
}(x) );
}
更新
看看
这将非常令人印象深刻地演示for
和for..in
中的之间的速度差,请使用正常的for
循环,而不是for..in
<代码>项
是一个数组。但无论如何+1:)太棒了!你太棒了。当StackOverflow告诉我:)@Felix,我听说很多关于不使用…in的信息,但我仍然不明白为什么。你能给我指点东西解释一下为什么你不该这么做吗?我想知道,只是好像什么都找不到:\@奥斯卡:不客气。你也应该听从Felix Kling的建议。使用普通的for循环
在数组上迭代更合适。一个很好的理由是,for..in
比for
或while
循环要慢得多。@Oscar Godson:看看这里:基本上,for..in
用于迭代对象属性。由于数组也是对象,如果您在数组上指定自定义属性,您也将迭代该属性,这不是您想要的(以及其他东西)。只需对对象使用for…in
,对数组使用for
。如果您不想写这么多,并且顺序无关紧要,您可以将for循环写为for(var i=items.length;i--;)
请使用正常的for
循环,而不是for…in
<代码>项
是一个数组。但无论如何+1:)太棒了!你太棒了。当StackOverflow告诉我:)@Felix,我听说很多关于不使用…in的信息,但我仍然不明白为什么。你能给我指点东西解释一下为什么你不该这么做吗?我想知道,只是好像什么都找不到:\@奥斯卡:不客气。你也应该听从Felix Kling的建议。使用普通的for循环
在数组上迭代更合适。一个很好的理由是,for..in
比for
或while
循环要慢得多。@Oscar Godson:看看这里:基本上,for..in
用于迭代对象属性。由于数组也是对象,如果您在数组上指定自定义属性,您也将迭代该属性,这不是您想要的(以及其他东西)。只需对对象使用for…in
,对数组使用for
。如果您不想写这么多,并且顺序无关紧要,那么可以将for循环编写为for(var i=items.length;i--;)