दिलचस्प पोस्ट
एक INTERNAL_ERROR हुआ जब GoogleSignInOptions से ईमेल अनुरोध Android एंड्रॉइड दो उंगली रोटेशन PHP / regex: HTML टैग की स्ट्रिंग मान कैसे प्राप्त करें? स्पूल कमांड: फ़ाइल को आउटपुट एसक्यूएल स्टेटमेंट न करें प्लस चिन्ह '+ नई तिथि' में क्या होता है शुद्ध सीएसएस चेकबॉक्स छवि प्रतिस्थापन एंड्रॉइड एसडीके मैनेजर नहीं स्थापित अवयव मैं सी # में कार्य प्रबंधक में एक प्रक्रिया कैसे छुपाऊँ? इस तरह से एक पुन: प्रयास करने योग्य कॉल को लागू करने के लिए स्काला तरीका क्या है? आईपैड सफारी मोबाइल एचटीएम 5 वीडियो तत्वों के लिए जेड इंडेक्सिंग स्थिति को नजरअंदाज करते हैं यूनिकोड में यूटीएफ -8 स्ट्रिंग कैसे परिवर्तित करें? AttributeError: 'मॉड्यूल' वस्तु का कोई विशेषता नहीं है पदावनत: mysql_connect () जावास्क्रिप्ट – यह कोड कैसे काम करता है? एक 16-बिट RGB565 को 24-बिट RGB888 में कैसे परिवर्तित करता है?

विशिष्ट प्रकार के सभी ईवेंट श्रोताओं को निकालें

मैं addEventListener() का उपयोग कर जोड़ा गया एक विशिष्ट प्रकार के सभी ईवेंट श्रोताओं को निकालना चाहता हूं सभी संसाधन जो मैं देख रहा हूं कह रहे हैं कि आपको ऐसा करने की आवश्यकता है:

 elem.addEventListener('mousedown',specific_function); elem.removeEventListener('mousedown',specific_function); 

लेकिन मैं यह जानने के बिना इसे साफ़ करने में सक्षम होना चाहता हूं कि वर्तमान में यह क्या है:

 elem.addEventListener('mousedown',specific_function); elem.removeEventListener('mousedown'); 

वेब के समाधान से एकत्रित समाधान "विशिष्ट प्रकार के सभी ईवेंट श्रोताओं को निकालें"

addEventListener कॉल को addEventListener किए बिना और श्रोताओं का addEventListener रखने या एक ऐसे पुस्तकालय का उपयोग करना संभव नहीं है जो इस तरह की सुविधाओं को दुर्भाग्य से अनुमति देता है। यह तब होता जब श्रोताओं का संग्रह सुलभ था लेकिन सुविधा लागू नहीं की गई थी ।

सबसे करीबी बात यह है कि आप सभी श्रोताओं को तत्व क्लोनिंग करके निकाल दें, जो श्रोताओं के संग्रह को क्लोन नहीं करेगा।

नोट: इससे तत्व के बच्चों पर श्रोताओं को भी हटा दिया जाएगा।

 var el = document.getElementById('el-id'), elClone = el.cloneNode(true); el.parentNode.replaceChild(elClone, el); 

यदि श्रोताओं को हटाकर अपना एकमात्र लक्ष्य उन्हें चलाने से रोकना है, तो आप दी गई प्रकार की सभी घटनाओं को विंडो कैप्चर करने और रद्द करने के लिए ईवेंट श्रोता को जोड़ सकते हैं:

 window.addEventListener(type, function (event) { event.stopPropagation(); }, true); 

तीसरे पैरामीटर के लिए true में उत्तीर्ण होने से नीचे के रास्ते पर ईवेंट को कैप्चर किया जाता है। प्रचार रोकना का अर्थ है कि घटना उस श्रोताओं तक नहीं पहुंचती है जो इसके लिए सुन रहे हैं।

आप वैकल्पिक रूप से 'yourElement.addEventListener ()' विधि को अधिलेखित कर सकते हैं और सामान्य रूप से श्रोता को निष्पादित करने के लिए '.apply ()' विधि का उपयोग कर सकते हैं, लेकिन प्रक्रिया में फ़ंक्शन को अवरुद्ध कर सकते हैं। पसंद:

 <script type="text/javascript"> var args = []; var orginalAddEvent = yourElement.addEventListener; yourElement.addEventListener = function() { //console.log(arguments); args[args.length] = arguments[0]; args[args.length] = arguments[1]; orginalAddEvent.apply(this, arguments); }; function removeListeners() { for(var n=0;n<args.length;n+=2) { yourElement.removeEventListener(args[n], args[n+1]); } } removeListeners(); </script> 

यह स्क्रिप्ट पृष्ठ लोड पर चलना चाहिए या यह सभी ईवेंट श्रोताओं को रोक नहीं सकता है।

उपयोग करने से पहले 'removeListeners ()' कॉल को निकालना सुनिश्चित करें

मुझे पता है यह पुराना है, लेकिन मेरे पास कोई वास्तविक उत्तर नहीं था, जहां मैं दस्तावेज़ से सभी "कुंजीडाउन" ईवेंट श्रोताओं को निकालना चाहता था उन्हें निकालने के बजाय, मैं addEventListener को ओवरराइड करने के लिए इससे पहले कि वे भी जोड़ा गया था, इससे पहले टॉम के उत्तर के समान, इससे पहले किसी भी अन्य लिपियों को लोड किया जा रहा है।

 <script type="text/javascript"> var current = document.addEventListener; document.addEventListener = function (type, listener) { if(type =="keydown") { //do nothing } else { var args = []; args[0] = type; args[1] = listener; current.apply(this, args); } }; </script> 

आपको 'श्रोताओं को जोड़ें' कॉल लॉग करने के लिए एक फ़ैशन फ़ंक्शन का निर्माण करने के लिए EventTarget.prototype.addEventListener को ओवरराइड करना होगा। कुछ इस तरह:

 var _listeners = []; EventTarget.prototype.addEventListenerBase = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function(type, listener) { _listeners.push({target: this, type: type, listener: listener}); this.addEventListenerBase(type, listener); }; 

तब आप एक EventTarget.prototype.removeEventListener बना सकते हैं:

 EventTarget.prototype.removeEventListeners = function(targetType) { for(var index = 0; index != _listeners.length; index++) { var item = _listeners[index]; var target = item.target; var type = item.type; var listener = item.listener; if(target == this && type == targetType) { this.removeEventListener(type, listener); } } } 

ES6 में आप मूल कार्य को छुपाने के लिए एक प्रतीक का उपयोग कर सकते हैं, और त्वरित रूप से ऑब्जेक्ट स्वयं में सभी अतिरिक्त श्रोता की सूची को सीधे छुपा सकते हैं।

 (function() { let target = EventTarget.prototype; let functionName = 'addEventListener'; let func = target[functionName]; let symbolHidden = Symbol('hidden'); function hidden(instance) { if(instance[symbolHidden] === undefined) { let area = {}; instance[symbolHidden] = area; return area; } return instance[symbolHidden]; } function listenersFrom(instance) { let area = hidden(instance); if(!area.listeners) { area.listeners = []; } return area.listeners; } target[functionName] = function(type, listener) { let listeners = listenersFrom(this); listeners.push({ type, listener }); func.apply(this, [type, listener]); }; target['removeEventListeners'] = function(targetType) { let self = this; let listeners = listenersFrom(this); let removed = []; listeners.forEach(item => { let type = item.type; let listener = item.listener; if(type == targetType) { self.removeEventListener(type, listener); } }); }; })(); 

आप इस छोटे से स्निपर के साथ इस कोड का परीक्षण कर सकते हैं:

 document.addEventListener("DOMContentLoaded", event => { console.log('event 1'); }); document.addEventListener("DOMContentLoaded", event => { console.log('event 2'); }); document.addEventListener("click", event => { console.log('click event'); }); document.dispatchEvent(new Event('DOMContentLoaded')); document.removeEventListeners('DOMContentLoaded'); document.dispatchEvent(new Event('DOMContentLoaded')); // click event still works, just do a click in the browser 

तत्व के सभी श्रोताओं को एक जेएस लाइन से निकालें:

 element.parentNode.innerHTML += '';