Плагин jQuery, возвращающий «Не удается прочитать свойство undefined» - PullRequest
11 голосов
/ 12 ноября 2010

Я пытаюсь сделать то, что делал много раз.Я не могу понять, почему это не работает.Независимо от того, как я пишу код JQuery, он не работает.menuitems[i].action() просто НЕ работает.Ниже Пример 1 , в котором этот пример, независимо от того, по какому элементу щелкнули, возвращает действие последнего элемента (в данном примере это alert('Forward!')).2nd возвращает неопределенное свойство.Полная ошибка ниже.

Мой плагин 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: Невозможно прочитать свойство 'action' из неопределенного

Другие случайные вещи, которые я пробовал, были отсоединение клика и повторное присоединение его за пределами этого блока appendTo(), изменив action() на newtest(), чтобы убедиться, что ононе конфликтует с какими-либо встроенными ключевыми словами.Я также попытался сделать $('body').append('<li>{blah blah}</li>').find('li').click(function(){/*blah blah*/});, но он все еще возвращал то же самое.У меня нет идей!

Ответы [ 3 ]

16 голосов
/ 12 ноября 2010

Проблема в том, что "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срабатывает локальная переменная используется вместо i из цикла for.

0 голосов
/ 04 сентября 2014

У меня была такая же проблема с плагином "параллакс". Я изменил версию библиотеки jQuery на *jquery-1.6.4* с *jquery-1.10.2*. И ошибка очищена.

0 голосов
/ 12 ноября 2010

Обычно эта проблема заключается в том, что на последней итерации у вас есть пустой или неопределенный объект.используйте console.log () внутри своей статьи, чтобы убедиться, что это происходит.

Иногда прототип в каком-то месте добавляет дополнительный элемент.

...