2012-02-12 16 views
109

मैं एक बटन है, और मैं इसे करने के लिए कुछ eventlistners कहा:किसी तत्व में सभी श्रोताओं को कैसे हटाया जाए?

document.getElementById("btn").removeEventListener("click",funcA); 

क्या होगा यदि मैं चाहता हूँ मैं एक ही बार में सभी श्रोताओं को दूर करने के लिए, या मैं चाहता हूँ:

document.getElementById("btn").addEventListener("click", funcA, false); 
document.getElementById("btn").addEventListener("click", funcB, false); 
document.getElementById("btn").addEventListener("click", funcC, false); 
document.getElementById("btn").addEventListener("blur" , funcD, false); 
document.getElementById("btn").addEventListener("focus", funcE, false); 

<button id="btn">button</button> 

मैं उन्हें निकाल सकते हैं फ़ंक्शन संदर्भ नहीं है (funcA)? क्या ऐसा करने का कोई तरीका है, या मुझे उन्हें एक-एक करके हटाना है?

+0

http://stackoverflow.com/questions/3222486/remove-all-javascript-event-listeners-of-an-element-and-its-children – Misiur

+28

ढांचे का उपयोग न करके सक्षम कोड करने का प्रयास करने के लिए उप-वोट/पुस्तकालयों। :-) – John

+1

@user प्रभावशाली, आपको वास्तव में एक प्रश्न मिला जो इस पुराने प्रश्न से भी पुराना है, जहां उत्तर यहां अभी भी jQuery 1.7 का उल्लेख कर रहे हैं। विश्वास नहीं कर सकता कि मैंने इस सवाल से पूछा कि कितना समय बीत चुका है। –

उत्तर

107

मुझे लगता है कि सिर्फ नोड है, जो सभी घटना श्रोताओं को हटा देगा क्लोन करने के लिए है यह करने के लिए सबसे तेज़ तरीका:,

var old_element = document.getElementById("btn"); 
var new_element = old_element.cloneNode(true); 
old_element.parentNode.replaceChild(new_element, old_element); 

बस सावधान रहना होगा के सभी बच्चे तत्वों पर यह भी साफ़ हो जाएंगे घटना श्रोताओं के रूप में प्रश्न में नोड, इसलिए यदि आप यह संरक्षित करना चाहते हैं कि आपको एक समय में श्रोताओं को स्पष्ट रूप से हटाने का सहारा लेना होगा।

+0

धन्यवाद! और मैंने आपके कोड को इस तरह का काम किया है जैसे कि 'unbind (ele) {ele.parentNode.replaceChild (ele.cloneNode (true), ele);} ' –

+18

@ डेरेक: एक नोड क्लोनिंग और संपूर्ण उपट्री एक बुरा विचार है। यह 'node.removeEventListener' के साथ नोड से सभी 'EventListener' को हटाने से ** बहुत ** धीमा है। इसके अलावा आपको एक मेमोरी लीक (नोड + सबट्री) मिलेगा और निश्चित रूप से सभी 'इवेंट लिस्टनर को उपट्री से हटा दिया गया था।यदि आप 'document.body' पर अपने फ़ंक्शन का उपयोग करते हैं तो आप सबकुछ उड़ा देंगे। – Saxoier

+1

@ सैक्सोइयर, अनुस्मारक के लिए धन्यवाद लेकिन मैंने इस पृष्ठ के 'बॉडी' पर परीक्षण किया और यह एक आकर्षण की तरह काम किया। शायद मैं एक तेज ब्राउज़र (Google क्रोम) का उपयोग कर रहा हूँ। –

22

आप jQuery के खिलाफ नहीं रहे हैं, यह एक पंक्ति में किया जा सकता है:

jQuery 1.7+

$("#myEl").off() 

jQuery < 1,7

$('#myEl').replaceWith($('#myEl').clone()); 

यहाँ एक उदाहरण:

http://jsfiddle.net/LkfLezgd/3/

+0

बहुत लंबा, इसके बजाय jQuery में आपको यह '$ ("# myEl") करना चाहिए। सभी श्रोताओं को हटाने के लिए unbind(); 'या' .off() '(1.7+)। –

+11

क्या करें() 'या' unbind() 'केवल उन श्रोताओं को jQuery के माध्यम से हटा दें? – davide

+0

बस .off() पर दस्तावेज़ों को दोबारा पढ़ें, और यह आपको सभी ईवेंट बाध्यकारी को हटाने के लिए सभी पैरामीटर को छोड़ने की अनुमति देता है। .unbind() के साथ, हालांकि, EventType अनिवार्य है और इस उद्देश्य के लिए इस प्रकार उपयोग करने योग्य नहीं है। – Duke

5

यहाँ एक समारोह है कि यह भी cloneNode पर आधारित है, लेकिन विकल्प के साथ ही माता-पिता नोड क्लोन और ले जाने के लिए सभी बच्चों को (उनके घटना श्रोताओं संरक्षित करने के लिए):

function recreateNode(el, withChildren) { 
    if (withChildren) { 
    el.parentNode.replaceChild(el.cloneNode(true), el); 
    } 
    else { 
    var newEl = el.cloneNode(false); 
    while (el.hasChildNodes()) newEl.appendChild(el.firstChild); 
    el.parentNode.replaceChild(newEl, el); 
    } 
} 

निकालें घटना श्रोताओं

recreateNode(document.getElementById("btn")); 

एक तत्व पर निकालें घटना श्रोताओं और उसके बच्चों के सभी:

एक तत्व पर 210
recreateNode(document.getElementById("list"), true); 

आप वस्तु ही रखने के लिए और इसलिए cloneNode उपयोग नहीं कर सकते की जरूरत है, तो आप addEventListener समारोह लपेटो और अपने आप से श्रोता सूची पर नज़र रखने, this answer में की तरह किया है।

+1

@ मैक्स: मैं आपके संपादन सुझाव की सराहना करता हूं, लेकिन मेरा मानना ​​है कि इस कोड को ES2015 में रीमेक करना इस मामले के लिए उचित नहीं है, तो कोड को व्यापक रूप से समर्थित नहीं किया जाएगा। सभी बच्चों को हटाने के लिए – user

+0

आपको सीए उपयोग करते हैं: element.innerHTML + = ''; –

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