2012-05-07 19 views
5

मैं एक स्क्रिप्ट लिख रहा हूं जहां मैं केवल माउस ईवेंट को संभालना चाहता हूं अगर उन्हें पहले किसी अन्य तत्व द्वारा संभाला नहीं गया है।अन्य तत्वों द्वारा नियंत्रित नहीं जावास्क्रिप्ट घटनाओं को संभालना

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

मेरे पास HTML पृष्ठ में तत्वों पर कोई नियंत्रण नहीं है, इसलिए जब ईवेंट को संभाला जाता है तो मैं मैन्युअल रूप से रोक नहीं सकता हूं।

कोई विचार?

+1

क्लिक ईवेंट जो आप बाध्य होने पर नियंत्रण नहीं रखते हैं? –

+0

मैं वास्तव में नहीं जान सकता, क्योंकि यह एक पुस्तकालय का हिस्सा है जिसका उपयोग विभिन्न प्रकार के पृष्ठों के साथ किया जा सकता है। AddEventListener या onXXX हो सकता है। – Grodriguez

+1

हाँ, 'addEventListener' इसे कठिन बनाता है। [घटना] प्रकारों के लिए, आप इसे प्राप्त कर सकते हैं ताकि दस्तावेज से जुड़ा आपका हैंडलर 'e.target' से शुरू होता है, और इसे और उसके पूर्वजों को यह देखने के लिए परीक्षण करता है कि किसके पास हैंडलर था, फिर उसे उस फ़ंक्शन से लपेटें जो कॉल करता है 'stopPropagation'। लेकिन 'addEventListener' आपको ऐसा करने नहीं देगा। –

उत्तर

1

इस लेख here से यहाँ अवधारणा का एक सबूत (एक jsFiddle के साथ)

लक्ष्य एचटीएमएल है।

ऐसा लगता है कि ऐसा करना अभी तक संभव नहीं है।

कौन सा ईवेंट हैंडलर पंजीकृत हैं?

डब्ल्यू 3 सी के इवेंट पंजीकरण मॉडल के वर्तमान कार्यान्वयन की एक समस्या यह है कि आप यह नहीं पता कि कोई ईवेंट हैंडलर पहले से ही किसी तत्व में पंजीकृत है या नहीं। पारंपरिक मॉडल में आप कर सकता है:

alert(element.onclick)

और आप समारोह है कि करने के लिए पंजीकृत है, या अपरिभाषित है अगर कुछ भी नहीं पंजीकृत किया गया है देखते हैं। केवल अपने बहुत हाल डोम स्तर 3 घटनाक्रम W3C घटना संचालकों है कि वर्तमान में एक तत्व पर पंजीकृत हैं की एक सूची संग्रहीत करने के लिए एक

eventListenerList

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

सौभाग्य

removeEventListener() 

अगर घटना श्रोता आप निकालना चाहते हैं तत्व को जोड़ा नहीं किया गया है, ताकि आप हमेशा removeEventListener उपयोग कर सकते हैं जब संदेह में किसी भी त्रुटि नहीं देता है ()।

+0

ठीक है .. (हालांकि मुझे श्रोताओं की सूची की आवश्यकता नहीं है)। चलो देखते हैं कि मैं कुछ और रास्ता ढूंढ सकता हूं। – Grodriguez

1

तो, आप कुछ निश्चित परिस्थितियों में कुछ हासिल कर सकते हैं जैसे आप पूरा कर सकते हैं। विशेष रूप से, अगर

  • आप मूल
  • से पहले अपने स्वयं के कस्टम जावास्क्रिप्ट लोड कर सकते हैं तुम्हें पता है कि आप किन तत्वों दूसरों

प्रभावी ढंग पर घटनाओं फेंक के लिए सुन रहे हैं, आप क्या मूल की जगह है लक्ष्य तत्व पर addEventListener विधि जो एक कस्टम को कॉल करता है जो कॉल को रोकता है, कुछ विशेष प्रसंस्करण करता है, और फिर इसे प्रति सामान्य जारी रखने देता है। यह 'विशेष प्रसंस्करण' एक नया फ़ंक्शन है जो मूल कॉलबैक को लपेटता है, और कुछ राज्यों के साथ ईवेंट तर्कों को चिह्नित करता है ताकि आपको किसी और को पहले से ही ईवेंट को संभाला जा सके।

<div id='asdf'>asdf</div>​ 

जावास्क्रिप्ट:

var target = document.getElementById('asdf'); 
var original = target.addEventListener; 

var updated = function(){ 
    // Grab the original callback, so we can use it in our wrapper 
    var originalFunc = arguments[1]; 

    // Create new function for the callback, that lets us set a state letting us know it has been handled by someone 
    // Finish the callback by executing the original callback 
    var newFunc = function(e){ 
     console.log('haha, intercepted you'); 
     e.intercepted = true; 
     originalFunc.call(this, e); 
    }; 

    // Set the new function in place in the original arguments 'array' 
    arguments[1] = newFunc; 

    // Perform the standard addEventListener logic with our new wrapper function 
    original.apply(this, arguments); 
}; 

// Set the addEventListener on our target to our modified version 
target.addEventListener = updated; 

// Standard event handling 
target.addEventListener('click', function(e){ 
    console.log('original click'); 
    console.log('intercepted?', e.intercepted); 
}) 
+0

यह एक दिलचस्प विचार है। मैं यह सुनिश्चित कर सकता हूं कि मेरा जेएस मूल से पहले चलाएगा। हालांकि मुझे यह जानने का कोई तरीका नहीं है कि कौन से तत्व ईवेंट श्रोता जोड़ देंगे। क्या ऐसा करने का कोई तरीका है लेकिन वैश्विक तरीके से? (यानी वैश्विक रूप से एक संशोधित संस्करण के साथ addEventListener कोड को प्रतिस्थापित कर रहा है) – Grodriguez

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