问题 jQuery插件返回“无法读取未定义的属性”


我正在努力做一些我做过很多次的事情。我无法弄清楚为什么这不起作用。无论我如何编写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);
}

这将返回带有Forward的警报!无论点击哪一项,后退或前进。

例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*/}); 但它仍然返回相同的东西。我想法了!


8101
2017-11-12 05:13


起源

您是否尝试使用调试器来完成此操作? - Phil
有关于调试器的任何建议吗?我只是使用Chrome的检查员 - Oscar Godson
尝试firebug,一个firefox插件 - subosito
Firebug中的错误相同...... - Oscar Godson
Firebug中的确切名称是:menuitems [i]是未定义的文件:/// C:/Users/oscargodson/Documents/jquery_apps/contextmenu.html第65行 - Oscar Godson


答案:


问题是“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。


16
2017-11-12 09:43



天才!呃,我简直不敢相信我没想到这个......谢谢,这会有用。谢谢你们 - Oscar Godson


通常问题是在最后一次迭代中你有一个空对象或未定义对象。在你的cicle中使用console.log()来检查这个事件是否发生。

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


0
2017-11-12 06:33





我对'parallax'插件有同样的问题。 我将jQuery librery版本更改为 *jquery-1.6.4* 从 *jquery-1.10.2*. 错误已清除。


0
2017-09-04 15:48