代码之家  ›  专栏  ›  技术社区  ›  Oscar Godson

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

  •  11
  • Oscar Godson  · 技术社区  · 14 年前

    我想做我做过很多次的事。我不明白为什么这不管用。不管我如何编写jQuery代码,它都不起作用。 menuitems[i].action() 只是不起作用。下面是 例1 在本例中,无论单击哪个项,它都返回最后一个项的操作(在本例中是 alert('Forward!') ). 第二个返回未定义的属性。下面的完整错误。

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

    我得到:

    未捕获类型错误:无法读取 未定义的属性“action”

    我尝试过的其他随机操作是分离咔嗒声并在其外部重新连接 appendTo() 阻止,更改 action() newtest() 以确保它不与任何内置关键字冲突。我也试过 $('body').append('<li>{blah blah}</li>').find('li').click(function(){/*blah blah*/}); 但它还是返回了同样的东西。我没主意了!

    3 回复  |  直到 14 年前
        1
  •  16
  •   nxt    14 年前

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

        2
  •  0
  •   Siedrix    14 年前

    通常,问题是在最后一次迭代中有一个空对象或未定义对象。在cicle中使用console.log()检查是否没有发生这种情况。

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

        3
  •  0
  •   byJeevan    10 年前

    “视差”插件也有同样的问题。 我将jQuery librery版本更改为 *jquery-1.6.4* *jquery-1.10.2*. 并清除错误。