डीबगिंग या जावास्क्रिप्ट कोड से डोम नोड पर ईवेंट श्रोताओं को खोजने के लिए कैसे?


840

मेरे पास एक पृष्ठ है जहां कुछ ईवेंट श्रोता इनपुट बॉक्स से जुड़े हैं और बक्से का चयन करते हैं। क्या यह पता लगाने का कोई तरीका है कि कौन से श्रोता किसी विशेष डोम नोड को देख रहे हैं और किस घटना के लिए?

ईवेंट संलग्न हैं:

  1. प्रोटोटाइप का Event.observe ;
  2. DOM का addEventListener;
  3. तत्व गुण के रूप में element.onclick

3
घटनाओं को पहली जगह से कैसे जोड़ा जाता है? क्या आप एक पुस्तकालय (जैसे प्रोटोटाइप, jQuery, आदि) का उपयोग कर रहे हैं?
क्रिसेंट ताजा

यह ध्यान रखना महत्वपूर्ण है कि एक ही प्रकार के ईवेंट के लिए एक से अधिक कॉलबैक फ़ंक्शंस संलग्न किए जा सकते हैं element.addEventListener(type, callback, [bubble]), जबकि element.onclick = functionआपके द्वारा असाइन किए जाने पर हर बार ओवरराइट हो जाएगा।
ब्रैडेन सर्वश्रेष्ठ

जवाबों:


507

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

अपडेट : विजुअल इवेंट 2 उपलब्ध।


1
उत्तम! फायरबग का EventBugप्लगइन बीट्स ।
रॉबिन माबेन

22
यह पेज में एक जेली तत्व जोड़ता है, जिनमें से कई चित्र हैं। एक पृष्ठ पर इसकी उपयोगिता बहुत कम हो जाती है, जिसमें कई इवेंट हैंडलर (मेरा 17k है और विजुअल इवेंट को लोड होने में लगभग 3 मिनट लगते हैं)।
टोनी आर

15
मेरा मानना ​​है कि Chrome एक्सटेंशन @ssharma का उल्लेख यहां उपलब्ध है
19

1
यदि पृष्ठ थर्ड पार्टी js लाइब्रेरी को संदर्भित करता है, तो Visial Event काम नहीं करता है। यह एक त्रुटि उठाता है: XMLHttpRequest A.com/js/jquery-ui-1.10.3.custom.js?_=1384831682813 लोड नहीं कर सकता । उत्पत्ति B.com को Access-Control-Allow-Origin द्वारा अनुमति नहीं है।
हाईवे

5
Chrome और FF आंतरिक डेवलपर टूल (F12) में एक अंतर्निहित ईवेंट व्यूअर है! Chrome: "एलिमेंट्स" टैब पर, सेलेक्ट करें और एलीमेंट करें और दाईं ओर देखें: स्टाइल,
कंप्यूटेड

365

यह इस बात पर निर्भर करता है कि घटनाएँ कैसे जुड़ी हैं। उदाहरण के लिए मान लें कि हमारे पास निम्न क्लिक हैंडलर हैं:

var handler = function() { alert('clicked!') };

हम इसे अलग-अलग तरीकों का उपयोग करके अपने तत्व में संलग्न करने जा रहे हैं, कुछ जो निरीक्षण की अनुमति देते हैं और कुछ ऐसा नहीं करते हैं।

विधि ए) एकल घटना हैंडलर

element.onclick = handler;
// inspect
alert(element.onclick); // alerts "function() { alert('clicked!') }"

विधि बी) कई घटना संचालकों

if(element.addEventListener) { // DOM standard
    element.addEventListener('click', handler, false)
} else if(element.attachEvent) { // IE
    element.attachEvent('onclick', handler)
}
// cannot inspect element to find handlers

विधि C): jQuery

$(element).click(handler);
  • 1.3.x

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, value) {
        alert(value) // alerts "function() { alert('clicked!') }"
    })
  • 1.4.x (किसी ऑब्जेक्ट के अंदर हैंडलर को स्टोर करता है)

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
        alert(handlerObj.handler) // alerts "function() { alert('clicked!') }"
        // also available: handlerObj.type, handlerObj.namespace
    })

(देखें jQuery.fn.dataऔर jQuery.data)

विधि डी): प्रोटोटाइप (गन्दा)

$(element).observe('click', handler);
  • 1.5.x

    // inspect
    Event.observers.each(function(item) {
        if(item[0] == element) {
            alert(item[2]) // alerts "function() { alert('clicked!') }"
        }
    })
  • 1.6 से 1.6.0.3, समावेशी (यहां बहुत मुश्किल है)

    // inspect. "_eventId" is for < 1.6.0.3 while 
    // "_prototypeEventID" was introduced in 1.6.0.3
    var clickEvents = Event.cache[element._eventId || (element._prototypeEventID || [])[0]].click;
    clickEvents.each(function(wrapper){
        alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
    })
  • 1.6.1 (थोड़ा बेहतर)

    // inspect
    var clickEvents = element.getStorage().get('prototype_event_registry').get('click');
    clickEvents.each(function(wrapper){
        alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
    })

3
इसे अपडेट करने के लिए Thx। यह दुर्भाग्यपूर्ण है कि आपको प्रत्येक प्रकार के हैंडलर को रोकना होगा।
कीथ बेंट्रुप

4
"मेथड बी" पर (addEventListener) यहाँ शुद्ध डोम इवेंट्स एपीआई के साथ पंजीकृत संचालकों के लिए गणन सुविधाओं की स्थिति के बारे में एक उत्तर दिया गया है: stackoverflow.com/questions/7810534/-
निकोलय

@ जॉन: टिप्पणी के लिए धन्यवाद। आपके पास पहले से जोड़े गए श्रोताओं को लाने के लिए "वास्तविक जावास्क्रिप्ट" का एक उदाहरण है addEventListener?
क्रिसेंट फ्रेश

6
@ जान, यह jQuery 1.7.2 के लिए काम नहीं करता है, क्या उस संस्करण के लिए एक अलग दृष्टिकोण है?
टोमडेमुइट

14
@tomdemuyt jQuery में, घटनाओं को अब .data('events')पहले की तरह सुलभ होने के बजाय एक आंतरिक डेटा सरणी में संग्रहीत किया जाता है । आंतरिक ईवेंट डेटा तक पहुंचने के लिए, उपयोग करें $._data(elem, 'events')। ध्यान दें कि यह फ़ंक्शन jQuery के स्रोत में "केवल आंतरिक उपयोग के लिए" चिह्नित है, इसलिए कोई वादा नहीं करता है कि यह हमेशा भविष्य में काम करेगा, लेकिन मेरा मानना ​​है कि यह jQuery 1.7 के बाद से काम कर रहा है और अभी भी काम करता है।
मैट ब्राउन ने

350

Chrome, Firefox, Vivaldi और Safari getEventListeners(domElement)उनके डेवलपर टूल कंसोल में समर्थन करते हैं ।

अधिकांश डिबगिंग उद्देश्यों के लिए, इसका उपयोग किया जा सकता है।

नीचे इसका उपयोग करने के लिए एक बहुत अच्छा संदर्भ है: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners


1
+1। ब्राउज़र-विशिष्ट कोड मेरे लिए कोई समस्या नहीं है, क्योंकि मैं एक पृष्ठ प्राप्त करने की कोशिश कर रहा हूं जिसे मैं ठीक से काम करने के लिए नियंत्रित नहीं करता हूं।
ग्रेल्ट

9
अच्छा है, लेकिन केवल क्रोम कंसोल की कमांड लाइन में काम करता है :(
gillyspy

5
@ राघव आह धन्यवाद, उपयोग नहीं है: जैसा कि मैंने पहले सोचा था :)getEventListeners(object) obj getEventListeners()
jave.web

11
अगर आपने बताया है कि किसी ईवेंटलिस्टर का सोर्स कोड कैसे लिया जाता है, तो आपने मुझे 3 घंटे बचाए। उस "संदर्भ" ने कुछ भी स्पष्ट नहीं किया। मामले में किसी और को यहाँ कैसे नुकसान हुआ था var list = getEventListeners(document.getElementById("YOURIDHERE")); console.log(list["focus"][0]["listener"].toString()):। उस घटना पर "फ़ोकस" बदलें जो आप निरीक्षण करना चाहते हैं और संख्या यदि एक ही घटना पर कई श्रोता हैं।
doABarrelRoll721

46
TIP: getEventListeners($0)उस तत्व के लिए ईवेंट श्रोताओं को मिलेगा, जिस पर आपने Chrome देव टूल पर ध्यान केंद्रित किया है। यह मेरे लिए हर समय उपयोगी है। लव का उपयोग क्वेरी करने के लिए नहीं किया जा रहा है या get__By_ फ़ंक्शंस
cacoder

91

Chrome या Safari ब्राउज़र में WebKit इंस्पेक्टर अब ऐसा करता है। जब आप तत्व फलक में इसे चुनते हैं तो यह DOM श्रोताओं के लिए ईवेंट श्रोताओं को प्रदर्शित करेगा।


9
मुझे यकीन नहीं है कि यह सभी घटना संचालकों को दिखाता है ; सिर्फ एक HTML ईवेंट हैंडलर।
होयज

3
मुझे पूर्णता के लिए Firebug के लिए EventBug प्लगइन का उल्लेख करना चाहिए < softwareishard.com/blog/category/eventbug >
निकोलय

इसने मेरा दिन बना दिया, कुछ विरासत प्रोटोटाइप कोड में एक ही तत्व पर एक ही घटना से जुड़े कई कार्य थे और मैं उन्हें ट्रैक करने की कोशिश कर रहा था। बहुत बहुत शुक्रिया ईशान।
सिलिकॉनक्रॉस्टार

70

जावास्क्रिप्ट में सभी घटना श्रोताओं को सूचीबद्ध करना संभव है : यह उतना कठिन नहीं है; आपको बस prototypeHTML तत्वों की विधि ( श्रोताओं को जोड़ने से पहले ) को हैक करना होगा ।

function reportIn(e){
    var a = this.lastListenerInfo[this.lastListenerInfo.length-1];
    console.log(a)
}


HTMLAnchorElement.prototype.realAddEventListener = HTMLAnchorElement.prototype.addEventListener;

HTMLAnchorElement.prototype.addEventListener = function(a,b,c){
    this.realAddEventListener(a,reportIn,c); 
    this.realAddEventListener(a,b,c); 
    if(!this.lastListenerInfo){  this.lastListenerInfo = new Array()};
    this.lastListenerInfo.push({a : a, b : b , c : c});
};

अब हर लंगर तत्व (a ) में एक lastListenerInfoसंपत्ति होगी जिसमें उसके सभी श्रोता शामिल होंगे। और यह अनाम कार्यों के साथ श्रोताओं को हटाने के लिए भी काम करता है।


4
यदि आप उपयोगकर्ता स्क्रिप्ट या सामग्री स्क्रिप्ट लिख रहे हैं तो यह विधि काम नहीं करेगी। न केवल इन दिनों सैंडबॉक्स होने की संभावना है, लेकिन आप निष्पादन के आदेश की गारंटी कैसे दे सकते हैं?
होयज

यह विधि क्रोम / 19 और एफएफ / 12 के साथ काम करती है। यदि आप इसे अन्य लिपियों से पहले हुक करते हैं तो निष्पादन के आदेश की गारंटी दी जा सकती है
Tzury Bar Yochay

8
क्या आप Node.prototypeइसके बजाय बस संशोधित नहीं कर सकते थे ? बस HTMLAnchorElementयहीं .addEventListenerसे विरासत मिलती है। '
एस्लेइजा

3
आप मान रहे हैं कि उपयोगकर्ता एजेंट DOM होस्ट ऑब्जेक्ट के लिए प्रोटोटाइप इनहेरिटेंस लागू करता है और आपको उन्हें संशोधित करने की अनुमति देता है। उनमें से कोई भी अच्छे विचार नहीं हैं : उन वस्तुओं को संशोधित न करें जो आपके पास नहीं हैं
रॉब

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

52

Google Chrome में getEventListeners का उपयोग करें :

getEventListeners(document.getElementByID('btnlogin'));
getEventListeners($('#btnlogin'));

1
बिना संदर्भित संदर्भ: getEventListeners को परिभाषित नहीं किया गया है
ब्रायन ग्रेस

3
getEventListeners केवल Chrome के devtools कंसोल में काम करता है। और यह इस अधिक विस्तृत जवाब का एक डुप्लिकेट है: stackoverflow.com/a/16544813/1026
निकोले

41

( इस प्रश्न के उत्तर को फिर से लिखना क्योंकि यह यहाँ प्रासंगिक है।)

डिबगिंग करते समय, यदि आप केवल घटनाओं को देखना चाहते हैं, तो मैं या तो सलाह देता हूं ...

  1. दृश्य घटना
  2. तत्वों Chrome की डेवलपर उपकरण की धारा: निचली दाईं ओर "ईवेंट श्रोता" के लिए एक तत्व और देखो (फ़ायरफ़ॉक्स में इसी तरह) का चयन करें

यदि आप अपने कोड में घटनाओं का उपयोग करना चाहते हैं, और आप 1.8 संस्करण से पहले jQuery का उपयोग कर रहे हैं , तो आप उपयोग कर सकते हैं:

$(selector).data("events")

घटनाओं को पाने के लिए। संस्करण 1.8 के रूप में, .data ("इवेंट") का उपयोग करना बंद कर दिया गया है ( इस बग टिकट को देखें )। आप उपयोग कर सकते हैं:

$._data(element, "events")

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

var $myLink = $('a.myClass');
console.log($._data($myLink[0], "events").click);

( कार्यशील उदाहरण के लिए http://jsfiddle.net/HmsQC/ देखें )

दुर्भाग्य से, $ ._ डेटा का उपयोग करना यह डीबगिंग के अलावा अनुशंसित नहीं है क्योंकि यह एक आंतरिक jQuery संरचना है, और भविष्य के रिलीज में बदल सकता है। दुर्भाग्य से मुझे घटनाओं तक पहुँचने का कोई अन्य आसान साधन नहीं है।


1
$._data(elem, "events")jQuery 1.10 के साथ काम करने के लिए प्रकट नहीं होता है, कम से कम घटनाओं के लिए पंजीकृत का उपयोग कर $(elem).on('event', ...)। क्या किसी को पता है कि उन कैसे डिबग करने के लिए?
मारियस गेदमिनस

4
मैं सकारात्मक नहीं हूं, लेकिन मुझे लगता है कि पहले $._dataएक तत्व की आवश्यकता हो सकती है और एक jQuery वस्तु नहीं। इसलिए मुझे ऊपर दिए अपने उदाहरण को ठीक करने की आवश्यकता हैconsole.log($._data($myLink[0], "events").click);
ल्यूक

29

1: Prototype.observeElement.addEventListener का उपयोग करता है ( स्रोत कोड देखें )

2: आप Element.addEventListenerजोड़े गए श्रोताओं को याद रखने के लिए ओवरराइड कर सकते हैं (आसान संपत्ति EventListenerListDOM3 कल्पना प्रस्ताव से हटा दी गई थी)। किसी भी घटना के संलग्न होने से पहले यह कोड चलाएँ:

(function() {
  Element.prototype._addEventListener = Element.prototype.addEventListener;
  Element.prototype.addEventListener = function(a,b,c) {
    this._addEventListener(a,b,c);
    if(!this.eventListenerList) this.eventListenerList = {};
    if(!this.eventListenerList[a]) this.eventListenerList[a] = [];
    this.eventListenerList[a].push(b);
  };
})();

सभी घटनाओं को पढ़ें:

var clicks = someElement.eventListenerList.click;
if(clicks) clicks.forEach(function(f) {
  alert("I listen to this function: "+f.toString());
});

और Element.removeEventListenerकस्टम से घटना को हटाने के लिए ओवरराइड करना न भूलेंElement.eventListenerList

3: Element.onclickसंपत्ति को यहां विशेष देखभाल की आवश्यकता है:

if(someElement.onclick)
  alert("I also listen tho this: "+someElement.onclick.toString());

4: Element.onclickसामग्री की विशेषता को न भूलें : ये दो अलग चीजें हैं:

someElement.onclick = someHandler; // IDL attribute
someElement.setAttribute("onclick","otherHandler(event)"); // content attribute

तो आपको इसे संभालने की ज़रूरत है:

var click = someElement.getAttribute("onclick");
if(click) alert("I even listen to this: "+click);

विजुअल ईवेंट बुकमार्कलेट (सबसे लोकप्रिय उत्तर में उल्लिखित) केवल कस्टम लाइब्रेरी हैंडलर कैश चुराता है:

यह पता चलता है कि W3C द्वारा सुझाए गए कोई मानक तरीका नहीं है जो DOM इंटरफ़ेस द्वारा यह पता लगाने के लिए सुझाया गया है कि किसी विशेष तत्व से कौन से श्रोता जुड़े हैं। हालांकि यह एक निरीक्षण के रूप में प्रकट हो सकता है, वहाँ एक प्रॉपर्टी को शामिल करने का प्रस्ताव दिया गया था जिसे EventListenerList के स्तर 3 DOM विनिर्देशन में शामिल किया गया था, लेकिन दुर्भाग्य से बाद के ड्राफ्ट में हटा दिया गया था। जैसे हम व्यक्तिगत जावास्क्रिप्ट पुस्तकालयों को देखने के लिए मजबूर होते हैं, जो आम तौर पर संलग्न घटनाओं का एक कैश बनाए रखते हैं (ताकि बाद में उन्हें हटा दिया जा सके और अन्य उपयोगी सार प्रदर्शन कर सकें)।

जैसे, घटनाओं को दिखाने के लिए दृश्य घटना के लिए, यह एक जावास्क्रिप्ट पुस्तकालय से बाहर घटना की जानकारी को पार्स करने में सक्षम होना चाहिए।

एलीमेंट ओवरराइडिंग संदिग्ध हो सकती है (अर्थात क्योंकि लाइव संग्रह की तरह कुछ DOM विशिष्ट विशेषताएं हैं, जिन्हें JS में कोडित नहीं किया जा सकता है), लेकिन यह EventListenerList को मूल रूप से समर्थन देता है और यह क्रोम, फ़ायरफ़ॉक्स और ओपेरा में काम करता है (IE7 में काम नहीं करता है) )।


23

आप इसे अपने शीर्ष पर रखकर इवेंट श्रोताओं को प्रबंधित करने के लिए मूल डोम तरीकों को लपेट सकते हैं <head>:

<script>
    (function(w){
        var originalAdd = w.addEventListener;
        w.addEventListener = function(){
            // add your own stuff here to debug
            return originalAdd.apply(this, arguments);
        };

        var originalRemove = w.removeEventListener;
        w.removeEventListener = function(){
            // add your own stuff here to debug
            return originalRemove.apply(this, arguments);
        };
    })(window);
</script>

एच / टी @ लेस 2


कृपया मुझे सही करें यदि मैं गलत हूं, लेकिन क्या यह केवल खिड़की से जुड़े श्रोताओं के लिए नहीं है?
मैकीज क्रॉसिक

@MaciejKrawczyk हां, और उन बुलबुला
जॉन z

18

फ़ायरफ़ॉक्स डेवलपर टूल अब ऐसा करता है। घटनाओं को प्रत्येक तत्व के प्रदर्शन के दाईं ओर "ev" बटन पर क्लिक करके दिखाया जाता है, जिसमें jQuery और DOM इवेंट शामिल हैं।

इंस्पेक्टर टैब में फ़ायरफ़ॉक्स डेवलपर टूल्स के इवेंट श्रोता बटन का स्क्रीनशॉट


मैंने उस पृष्ठ के प्रमुख तत्वों में से एक को देखा जो विज़ुअल ईवेंट 2 बुकमार्क को वायर्ड ईवेंट दिखा रहा है, और मैंने दाईं ओर छोटा "ईव" बटन देखा, जैसे आप दिखाते हैं।
एरिक

फ़ायरफ़ॉक्स के ईवेंट श्रोता jQuery प्रत्यायोजित घटनाओं का पता लगा सकते हैं जबकि क्रोम को इसे करने के लिए प्लगइन की आवश्यकता होती है।
निक त्वाई

12

यदि आपके पास फायरबग है , तो आप console.dir(object or array)किसी भी जावास्क्रिप्ट स्केलर, सरणी, या ऑब्जेक्ट के कंसोल लॉग में एक अच्छा पेड़ प्रिंट करने के लिए उपयोग कर सकते हैं ।

प्रयत्न:

console.dir(clickEvents);

या

console.dir(window);


10

जन ट्यूरन द्वारा जवाब के आधार पर पूरी तरह से काम कर समाधान - getEventListeners()कंसोल से व्यवहार करता है:

(डुप्लिकेट के साथ थोड़ा बग है। यह वैसे भी बहुत ज्यादा नहीं टूटता है।)

(function() {
  Element.prototype._addEventListener = Element.prototype.addEventListener;
  Element.prototype.addEventListener = function(a,b,c) {
    if(c==undefined)
      c=false;
    this._addEventListener(a,b,c);
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(!this.eventListenerList[a])
      this.eventListenerList[a] = [];
    //this.removeEventListener(a,b,c); // TODO - handle duplicates..
    this.eventListenerList[a].push({listener:b,useCapture:c});
  };

  Element.prototype.getEventListeners = function(a){
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(a==undefined)
      return this.eventListenerList;
    return this.eventListenerList[a];
  };
  Element.prototype.clearEventListeners = function(a){
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(a==undefined){
      for(var x in (this.getEventListeners())) this.clearEventListeners(x);
        return;
    }
    var el = this.getEventListeners(a);
    if(el==undefined)
      return;
    for(var i = el.length - 1; i >= 0; --i) {
      var ev = el[i];
      this.removeEventListener(a, ev.listener, ev.useCapture);
    }
  };

  Element.prototype._removeEventListener = Element.prototype.removeEventListener;
  Element.prototype.removeEventListener = function(a,b,c) {
    if(c==undefined)
      c=false;
    this._removeEventListener(a,b,c);
      if(!this.eventListenerList)
        this.eventListenerList = {};
      if(!this.eventListenerList[a])
        this.eventListenerList[a] = [];

      // Find the event in the list
      for(var i=0;i<this.eventListenerList[a].length;i++){
          if(this.eventListenerList[a][i].listener==b, this.eventListenerList[a][i].useCapture==c){ // Hmm..
              this.eventListenerList[a].splice(i, 1);
              break;
          }
      }
    if(this.eventListenerList[a].length==0)
      delete this.eventListenerList[a];
  };
})();

उपयोग:

someElement.getEventListeners([name]) - घटना श्रोताओं की वापसी सूची, अगर नाम उस घटना के लिए श्रोताओं की वापसी सरणी सेट है

someElement.clearEventListeners([name]) - सभी ईवेंट श्रोताओं को हटा दें, यदि नाम सेट है तो केवल उस ईवेंट के लिए श्रोताओं को हटा दें


3
यह एक अच्छा जवाब है, लेकिन मैं इसे bodyऔर documentतत्वों पर काम नहीं कर सकता ।
डेविड ब्रैडशॉ

वास्तव में अच्छा समाधान!
दझखर उखावे

@ पेटर मोर्टेंसन, आपने जान का नाम क्यों बदला? :)
n00b

1
@ डेविड ब्रैडशॉ: क्योंकि बॉडी, डॉक्यूमेंट और विंडो का अपना प्रोटोटाइप होता है न कि एलिमेंट प्रोटोटाइप ...
स्टीफन स्टीगर

1
@ n00b: एक बग है। इसलिए हम्म्। यदि आप श्रोता और उपयोग के लिए स्टेटमेंट में कॉमा-ऑपरेटर का उपयोग करते हैं ... कॉमा ऑपरेटर अपने प्रत्येक ऑपरेंड (बाएं से दाएं) का मूल्यांकन करता है और अंतिम ऑपरेंड का मान लौटाता है। तो आप पहले इवेंटलिस्ट को हटाते हैं जो कि उपयोग में मेल खाता है, भले ही ईवेंट के प्रकार के बावजूद ... कॉमा के बजाय && होना चाहिए।
स्टीफन स्टीगर

8

ओपेरा 12 (नवीनतम क्रोम वेबकिट इंजन आधारित नहीं) ड्रैगनफली ने कुछ समय के लिए इसे रखा है और जाहिर है कि यह डोम संरचना में प्रदर्शित किया गया है। मेरी राय में यह एक श्रेष्ठ डिबगर है और केवल यही कारण है कि मैं अभी भी ओपेरा 12 आधारित संस्करण का उपयोग करता हूं (कोई v13, v14 संस्करण नहीं है और v15 वेबकिट आधारित ड्रैगनफ्लाई अभी भी अभाव है)

यहां छवि विवरण दर्ज करें


4

प्रोटोटाइप 1.7.1 रास्ता

function get_element_registry(element) {
    var cache = Event.cache;
    if(element === window) return 0;
    if(typeof element._prototypeUID === 'undefined') {
        element._prototypeUID = Element.Storage.UID++;
    }
    var uid =  element._prototypeUID;           
    if(!cache[uid]) cache[uid] = {element: element};
    return cache[uid];
}

4

मैं हाल ही में घटनाओं के साथ काम कर रहा था और एक पृष्ठ में सभी घटनाओं को देखना / नियंत्रित करना चाहता था। संभावित समाधानों को देखने के बाद, मैंने अपने तरीके से जाने और घटनाओं की निगरानी के लिए एक कस्टम सिस्टम बनाने का निर्णय लिया है। तो, मैंने तीन काम किए।

सबसे पहले, मुझे पृष्ठ के सभी ईवेंट श्रोताओं के लिए एक कंटेनर की आवश्यकता थी: वह EventListenersवस्तु है। यह तीन उपयोगी तरीकों है: add(), remove(), और get()

इसके बाद, मैं एक बनाया EventListenerवस्तु घटना के लिए आवश्यक जानकारी धारण करने के लिए, अर्थात्: target, type, callback, options, useCapture,wantsUntrusted , और एक विधि जोड़ा remove()श्रोता दूर करने के लिए।

अंत में, मैंने देशी addEventListener()और removeEventListener()विधियों को उनके द्वारा बनाई गई वस्तुओं के साथ काम करने के लिए बढ़ाया ( EventListenerऔरEventListeners ) के ।

उपयोग:

var bodyClickEvent = document.body.addEventListener("click", function () {
    console.log("body click");
});

// bodyClickEvent.remove();

addEventListener()एक EventListenerऑब्जेक्ट बनाता है , इसे ऑब्जेक्ट में जोड़ता है EventListenersऔर EventListenerऑब्जेक्ट को लौटाता है , इसलिए इसे बाद में हटाया जा सकता है।

EventListeners.get()पृष्ठ में श्रोताओं को देखने के लिए इस्तेमाल किया जा सकता है। यह एक EventTargetया एक स्ट्रिंग (घटना प्रकार) को स्वीकार करता है ।

// EventListeners.get(document.body);
// EventListeners.get("click");

डेमो

मान लें कि हम इस वर्तमान पृष्ठ के प्रत्येक ईवेंट श्रोता को जानना चाहते हैं। हम ऐसा कर सकते हैं (यह मानते हुए कि आप इस मामले में स्क्रिप्ट प्रबंधक एक्सटेंशन, टेम्परमॉन्की का उपयोग कर रहे हैं)। निम्नलिखित स्क्रिप्ट ऐसा करती है:

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @include      https://stackoverflow.com/*
// @grant        none
// ==/UserScript==

(function() {
    fetch("https://raw.githubusercontent.com/akinuri/js-lib/master/EventListener.js")
        .then(function (response) {
            return response.text();
        })
        .then(function (text) {
            eval(text);
            window.EventListeners = EventListeners;
        });
})(window);

और जब हम सभी श्रोताओं को सूचीबद्ध करते हैं, तो यह कहता है कि 299 घटना श्रोता हैं। कुछ डुप्लिकेट होने के लिए "लगता है", लेकिन मुझे नहीं पता कि क्या वे वास्तव में डुप्लिकेट हैं। प्रत्येक ईवेंट प्रकार को डुप्लिकेट नहीं किया जाता है, इसलिए वे सभी "डुप्लिकेट" एक व्यक्तिगत श्रोता हो सकते हैं।

इस पृष्ठ के सभी ईवेंट श्रोताओं को सूचीबद्ध करने वाले कंसोल का स्क्रीनशॉट

कोड मेरे भंडार पर पाया जा सकता है। मैं इसे यहाँ पोस्ट नहीं करना चाहता था क्योंकि यह बहुत लंबा है।


अद्यतन: यह jQuery के साथ काम नहीं करता है। जब मैं EventListener की जाँच करता हूँ, तो देखता हूँ कि कॉलबैक है

function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}

मेरा मानना ​​है कि यह jQuery से संबंधित है, और वास्तविक कॉलबैक नहीं है। jQuery के EventTarget के गुणों में वास्तविक कॉलबैक संग्रहीत करता है:

$(document.body).click(function () {
    console.log("jquery click");
});

यहां छवि विवरण दर्ज करें

किसी ईवेंट श्रोता को निकालने के लिए, वास्तविक कॉलबैक removeEventListener()विधि को पास करना होगा । तो इस काम को jQuery के साथ करने के लिए, इसे और अधिक संशोधन की आवश्यकता है। मैं भविष्य में इसे ठीक कर सकता हूं।


बहुत अच्छा काम करता है! धन्यवाद
mt025

3

मैं ऐसा करने की कोशिश कर रहा हूँ jQuery 2.1 में, और "के साथ$().click() -> $(element).data("events").click; " विधि के साथ यह काम नहीं करता है।

मुझे एहसास हुआ कि केवल $ ._ डेटा () फ़ंक्शन मेरे मामले में काम करता है:

	$(document).ready(function(){

		var node = $('body');
		
        // Bind 3 events to body click
		node.click(function(e) { alert('hello');  })
			.click(function(e) { alert('bye');  })
			.click(fun_1);

        // Inspect the events of body
		var events = $._data(node[0], "events").click;
		var ev1 = events[0].handler // -> function(e) { alert('hello')
		var ev2 = events[1].handler // -> function(e) { alert('bye')
		var ev3 = events[2].handler // -> function fun_1()
        
		$('body')
			.append('<p> Event1 = ' + eval(ev1).toString() + '</p>')
			.append('<p> Event2 = ' + eval(ev2).toString() + '</p>')
			.append('<p> Event3 = ' + eval(ev3).toString() + '</p>');        
	
	});

	function fun_1() {
		var txt = 'text del missatge';	 
		alert(txt);
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body>
</body>



1

इन कार्यों को बदलने से आपको जोड़े गए श्रोताओं को लॉग इन करने की अनुमति मिलेगी:

EventTarget.prototype.addEventListener
EventTarget.prototype.attachEvent
EventTarget.prototype.removeEventListener
EventTarget.prototype.detachEvent

बाकी श्रोताओं के साथ पढ़ें

console.log(someElement.onclick);
console.log(someElement.getAttribute("onclick"));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.