2010-01-18 16 views
16

क्या सादा जावास्क्रिप्ट ऑब्जेक्ट्स से जुड़ा हुआ ईवेंट हो सकता है? कुछ इस तरह कहते हैं:क्या सादा जावास्क्रिप्ट ऑब्जेक्ट्स में ईवेंट हो सकते हैं?

obj = new Object(); 
obj.addEventListener('doSomething', foo, true); 

मैं जानता हूँ कि मैं jQuery के साथ ऐसा कर सकते हैं, लेकिन यह किसी भी पुस्तकालय के बिना संभव है?

+1

वाह, कितने जवाब! – Skilldrick

+0

इस तरह की घटनाओं को कौन कॉल करेगा? – Gumbo

+1

हाँ ... इतना, बहुत तेज़! धन्यवाद लोग! @ गंबो का कहना है कि आपके पास xmpp लाइब्रेरी की तरह कुछ हो सकता है और आप उस lib/object (जैसे "कनेक्ट", "डिस्कनेक्ट" आदि) पर ईवेंट ट्रिगर कर सकते हैं। और जब आप घटनाएं होती हैं तो आप कुछ कार्रवाइयों को निष्पादित करना चाहते हैं ... यही कारण है कि मैं घटनाओं के बारे में पूछता हूं। – NilColor

उत्तर

9

आपको इसके लिए अपनी कार्यक्षमता लागू करनी होगी, लेकिन यह बहुत कठिन नहीं है।

var obj = { 
    events: {}, 
    addEventListener: function(eventName, handler) { 
     if(!(eventName in this.events)) 
      this.events[eventName] = []; 

     this.events[eventName].push(handler); 
    }, 

    raiseEvent: function(eventName, args) { 
     var currentEvents = this.events[eventName]; 
     if(!currentEvents) return; 

     for(var i = 0; i < currentEvents.length; i++) { 
      if(typeof currentEvents[i] == 'function') { 
       currentEvents[i](args); 
      } 
     } 
    }, 

    click: function() { 
     // custom 'click' function. when this is called, you do whatever you 
     // want 'click' to do. and then raise the event: 

     this.raiseEvent('onClick'); 
    } 
}; 
+0

हाँ। यह इतना मुश्किल नही है। लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मुझे करना है। धन्यवाद! – NilColor

+0

यह कोड काम नहीं करता है। '' '! इस घटना में 'नाम'' '' '' 'होना चाहिए! (इस घटना में नामनाम)' ' –

+1

@LuisVasconcellos: सही। संपादित। धन्यवाद। –

1

सं। addEventListener डीओएम की एक विशेषता है, जेएस नहीं।

+0

मुझे पता है। यही कारण है कि मैं कहता हूं "somethng like ..."; – NilColor

1

मुझे लगता है कि आप इसे सादा जावास्क्रिप्ट में पाएंगे, यह केवल डोम ऑब्जेक्ट्स है जिसमें ईवेंट हो सकते हैं।

+0

विशेष रूप से, आपके पास ऑब्जेक्ट्स पर ईवेंट हो सकते हैं जो DOM स्तर 2 ईवेंट से 'EventTarget' इंटरफ़ेस को लागू करते हैं। इसमें डीओएम से 'एलिमेंट' और 'दस्तावेज़' शामिल है, लेकिन 'विंडो',' एक्सएमएलएचटीपीआरक्वेट 'और' वेबसॉकेट 'भी शामिल है; शायद मैं भूल गया हूँ। – bobince

0

नहीं, इस हद तक नहीं कि आप किसी ऑब्जेक्ट को ईवेंट हैंडलर जोड़ सकते हैं। यद्यपि आप ऑब्जेक्ट्स के लिए अपनी खुद की इवेंट सिस्टम लिख सकते हैं, अगर आप किसी अन्य प्रकार की एपीआई या लाइब्रेरी को अन्य स्क्रिप्ट्स के साथ बातचीत करने के लिए लिख रहे हैं।

2

सीधे नहीं, लेकिन आप उनमें से किसी के लिए आवश्यक publish/subscribe आधारभूत संरचना जोड़ते हैं।

5

सं

हालांकि, अगर आप प्रत्येक घटना के लिए addEventListener और अन्य कार्यों के लेखन और प्रबंधकों की सूची भंडारण के द्वारा अपने खुद के कार्यान्वयन बना सकता है।

उदाहरण के लिए: (untested)

function addEventListener(name, handler) { 
    if (!this.events) this.events = {}; 
    if (!this.events[name]) this.events[name] = []; 
    this.events[name].push(handler); 
} 

function removeEventListener(name, handler) { 
    if (!this.events) return; 
    if (!this.events[name]) return; 
    for (var i = this.events[name].length - 1; i >= 0; i--) 
     if (this.events[name][i] == handler) 
      this.events[name].splice(i, 1); 
} 

function raiseEvent(name, args) { 
    if (!this.events) return; 
    if (!this.events[name]) return; 
    for (var i = 0; i < this.events[name].length; i++) 
     this.events[name][i].apply(this, args); 
} 


var obj = ...; 
obj.addEventListener = addEventListener; 
obj.removeEventListener = removeEventListener; 
obj.raiseEvent = raiseEvent; 
+1

यह मेरे मुकाबले ज्यादा ठोस प्रयास है, इसलिए इसके लिए +1। –

1

नहीं, केवल बात यह है कि JavaScript ऑब्जेक्ट है गुण है। इन गुणों के मूल्यों हो सकता है:

  • एक आदिम मूल्य
  • एक वस्तु (एक समारोह वस्तु सहित)
0

आप एक addEventListener विधि परिभाषित कर सकते हैं सभी श्रोता वस्तुओं को इकट्ठा करने के लिए, और अपने कोड उन्हें कभी भी कॉल कर सकते हैं। यह सिर्फ ओओ प्रोग्रामिंग है। AddXListener को परिभाषित करें, ऑब्जेक्ट को कहीं पैरामीटर के रूप में पास करें, और जब कुछ होता है तो आप इसकी विधियों को कॉल करते हैं।

हां।

लेकिन याद रखें कि यूआई घटनाएं एचटीएमएल/जावास्क्रिप्ट द्वारा परिभाषित हैं, इसलिए आप प्रोग्रामिंग करेंगे जो आपके कार्यक्रमों के बारे में सतर्क रहने के लिए केवल आपके "obj" ऑब्जेक्ट के लिए होंगे।

उदाहरण द्वारा:

FunnyProcessor 
+ addStartListener(...) 
+ addProcessingListener(...) 
+ addEndListener(...) 
+ doStuff() 

और doSuff पहली शुरुआत श्रोताओं फोन करेगा, अगले कुछ पाश करते हैं और प्रत्येक यात्रा कॉल प्रसंस्करण श्रोताओं के लिए, और अंत कॉल समाप्त श्रोताओं पर।

+0

आपका मजेदार प्रोसेसर मुझे एक अवलोकन के बारे में याद दिलाता है ... और 2010 से पोस्ट होने के बाद, यह ठंडा होने से पहले एक अवलोकन योग्य है। – SparK

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