दिलचस्प पोस्ट
मेलटो प्रोटोकॉल प्रोग्रामेटिक रूप से विंडोज प्रोग्राम को पंजीकृत करें "एन + के पैटर्न" क्या हैं और उन्हें हास्केल 2010 से क्यों प्रतिबंधित किया गया है? Java.net.SocketTimeoutException प्राप्त करना: एंड्रॉइड में कनेक्शन का समय समाप्त हुआ कैसे एक बिटमैप करने के लिए एक Drawable कन्वर्ट करने के लिए? मैवेन परियोजना का मुख्य वर्ग चलाने एआरसी के तहत ऑब्जेक्ट के लिए कमजोर संदर्भों (__unsafe_unretained) के एनएसएआरआरए जावा के लिए मूल कीवर्ड क्या है? एएसपी.नेट की छिपी हुई विशेषताओं कॉर्पोरेट फ़ायरवॉल के पीछे urllib2 का उपयोग करने वाली वेबसाइट खोलने – 11004 Getaddrinfo विफल कमगरीय और iText के बीच अंतर क्या है? जब उत्पादन कोड में दावा करना चाहिए? मैं अपने AngularJS ऐप के डाइजेस्ट चक्र के प्रदर्शन को कैसे मापूं? संसाधनों से बिटमैप इमेज असाइन करें। छवि। स्रोत पर? मैं ओरेकल में एक अल्पविराम से सीमांकित सूची में कई पंक्तियों को कैसे जोड़ सकता हूं? ACCESS_COARSE_LOCATION अनुमति एंड्रॉइड पर एक सेल टॉवर परिशुद्धता देता है

AddEventListener श्रोता फ़ंक्शन को जोड़ने के लिए तर्क कैसे पास करें?

स्थिति कुछ हद तक होती है-

var someVar = some_other_function(); someObj.addEventListener("click", function(){ some_function(someVar); }, false); 

समस्या यह है कि someVar का मान addEventListener के श्रोता फ़ंक्शन के अंदर दिखाई नहीं दे रहा है, जहां यह शायद एक नया चर के रूप में माना जा रहा है

Solutions Collecting From Web of "AddEventListener श्रोता फ़ंक्शन को जोड़ने के लिए तर्क कैसे पास करें?"

आपके द्वारा लिखे गए कोड में बिल्कुल कुछ भी गलत नहीं है। someVar और someVar दोनों को सुलभ होना चाहिए, यदि वे संदर्भ में जहां अज्ञात में उपलब्ध थे

 function() { some_function(someVar); } 

बनाया गया था।

जांचें कि क्या चेतावनी आपको वह मूल्य देता है जिसे आप खोज रहे हैं, सुनिश्चित करें कि यह गुमनाम समारोह के दायरे में someVar (जब तक आपके पास अधिक कोड न हो जो someVar को कॉल के बगल में एक ही someVar वैरिएबल पर संचालित होता है)

 var someVar; someVar = some_other_function(); alert(someVar); someObj.addEventListener("click", function(){ some_function(someVar); }, false); 

क्यों न केवल इस घटना के लक्ष्य के लक्षण से तर्क मिलता है?

उदाहरण:

 var someInput = document.querySelector('input'); someInput.addEventListener('click', myFunc, false); someInput.myParam = 'This is my parameter'; function myFunc(evt) { window.alert( evt.target.myParam ); } 

जावास्क्रिप्ट एक प्रोटोटाइप-उन्मुख भाषा है, याद है!

यह प्रश्न पुराना है लेकिन मैंने सोचा कि मैं ईएस 5 का उपयोग कर एक विकल्प की पेशकश करूँगा .बिंड () – भावी पीढ़ी के लिए 🙂

 function some_func(otherFunc, ev) { // magic happens } someObj.addEventListener("click", some_func.bind(null, some_other_func), false); 

बस पता है कि आपको पहले श्रम के साथ अपने श्रोता फ़ंक्शन को स्थापित करने की आवश्यकता है, जैसा कि आप बाध्य हो रहे तर्क (आपके अन्य फ़ंक्शन) और दूसरा परम अब घटना है (पहले की बजाय, जैसा कि यह होता है) ।

आप फ़ंक्शन को एक चर के रूप में घोषित करके इवेंटसूची के साथ जोड़ सकते हैं और तर्क हटा सकते हैं।

myaudio.addEventListener('ended',funcName=function(){newSrc(myaudio)},false);

newSrc मेरीऑडियो के साथ पैरामीटर के रूप में है funcName फ़ंक्शन नाम चर है

आप myaudio.removeEventListener('ended',func,false); साथ श्रोता को निकाल सकते हैं myaudio.removeEventListener('ended',func,false);

someVar मान someVar some_function() संदर्भ में ही पहुंच योग्य होना चाहिए, श्रोता की ओर से नहीं। यदि आप इसे श्रोता के भीतर करना चाहते हैं, तो आपको ऐसा कुछ करना होगा:

 someObj.addEventListener("click", function(){ var newVar = someVar; some_function(someVar); }, false); 

और इसके बजाय newVar उपयोग करें

दूसरे तरीके से some_function() से someVar मान इसे वापस श्रोता (एक नया स्थानीय रूप में some_function() के रूप में उपयोग करने के लिए वापस someVar :

 var someVar = some_function(someVar); 

आप एक जावास्क्रिप्ट फीचर के माध्यम से मूल्य (नहीं संदर्भ के द्वारा) के द्वारा पास हो सकता है जिसे क्लोजर के रूप में जाना जाता है:

 var someVar='before'; func = function(v){ console.log(v); } document.addEventListener('click',function(someVar){ return function(){func(someVar)} }(someVar)); someVar='after' 

या आप एक आम लपेटो फ़ंक्शन लिख सकते हैं जैसे wrapEventCallback :

 function wrapEventCallback(callback){ var args = Array.prototype.slice.call(arguments, 1); return function(e){ callback.apply(this, args) } } var someVar=1; func = function(v){ console.log(v); } document.addEventListener('click',wrapEventCallback(func,someVar)) someVar='after' 

यहाँ एक और तरीका है (यह एक लूप के अंदर काम करता है):

 var someVar = some_other_function(); someObj.addEventListener("click", function(theVar){ return function(){some_function(theVar)}; }(someVar), false); 

उपयोग

  el.addEventListener('click', function(){ // this will give you the id value alert(this.id); }, false); 

और अगर आप इस गुमनाम समारोह में किसी भी कस्टम मान को पारित करना चाहते हैं तो यह करने का सबसे आसान तरीका है

  // this will dynamically create property a property // you can create anything like el.<your variable> el.myvalue = "hello world"; el.addEventListener('click', function(){ //this will show you the myvalue alert(el.myvalue); // this will give you the id value alert(this.id); }, false); 

मेरी परियोजना में पूरी तरह से काम करता है आशा है कि इससे मदद मिलेगी

इन्हें भी प्रयास करें (IE8 + क्रोम। मैं एफएफ के लिए नहीं जानता हूं):

 function addEvent(obj, type, fn) { eval('obj.on'+type+'=fn'); } function removeEvent(obj, type) { eval('obj.on'+type+'=null'); } // Use : function someFunction (someArg) {alert(someArg);} var object=document.getElementById('somObject_id') ; var someArg="Hi there !"; var func=function(){someFunction (someArg)}; // mouseover is inactive addEvent (object, 'mouseover', func); // mouseover is now active addEvent (object, 'mouseover'); // mouseover is inactive 

आशा है कि कोई टाइपोस नहीं है 🙂

काफी और पुराने सवाल, लेकिन मेरे पास आज भी यही समस्या थी। मैंने पाया कि सबसे सुरक्षित उपाय है करीने की अवधारणा का उपयोग करना ।

इसके लिए कोड:

 someObj.addEventListener('click', some_function(someVar)); var some_function = function(someVar) { return function(e) { // do something here } } 

आप 'बाइंड' के साथ सभी आवश्यक तर्क बाँध सकते हैं:

 root.addEventListener('click', myPrettyHandler.bind(null, event, arg1, ... )); 

इस तरह से आपको हमेशा ईवेंट, आर्ग 1, और अन्य चीजें मेरे प्रेट्टीहैंडलर को मिलेगी

http://passy.svbtle.com/partial-application-in-javascript-using-bind

किसी ईवेंट में तर्क भेजना स्वामी की कॉलबैक फ़ंक्शन के लिए एक पृथक फ़ंक्शन का निर्माण करना और उस पृथक फ़ंक्शन पर तर्क देना आवश्यक है।

यहाँ एक अच्छा सा सहायक फ़ंक्शन है जिसका उपयोग आप कर सकते हैं ऊपर "नमस्ते विश्व के" उदाहरण के आधार पर।)

एक बात जो भी जरूरी है वह फ़ंक्शन के संदर्भ को बनाए रखने के लिए है ताकि हम श्रोता को सफाई से निकाल सकें।

 // Lambda closure chaos. // // Send an anonymous function to the listener, but execute it immediately. // This will cause the arguments are captured, which is useful when running // within loops. // // The anonymous function returns a closure, that will be executed when // the event triggers. And since the arguments were captured, any vars // that were sent in will be unique to the function. function addListenerWithArgs(elem, evt, func, vars){ var f = function(ff, vv){ return (function (){ ff(vv); }); }(func, vars); elem.addEventListener(evt, f); return f; } // Usage: function doSomething(withThis){ console.log("withThis", withThis); } // Capture the function so we can remove it later. var storeFunc = addListenerWithArgs(someElem, "click", doSomething, "foo"); // To remove the listener, use the normal routine: someElem.removeEventListener("click", storeFunc); 

एक तरीका यह बाहरी कार्य के साथ कर रहा है :

 elem.addEventListener('click', (function(numCopy) { return function() { alert(numCopy) }; })(num)); 

कोष्ठकों में एक गुमनाम समारोह लपेटने और इसे तुरंत फोन करने की यह विधि को एक आईआईएफई (तत्काल सम्मिलित समारोह अभिव्यक्ति) कहा जाता है

आप http://codepen.io/froucher/pen/BoWwgz में दो मापदंडों के साथ एक उदाहरण की जांच कर सकते हैं।

 catimg.addEventListener('click', (function(c, i){ return function() { c.meows++; i.textContent = c.name + '\'s meows are: ' + c.meows; } })(cat, catmeows)); 

मैं इस में फंस गया था क्योंकि मैं इसे तत्वों को खोजने के लिए एक पाश में उपयोग कर रहा था और इसके लिए सूचीकर्ता जोड़ रहा था। यदि आप इसे एक पाश में उपयोग कर रहे हैं, तो यह पूरी तरह से काम करेगा

 for (var i = 0; i < states_array.length; i++) { var link = document.getElementById('apply_'+states_array[i].state_id); link.my_id = i; link.addEventListener('click', function(e) { alert(e.target.my_id); some_function(states_array[e.target.my_id].css_url); }); } 

इसे इस्तेमाल करे

 someObj.addEventListener("click", function(){ some_function(someVar); }.bind(this) ); 
  var EV = { ev: '', fn: '', elem: '', add: function () { this.elem.addEventListener(this.ev, this.fn, false); } }; function cons() { console.log('some what'); } EV.ev = 'click'; EV.fn = cons; EV.elem = document.getElementById('body'); EV.add(); //If you want to add one more listener for load event then simply add this two lines of code: EV.ev = 'load'; EV.add(); 

निम्नलिखित दृष्टिकोण मेरे लिए अच्छी तरह से काम किया यहां से संशोधित

 function callback(theVar) { return function() { theVar(); } } function some_other_function() { document.body.innerHTML += "made it."; } var someVar = some_other_function; document.getElementById('button').addEventListener('click', callback(someVar)); 
 <!DOCTYPE html> <html> <body> <button type="button" id="button">Click Me!</button> </body> </html> 

अन्य वैकल्पिक, शायद बाइंड के उपयोग के रूप में सुरुचिपूर्ण नहीं हैं, लेकिन यह एक पाश में घटनाओं के लिए मान्य है

 for (var key in catalog){ document.getElementById(key).my_id = key document.getElementById(key).addEventListener('click', function(e) { editorContent.loadCatalogEntry(e.srcElement.my_id) }, false); } 

यह Google क्रोम एक्सटेंशन के लिए परीक्षण किया गया है और संभवतः e.srcElement को अन्य ब्राउज़रों में e.source द्वारा प्रतिस्थापित किया जाना चाहिए

मुझे इमेटोरिया द्वारा पोस्ट की गई टिप्पणी का उपयोग करते हुए यह समाधान मिला लेकिन मैं इसे उपयोगी के रूप में चिह्नित नहीं कर सकता क्योंकि मेरे पास पर्याप्त प्रतिष्ठा नहीं है: डी

निम्नलिखित उत्तर सही है लेकिन नीचे दिए गए कोड IE8 में काम नहीं कर रहा है यदि आपको लगता है कि आप ju फ़ाइल को yuicompressor का उपयोग करते हुए संपीड़ित करते हैं। (वास्तव में, अभी भी IE8 का उपयोग करते हुए अधिकांश अमेरिकी लोग)

 var someVar; someVar = some_other_function(); alert(someVar); someObj.addEventListener("click", function(){ some_function(someVar); }, false); 

इसलिए, हम उपर्युक्त समस्या को निम्नानुसार ठीक कर सकते हैं और यह सभी ब्राउज़रों में ठीक काम करता है

 var someVar, eventListnerFunc; someVar = some_other_function(); eventListnerFunc = some_function(someVar); someObj.addEventListener("click", eventListnerFunc, false); 

आशा है, यह कुछ ऐसे व्यक्ति के लिए उपयोगी होगा जो उत्पादन वातावरण में जेएस फ़ाइल को संपीड़ित कर रहा है।

शुभ लाभ!!

निम्नलिखित कोड मेरे लिए ठीक काम (फ़ायरफ़ॉक्स):

 for (var i=0; i<3; i++) { element = new ... // create your element element.counter = i; element.addEventListener('click', function(e){ console.log(this.counter); ... // another code with this element }, false); } 

आउटपुट:

 0 1 2 

सभी कार्यों के अंदर एक विशेष चर है: तर्क । आप अपने मापदंडों को गुमनाम पैरामीटर के रूप में पास कर सकते हैं और तर्कों के माध्यम से उन्हें (ऑर्डर के अनुसार) एक्सेस कर सकते हैं।

उदाहरण:

 var someVar = some_other_function(); someObj.addEventListener("click", function(someVar){ some_function(arguments[0]); }, false);