2010-09-21 11 views
10

आदेश में ईवेंट जोड़ने के लिए इनलाइन घटनाओं बनाम का उपयोग attachEvent/addEventListener हम इस सरल 1 समाधान इस्तेमाल कर सकते हैं:जावास्क्रिप्ट घटनाओं को जोड़ने पार ब्राउज़र समारोह कार्यान्वयन:

function AddEvent(html_element, event_name, event_function) 
{  
    if(html_element.attachEvent) //Internet Explorer 
     html_element.attachEvent("on" + event_name, function() {event_function.call(html_element);}); 
    else if(html_element.addEventListener) //Firefox & company 
     html_element.addEventListener(event_name, event_function, false); //don't need the 'call' trick because in FF everything already works in the right way   
} 

या इस 2 समाधान (कि कहते हैं इनलाइन घटनाओं):

function AddEvent(html_element, event_name, event_function) 
{  
    var old_event = html_element['on' + event_name]; 
    if(typeof old_event !== 'function') 
     html_element['on' + event_name] = function() { event_function.call(html_element); }; 
    else 
     html_element['on' + event_name] = function() { old_event(); event_function.call(html_element); }; 
} 

ये दोनों पार ब्राउज़रों कर रहे हैं और इस तरह से इस्तेमाल किया जा सकता है:

AddEvent(document.getElementById('some_div_id'), 'click', function() 
{    
    alert(this.tagName); //shows 'DIV' 
}); 

जब से मैं महसूस कर रही attachEvent/addEventListener घटनाओं कार्यान्वयन से निपटने में अधिक के आसपास उपयोग किया जाता है है, मैं सोच रहा हूँ:

हैं वहाँ किसी भी नुकसान/2 समाधान का उपयोग कर के खिलाफ कमियां है कि मैं बेहतर के बारे में पता हो सकता है ? इनलाइन

  • घटनाएं जोड़ने 2 समाधान का उपयोग मैं आसानी से निकाल सकते हैं द्वारा

    1. 2 समाधान शिकंजा अप तत्व के innerHTML:

      मैं दो देख सकते हैं, लेकिन मैं और अधिक में दिलचस्पी रखता हूँ (यदि हो तो) सभी कार्यों को एक निश्चित घटना प्रकार (html_element['on' + event_name] = null) के साथ जुड़े हैं, लेकिन मैं detachEvent/removeEventListener उपयोग नहीं कर सकते वास्तव में एक विशेष समारोह हटाने के लिए।

    कोई जवाब जैसे: "jQuery का उपयोग करें" या कोई अन्य एफडब्लू व्यर्थ हैं!

  • +0

    आप 'event' पैरामीटर – Bergi

    +0

    @Bergi बारे में भूल गया की तरह दोनों कोड का प्रयोग करेंगे: जहां, क्या? –

    +0

    इनमें से सभी 'event_function.call (...)' अभिव्यक्तियों में। हैंडलर को 'घटना' के बिना बुलाया जाता है! – Bergi

    उत्तर

    7

    दूसरे समाधान के साथ, आपको पिछले कार्यों को मैन्युअल रूप से कॉल करना होगा, जिससे पहले श्रोताओं को साफ़ करने के लिए कुछ श्रोताओं को साफ़ करना मुश्किल हो जाएगा (जो मेरे लिए, कुछ श्रोताओं को साफ़ करने की बजाय लगता है) , आप उन्हें एक ही समय में केवल साफ़ कर सकते हैं, जब तक कि आप पहली कार्यक्षमता का अनुकरण नहीं करना चाहते हैं।

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

    mozilla wiki उन समाधानों को भी सूचीबद्ध करता है जो पहला समाधान किसी भी डोम तत्व पर काम नहीं करता है, न केवल HTML तत्वों, और यह कि चरण में अंतिम अनाज नियंत्रण की अनुमति देता है जब श्रोता सक्रिय हो जाता है (बनाम बुलबुल कैप्चरिंग) तीसरे तर्क के साथ ।

    +0

    मुझे लगता है कि आपके पहले 2 पैराग्राफ में पहली चीज़ और दूसरी चीज पीछे है। –

    +0

    +1 मैंने आपके द्वारा सुझाए गए लिंक को पढ़ा है, लेकिन मोज़िला साइट द्वारा समझाए गए तीन बिंदु यह सच नहीं हैं: "1. यह एक घटना के लिए एक से अधिक हैंडलर जोड़ने की अनुमति देता है" सच है लेकिन दोनों कार्यों के साथ मैंने उत्तर में लिखा है कि आप और जोड़ सकते हैं एक घटना हैंडलर से। "2. यह आपको चरण के बेहतर नियंत्रण प्रदान करता है जब श्रोता सक्रिय हो जाता है (बनाम बुलबुल कैप्चरिंग)" सच है, लेकिन बफॉल्ट को रोकने और बुलबुले रोकने के लिए स्टॉपएवेंट फ़ंक्शन को जोड़ना आसान है, इसके अलावा अटैचमेंट में ऐसा बीहाइवर नहीं होगा किसी भी को एक क्रॉस-ब्राउज़र फ़ंक्शन बनाना है। –

    +0

    (जारी) "3. यह किसी भी डोम तत्व पर काम करता है, न केवल HTML तत्वों।", दिलचस्प है, लेकिन मुझे वास्तविक जीवन उदाहरण नहीं दिख रहा है जहां मुझे एक डोम नोड में कोई ईवेंट जोड़ने की आवश्यकता हो सकती है जो कि एक भी नहीं है एचटीएमएल तत्व। –

    3

    मैं इस

    function addEvent(html_element, event_name, event_function) { 
        if (html_element.addEventListener) { // Modern 
         html_element.addEventListener(event_name, event_function, false); 
        } else if (html_element.attachEvent) { // Internet Explorer 
         html_element.attachEvent("on" + event_name, event_function); 
        } else { // others 
         html_element["on" + event_name] = event_function; 
        } 
    }; 
    
    संबंधित मुद्दे