2010-11-12 14 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() ब्लॉक के बाहर यह reattaching थे, newtest() को action() बदल बनाने के लिए यकीन है कि यह किसी भी निर्मित कीवर्ड के साथ विरोधाभासी नहीं था। मैंने $('body').append('<li>{blah blah}</li>').find('li').click(function(){/*blah blah*/}); करने का भी प्रयास किया लेकिन यह अभी भी वही चीज़ लौटा। मैं विचार से बाहर हूँ!

+0

क्या आपने डीबगर के साथ इस माध्यम से कदम उठाने का प्रयास किया है? – Phil

+0

डीबगर पर कोई सिफारिशें हैं? मैं सिर्फ क्रोम के इंस्पेक्टर का उपयोग कर रहा हूं –

+0

फ़ायरबग आज़माएं, फ़ायरफ़ॉक्स एडन – subosito

उत्तर

16

समस्या यह है कि "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); 
} 

ऊपर नमूने में, गुमनाम समारोह एक नया गुंजाइश जो मैं के वर्तमान मूल्य कैप्चर करता है, ताकि जब क्लिक करें घटना शुरू हो रहा है बनाता है लूप के लिए मैं स्थानीय चर का उपयोग किया जाता है।

+0

प्रतिभा को छोड़कर सभी वस्तुओं को हटा दें! दुह, मुझे विश्वास नहीं है कि मैंने इसके बारे में नहीं सोचा था ... धन्यवाद, यह काम करेगा। बहुत बहुत धन्यवाद –

0

आमतौर पर समस्या यह है कि अंतिम पुनरावृत्ति में आपके पास एक खाली वस्तु या अपरिभाषित वस्तु है। console.log() का उपयोग करें, यह जांचने के लिए कि यह डेंट खुश है।

कभी-कभी किसी स्थान पर प्रोटोटाइप अतिरिक्त तत्व जोड़ता है।

0

मुझे 'लंबन' प्लगइन के साथ एक ही समस्या थी। मैंने *jquery-1.10.2*. से *jquery-1.6.4* पर jQuery librery संस्करण बदल दिया और त्रुटि साफ़ हो गई।

संबंधित मुद्दे