Действие над плагином jQuery всегда последний вариант? - PullRequest
0 голосов
/ 08 февраля 2011

Мой плагин, который я пишу, является контекстным меню для внутреннего приложения, вызываемого правой кнопкой мыши, и я не могу понять, почему это происходит.

Вот мой код тестирования:

$('.item').rightClickMenu([
{
  icon:'http://cdn1.iconfinder.com/data/icons/silk2/exclamation.png',
  title:'Alert',
  action:function(){
    alert('Here is an example alert!');
  }
},
{
  icon:'http://cdn1.iconfinder.com/data/icons/silk2/error.png',
  title:'Console.Log',
  action:function(){
    console.log('Here is an example console.log()!');
  }
}
]);

Соответствующий код плагина jQuery:

for(x in items){
          $list.append('<li class="rightClickMenuOption'+x+'"><img src="'+items[x].icon+'">'+items[x].title+'</li>')
            .find('.rightClickMenuOption'+x)
              .bind('click',function(){
                items[x].action();
              });
        }

Демо-версия: http://jsbin.com/uxali4/3/

1 Ответ

4 голосов
/ 08 февраля 2011

Это исправит это: http://jsbin.com/uxali4/4/edit

Вы создаете замыкание.Все ваши вызванные методы в цикле for..in копируют один и тот же родительский контекст во внутреннее свойство [[Scope]] из их объекта активации .Следовательно, все методы обращаются к одной и той же переменной x.Вам нужно вызвать другую функцию, чтобы исправить это.

for(x in items){
      (function(index) {
        $list.append('<li class="rightClickMenuOption'+index+'"><img src="'+items[index].icon+'">'+items[index].title+'</li>')
          .find('.rightClickMenuOption'+index)
            .bind('click',function(){
              items[index].action();
            });
      }(x));
}

Обновление

Посмотрите на http://jsperf.com/for-in-vs-for

Это должно продемонстрировать довольно впечатляющеразница в скорости между for и for..in

...