2010-11-12 94 views
11

我正在嘗試做我做過很多次的事情。我無法弄清楚爲什麼這不起作用。無論我如何編寫jQuery代碼,它都不起作用。 menuitems[i].action()只是不起作用。下面是示例1在這個示例中,無論點擊哪個項目,它都會返回最後一項的動作(在本例中爲alert('Forward!'))。第二個返回未定義的屬性。下面的完整錯誤。jQuery插件返回「無法讀取未定義的屬性」

我的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: Cannot read property 'action' of undefined

其他隨機的東西,我試圖進行拆卸點擊重新連接它是appendTo()塊之外,改變action()newtest()使確定它沒有與任何內置關鍵字衝突。我也試過做$('body').append('<li>{blah blah}</li>').find('li').click(function(){/*blah blah*/});,但它仍然返回相同的東西。我要離開創意!

+0

你有沒有嘗試用調試器通過這個步驟? – Phil 2010-11-12 05:26:36

+0

對調試器有任何建議嗎?我只是使用鉻的檢查員 – 2010-11-12 05:27:57

+0

嘗試螢火蟲,一個Firefox插件 – subosito 2010-11-12 05:33:55

回答

16

問題在於「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的當前值,從而在觸發點擊事件使用局部變量而不是for循環中的i。

+0

天才!杜,我不敢相信我沒有想過這個......謝謝,這會奏效。謝謝一堆 – 2010-11-12 17:25:16

0

通常這個問題是在最後一次迭代中,你有一個空對象或undefine對象。使用console.log()在你的cicle中檢查這個doent發生了什麼。

有時某個地方的原型會添加額外的元素。

0

我有'視差'插件相同的問題。 我將jQuery librery版本從更改爲*jquery-1.10.2*. 並清除錯誤。

相關問題