2010-11-12 105 views
11

我正在尝试做我做过很多次的事情。我无法弄清楚为什么这不起作用。无论我如何编写jQuery代码,它都不起作用。 menuitems[i].action()只是不起作用。下面是示例1在这个示例中,无论点击哪个项目,它都会返回最后一项的动作(在本例中为alert('Forward!'))。第二个返回未定义的属性。下面的完整错误。jQuery插件返回“无法读取未定义的属性”

我的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); 
} 

我得到:

Uncaught TypeError: Cannot read property 'action' of undefined

其他随机的东西,我试图进行拆卸点击重新连接它是appendTo()块之外,改变action()newtest()使确定它没有与任何内置关键字冲突。我也试过做$('body').append('<li>{blah blah}</li>').find('li').click(function(){/*blah blah*/});,但它仍然返回相同的东西。我要离开创意!

+0

你有没有尝试用调试器通过这个步骤? – Phil 2010-11-12 05:26:36

+0

对调试器有任何建议吗?我只是使用铬的检查员 – 2010-11-12 05:27:57

+0

尝试萤火虫,一个Firefox插件 – subosito 2010-11-12 05:33:55

回答

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的当前值,从而在触发点击事件使用局部变量而不是for循环中的i。

+0

天才!杜,我不敢相信我没有想过这个......谢谢,这会奏效。谢谢一堆 – 2010-11-12 17:25:16

0

通常这个问题是在最后一次迭代中,你有一个空对象或undefine对象。使用console.log()在你的cicle中检查这个doent发生了什么。

有时某个地方的原型会添加额外的元素。

0

我有'视差'插件相同的问题。 我将jQuery librery版本从更改为*jquery-1.10.2*. 并清除错误。

相关问题