2013-04-30 7 views
5

के लिए यह पूछ फ़ंक्शन को कॉल तो हम एक पृष्ठ है:addEventListener बिना मुझे और भी

<span id='container'> 
    <a href='#' id='first'>First Link</a> 
    <a href='#' id='second'>Second Link</a> 
</span> 

और कुछ क्लिक ईवेंट जोड़ना चाहते हैं:

first.addEventListener('click', function(){alert('sup!');}) 

वर्क्स एक आकर्षण की तरह! हालांकि, जब आप दूसरा तर्क बाहरी कार्य करते हैं:

function message_me(m_text){ 
    alert(m_text) 
} 

second.addEventListener('click', message_me('shazam')) 

यह तुरंत फ़ंक्शन को कॉल करता है। मैं इसे कैसे रोक सकता हूँ? गुस्सा कर देने वाला! http://jsfiddle.net/ey7pB/1/

+1

चूंकि दूसरा पैरामीटर एक समारोह ** संदर्भ ** की अपेक्षा करता है, तो आपको एक प्रदान करने की आवश्यकता है। आपके समस्याग्रस्त कोड के साथ, आप तुरंत फ़ंक्शन को कॉल कर रहे हैं और इसके परिणाम को पार कर रहे हैं (जो * अनिर्धारित * है)। या तो किसी अज्ञात फ़ंक्शन में फ़ंक्शन को कॉल करें (जैसे आपका पहला उदाहरण) या फ़ंक्शन को ** ** एक फ़ंक्शन ** संभवतः आदर्श नहीं) में बदलें। – Ian

+1

यह आदर्श क्यों नहीं है? यह डीआरवाई के खिलाफ लगता है। 4 या तो addEventListeners में मेरे फ़ंक्शन को कॉपी करने के लिए जो सेटिंग कर रहा है, नहीं? – LittleBobbyTables

+0

एक और विकल्प आवश्यक संदेश को तत्व पर एक विशेषता के रूप में संग्रहीत करना है, फिर फ़ंक्शन को 'second.addEventListener (' क्लिक करें ', message_me) के रूप में बाध्य करें और इसे पैरामीटर के बजाय विशेषता से संदेश पुनर्प्राप्त करें। – nnnnnn

उत्तर

7
function message_me(m_text){ 
    alert(m_text) 
} 

second.addEventListener('click', 
    function() { 
     message_me('shazam'); 
    } 
); 

यहाँ एक अद्यतन fiddle है:

यहाँ एक लाइव डेमो है।

+0

बूम! धन्यवाद। जब एसओ मुझे देता है तो यह जवाब स्वीकार करेगा: डी – LittleBobbyTables

+0

मुझे लगता है कि आपको अपना स्वीकार्य उत्तर अपडेट करना चाहिए क्योंकि इसे कॉल किए बिना फ़ंक्शन पास करना, और बाध्य करना - शायद यहां एक बेहतर विकल्प है। – IonicBurger

+0

क्या आप समझा सकते हैं कि आपको क्यों लगता है कि बाइंड बेहतर विकल्प है? – clav

4

के बाद से दूसरा पैरामीटर एक समारोह संदर्भ उम्मीद, आप एक प्रदान करने के लिए की जरूरत है। आपके समस्याग्रस्त कोड के साथ, आप तुरंत फ़ंक्शन को कॉल कर रहे हैं और परिणाम (जो undefined है ... क्योंकि सभी फ़ंक्शन alert है और कुछ भी वापस नहीं करता है)। या तो किसी अज्ञात फ़ंक्शन में फ़ंक्शन को कॉल करें (जैसे आपका पहला उदाहरण) या फ़ंक्शन को वापस करने के लिए फ़ंक्शन को बदलें।

आप ऐसा कर सकते हैं:

function message_me(m_text){ 
    alert(m_text); 
} 

second.addEventListener('click', function() { 
    message_me('shazam') 
}); 

या इस:

function message_me(m_text){ 
    return function() { 
     alert(m_text); 
    }; 
} 

second.addEventListener('click', message_me('shazam')); 

डेमो:http://jsfiddle.net/tcCvw/

2

या आप .bind

function message_me(m_text){ 
    alert(m_text); 
} 

second.addEventListener('click', message_me.bind(this, 'shazam')); 
उपयोग कर सकते हैं

MDN Documentation 'बंद करने' के बारे में

+0

यह स्वीकार्य उत्तर होना चाहिए – IonicBurger

+0

+1 बाध्यकारी जाने का तरीका होना चाहिए - यह सुनिश्चित नहीं है कि वह 4 साल पहले उपलब्ध था, लेकिन यह निश्चित रूप से आज के लिए पसंदीदा तरीका है, जैसा कि अनाम कार्य बनाने के विरोध में – vol7ron

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