我正在尝试做很多次我做过的事情。我无法弄清楚为什么这不起作用。无论我如何编写jQuery代码,它都不起作用。 menuitems[i].action()
只是不起作用。下面是示例1 ,其中此示例,无论点击哪个项目,它都会返回最后一项的操作(在此示例中为alert('Forward!')
)。第二个返回undefined属性。完整的错误如下。
我的jQuery插件就是这样调用的(以下示例是同一个调用所发生的事情):
$('p').contextMenu([
{
name:'Back',
action:function(){
alert('Back!');
},
icon:'http://cdn.iconfinder.net/data/icons/crystalproject/16x16/actions/agt_back.png'
},
{
name:'Forward',
action:function(){
alert('Forward!');
},
icon:'http://cdn.iconfinder.net/data/icons/crystalproject/16x16/actions/agt_forward.png'
}
]);
示例1:
for (i in menuitems){
$('<li/>',{
'html':'<img src="'+menuitems[i].icon+'">'+menuitems[i].name,
'class':o.itemClass,
'click':function(){
menuitems[i].action();
}
}).appendTo('.'+o.listClass);
}
这会返回前转警报!无论点击哪一项,后退或前进。
示例2:
var len = menuitems.length;
for (var i = 0; i < len; i++){
$('<li/>',{
'html':'<img src="'+menuitems[i].icon+'">'+menuitems[i].name,
'click':function(){
menuitems[i].action();
},
'class':o.itemClass
}).appendTo('.'+o.listClass);
}
我明白了:
未捕获的TypeError:无法读取 属性'动作'未定义
我尝试的其他随机内容是分离点击并将其重新附加到appendTo()
块之外,将action()
更改为newtest()
以确保其与任何内置关键字不冲突。我也尝试过做$('body').append('<li>{blah blah}</li>').find('li').click(function(){/*blah blah*/});
,但它仍然返回同样的东西。我没想法了!
答案 0 :(得分:16)
问题是“i”会递增,所以在执行click事件时,i的值等于len。 一种可能的解决方案是在函数内捕获i的值:
var len = menuitems.length;
for (var i = 0; i < len; i++){
(function(i) {
$('<li/>',{
'html':'<img src="'+menuitems[i].icon+'">'+menuitems[i].name,
'click':function(){
menuitems[i].action();
},
'class':o.itemClass
}).appendTo('.'+o.listClass);
})(i);
}
在上面的示例中,匿名函数创建了一个捕获i的当前值的新作用域,以便在触发click事件时使用局部变量而不是for循环中的i。
答案 1 :(得分:0)
通常问题是在最后一次迭代中你有一个空对象或未定义对象。在你的cicle中使用console.log()来检查这个事件是否发生。
有时候某个地方的原型会添加额外的元素。
答案 2 :(得分:0)
我对'parallax'插件有同样的问题。
我从*jquery-1.6.4*
将jQuery库版本更改为*jquery-1.10.2*.
并且错误已清除。