2010-11-11 4 views
0

Я не уверен, как это сделать, я думал, что делаю это правильно, но, видимо, нет. Во втором блоке кода вы увидите вызов console.log(), и, как думал , вы пропустили бы все item, но это не работает. Как мне это сделать? Кроме того, это незавершенная работа, следовательно, весь прокомментированный код, но это основная часть!Loop через параметры плагина jQuery

Заранее благодарен!

Итак, у меня есть это для моего JQuery плагина вызова:

$('p').contextMenu({ 
       item:{ 
        name:'Back', 
        action:function(){ 
         alert('Back!'); 
        }, 
        icon:'http://cdn.iconfinder.net/data/icons/crystalproject/16x16/actions/agt_back.png' 
       }, 
       item:{ 
        name:'Forward', 
        action:function(){ 
         alert('Forward!'); 
        }, 
        icon:'http://cdn.iconfinder.net/data/icons/crystalproject/16x16/actions/agt_forward.png' 
       } 
      }); 

А вот мой реальный код JQuery плагин:

(function($){ 
       $.fn.extend({ 
        //plugin name - animatemenu 
        contextMenu: function(menuitems,options) { 
         if(!options){options == null;} 
         //Settings list and the default values 
         var defaults = { 
         }; 

         var options = $.extend(defaults, options); 

         return this.each(function() { 
          var o =options; 

          //Assign current element to variable, in this case is UL element 
          var $obj = $(this);    

          $obj.mousedown(function(event) { 
           switch (event.which) { 
            case 1: //Left 
            //alert('Left mouse button pressed'); 
            break; 
            case 2: //Middle 
            //alert('Middle mouse button pressed'); 
            break; 
            case 3: //Right 
            //menuitems.item.action(); 
            for(x in menuitems){ 
             console.log(menuitems.item[x]) 
            } 
            break; 
            default: //Unknown 

           } 
          }); 

         }); 
        } 
       }); 
      })(jQuery); 

ответ

2

Ваших пункты меню объекта может иметь только одно item свойства и становится перезаписан в вашей декларации. Сделайте пункты меню массив вместо:

$('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' 
    } 
]); 

Если вы думаете, что должно быть немного упрощен для разработчиков вы имеете в виду, возможно, просто определить элементы в качестве переменной первого.

var items = [ {name: 'Forward'}, {name: 'Back'} ]; 
$('p').contextMenu(items); 

Тогда вы можете получить доступ к обоим пунктам так, как вы изначально предполагались:

var len = menuitems.length; 
for (var i = 0; i < len; i++;){ 
    console.log(menuitems[i]); 
} 

Так же, как примечание стороны, я изменила свой for in цикл на регулярной for. Цикл for in действительно неэффективен и его следует избегать. (Мой цикл замены может быть написан более эффективно, но тогда синтаксис начинает выглядеть странно, и ваш комментарий, похоже, указывает на то, что разработчики, с которыми вы работаете, могут немного запутаться (никакого неуважения там не было)).

+0

Это возвращает только один объект tho, и он возвращает только последний, "item: 'Forward'". Любые идеи почему? –

+0

он означает 'console.log (menuitems [x]);' в блоке 'for (x in menuitems)'. –

+0

Он возвращает только один элемент, потому что вы переписываете свойство 'item' вашего объекта menuitems. Если вы определяете элементы как массив, вам может быть проще получить то, что вы ищете, то есть '{items: [{name: 'Back'}, {name: 'Forward'}]}' – stevelove

Смежные вопросы