jQuery किसी ऑब्जेक्ट के साथ पंजीकृत ईवेंट हैंडलर ढूंढता है


555

मुझे यह खोजने की जरूरत है कि कौन से इवेंट हैंडलर किसी ऑब्जेक्ट पर पंजीकृत हैं।

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

$("#el").click(function() {...});
$("#el").mouseover(function() {...});

$("#el")है क्लिक और माउसओवर पंजीकृत।

क्या यह पता लगाने के लिए एक समारोह है, और संभवतः घटना संचालकों पर पुनरावृति?

यदि यह उचित तरीकों के माध्यम से एक jQuery वस्तु पर संभव नहीं है, तो क्या यह एक सादे DOM ऑब्जेक्ट पर संभव है?


5
दुर्भाग्य से, अब: Bugs.jquery.com/ticket/10589
Skylar Saveland

2
दोनों jQuery पूर्व और पोस्ट 1.8 का समर्थन करें:var events = (jQuery._data || jQuery.data)(elem, 'events');
oriadam

2
ध्यान दें कि आप इन ईवेंट श्रोताओं को देखने के लिए FF और Chrome देव-उपकरण (F12) का उपयोग कर सकते हैं। देखें developers.google.com/web/tools/chrome-devtools/debug/... और developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/...
oriadam

जवाबों:


691

1.8 jQuery के रूप में, घटना डेटा अब डेटा के लिए "सार्वजनिक एपीआई" से उपलब्ध नहीं है। इस jQuery ब्लॉग पोस्ट को पढ़ें । अब आपको इसका उपयोग करना चाहिए:

jQuery._data( elem, "events" );

elem एक HTML एलीमेंट होना चाहिए, एक jQuery ऑब्जेक्ट या चयनकर्ता नहीं।

कृपया ध्यान दें, यह एक आंतरिक, 'निजी' संरचना है, और इसे संशोधित नहीं किया जाना चाहिए। इसका उपयोग केवल डीबगिंग उद्देश्यों के लिए करें।

JQuery के पुराने संस्करणों में, आपको पुरानी पद्धति का उपयोग करना पड़ सकता है:

jQuery( elem ).data( "events" );

222
लेकिन आप अभी भी उपयोग कर सकते हैं $._data($(elem).get(0), "events")
बुलगारे

10
blog.jquery.com/2011/11/08/building-a-slimmer-jquery .data ("इवेंट्स"): jQuery प्रत्येक तत्व पर एक डेटा ऑब्जेक्ट नाम (इसके लिए प्रतीक्षा करें) घटनाओं में अपने घटना से संबंधित डेटा संग्रहीत करता है। यह एक आंतरिक डेटा संरचना है, इसलिए 1.8 में इसे उपयोगकर्ता डेटा नाम स्थान से हटा दिया जाएगा ताकि यह उसी नाम की वस्तुओं के साथ संघर्ष न करे। jQuery के ईवेंट डेटा को अभी भी jQuery._data (तत्व, "ईवेंट्स") के माध्यम से एक्सेस किया जा सकता है, लेकिन इस बात से अवगत रहें कि यह एक आंतरिक डेटा संरचना है जो कि अनडॉन्स्ड है और इसे संशोधित नहीं किया जाना चाहिए।
सैम ग्रीनहेल

मैं इस विधि का उपयोग करने की कोशिश कर रहा हूं और एक बटन के क्लिक इवेंट का पता लगा सकता हूं। क्रोम कंसोल में यह handler: function () {क्लिक प्रॉपर्टी के अंदर दिखाया गया है। मुझे फंक्शन की पूरी सामग्री को दिखाने और दिखाने के लिए फंक्शन पार्ट पर डबल क्लिक करना था।
जिम

@ जीम येया, डबल क्लिक का जवाब है
अदीब अउरी

2
निर्बाध रूप से दोनों विकल्पों का समर्थन करें:var events = (jQuery._data || jQuery.data)(elem, 'events');
oriadam

84

आप इसे घटनाओं को क्रॉल करके (jQuery 1.8+ के अनुसार) कर सकते हैं, जैसे:

$.each($._data($("#id")[0], "events"), function(i, event) {
  // i is the event type, like "click"
  $.each(event, function(j, h) {
    // h.handler is the function being called
  });
});

यहाँ एक उदाहरण है जिसके साथ आप खेल सकते हैं:

$(function() {
  $("#el").click(function(){ alert("click"); });
  $("#el").mouseover(function(){ alert("mouseover"); });

  $.each($._data($("#el")[0], "events"), function(i, event) {
    output(i);
    $.each(event, function(j, h) {
        output("- " + h.handler);
    });
  });
});

function output(text) {
    $("#output").html(function(i, h) {
        return h + text + "<br />";
    });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="el">Test</div>
<code>
    <span id="output"></span>
</code>


2
यह सही जवाब है। निर्णायक बिट दूसरी छमाही है। इससे मुझे एक मिनट के अंदर एक समस्या का पता लगाने में मदद मिली जो कि एक घंटे से अधिक समय तक होती अगर मुझे सभी कोड के माध्यम से खोजना पड़ता। धन्यवाद!
एंड्रयू एनस्ले

2
1.4 के साथ काम करता है, लेकिन jQuery 1.8.2 में नहीं।
टिमो किन्कोनें

15
JQuery 1.8+ के लिए, आपको 'सार्वजनिक डेटा' विधि के बजाय 'निजी डेटा' विधि का उपयोग करना होगा :। वस्तु वास्तव में संग्रहीत नहीं किया गया है एक लंबे समय के लिए, हम कोड की कुछ बाइट्स बाहर "सार्वजनिक एपीआई" से "प्रॉक्सी" को हटाने के द्वारा छंटनी कीjQuery._data( jQuery("#el")[0], "events" );jQuery("#el").data("events")events.data()
gnarf

36

JQuery 1.8+ के लिए, यह अब काम नहीं करेगा क्योंकि आंतरिक डेटा को एक अलग ऑब्जेक्ट में रखा गया है।

नवीनतम अनौपचारिक (लेकिन पिछले संस्करणों में काम करता है, कम से कम 1.7.2 में) अब ऐसा करने का तरीका है - $._data(element, "events")

अंडरस्कोर ("_") वही है जो यहां अंतर बनाता है। आंतरिक रूप से, यह बुलावा है $.data(element, name, null, true), अंतिम (चौथा) पैरामीटर एक आंतरिक एक ("प्राइवेट") है।


$ ._ डेटा ("बॉडी", "इवेंट") अपरिभाषित $ ()। jquery; "1.7.1" (1.7.2 और 1.8.1 हर समय "अपरिभाषित" की कोशिश की)
मंगल राबर्टसन

2
@ मिचल - api.jquery.com/jQuery.data का कहना है कि यह एक तत्व को स्वीकार करता है, चयनकर्ता को नहीं।
PhistucK

1
अब ठीक काम करता है: $ ._ डेटा ($ ("बॉडी")। Get (0), "इवेंट्स") या इससे भी बेहतर: $ ("बॉडी")। डेटा ("इवेंट्स")!
मंगल राबर्टसन

2
एफडब्ल्यूआईडब्ल्यू - यह इंगित करते हुए कि यह 'आंतरिक रूप से' अन्य डेटा फ़ंक्शन को एक पैरामीटर के साथ कॉल करता है जिसे हम विशेष रूप से दस्तावेज़ नहीं करते हैं शायद इसकी आवश्यकता नहीं है। लेकिन हां, jQuery._data( element, "events" )अब यह जानकारी प्राप्त करने का 'सही' तरीका है।
गनरफ

34

बेशर्म प्लग, लेकिन आप findHandlerJS का उपयोग कर सकते हैं

इसका उपयोग करने के लिए आपको बस findHandlersJS को शामिल करना होगा (या सिर्फ कच्चे जावास्क्रिप्ट कोड को कॉपी और पेस्ट करना होगा क्रोम के कंसोल विंडो को ) और उन तत्वों के लिए ईवेंट प्रकार और एक jquery चयनकर्ता निर्दिष्ट करें जिनमें आप रुचि रखते हैं।

अपने उदाहरण के लिए आप जल्दी से अपने द्वारा बताए गए घटना संचालकों को पा सकते हैं

findEventHandlers("click", "#el")
findEventHandlers("mouseover", "#el")

यह वही है जो लौटा जाता है:

  • तत्त्व
    वास्तविक तत्व जहां ईवेंट हैंडलर पंजीकृत किया गया था
  • ईवेंट
    उस प्रकार के jquery ईवेंट हैंडलर के बारे में जानकारी के साथ व्यवस्थित करें, जिसमें हम रुचि रखते हैं (जैसे क्लिक, परिवर्तन, आदि)
    • हैंडलर
      वास्तविक घटना हैंडलर विधि जिसे आप इसे राइट क्लिक करके और शो फंक्शन की परिभाषा का चयन करके देख सकते हैं
    • चयनकर्ता
      चयनित घटनाओं के लिए चयनकर्ता प्रदान करता है। यह सीधी घटनाओं के लिए खाली होगा।
    • लक्ष्य
      उन तत्वों के साथ सूचीबद्ध होते हैं जिन्हें यह ईवेंट हैंडलर लक्षित करता है। उदाहरण के लिए, एक प्रत्यायोजित ईवेंट हैंडलर के लिए जो दस्तावेज़ ऑब्जेक्ट में पंजीकृत है और एक पृष्ठ के सभी बटन को लक्षित करता है, यह संपत्ति पृष्ठ के सभी बटनों को सूचीबद्ध करेगी। आप उन्हें हॉवर कर सकते हैं और उन्हें क्रोम में हाइलाइट करके देख सकते हैं।

आप इसे यहाँ आज़मा सकते हैं


मुझे लगता है कि स्वीकृत उत्तर होना चाहिए। बस यही मेरे लिए भी काम करता है। यह बहुत अच्छी तरह से घटनाओं के लिए खोज करने वाले सभी तत्वों के माध्यम से जाता है।
मर्किनहो पेली

12

मैं इस उद्देश्य के लिए फ़ायरबग करने के लिए ईवेंटबग प्लगइन का उपयोग करता हूं


धन्यवाद, शानदार टिप। एक्सटेंशन फायरबग ("इवेंट्स") में एक टैब जोड़ता है जो पेज की घटनाओं को दिखाता है, इसलिए आप उन्हें आसानी से एक्सपोज़ कर सकते हैं।
ग्रुबर

11
साथ ही, क्रोम डेवलपर टूल्स में "एलीमेंट्स" टैब के तहत "इवेंट श्रोताओं" और "स्रोत श्रोताओं" टैब के तहत "इवेंट श्रोता ब्रेकप्वाइंट" है।
क्लेज़र्मक 1

10

मैंने दोनों समाधानों को @jps से एक फ़ंक्शन में जोड़ा है:

jQuery.fn.getEvents = function() {
    if (typeof(jQuery._data) === 'function') {
        return jQuery._data(this.get(0), 'events') || {};
    }

    // jQuery version < 1.7.?
    if (typeof(this.data) === 'function') {
        return this.data('events') || {};
    }

    return {};
};

लेकिन सावधान रहें, यह फ़ंक्शन केवल उन घटनाओं को वापस कर सकता है जो स्वयं jQuery का उपयोग करके सेट किए गए थे।


5

1.9 के रूप में घटनाओं को पुनः प्राप्त करने का कोई प्रलेखित तरीका नहीं है, पुराने व्यवहार को पुनर्स्थापित करने के लिए माइग्रेट प्लगइन का उपयोग करने के अलावा अन्य। आप jps उल्लेखों के रूप में _.data () पद्धति का उपयोग कर सकते हैं, लेकिन यह एक आंतरिक विधि है। तो बस सही काम करें और माइग्रेट प्लगइन का उपयोग करें यदि आपको इस कार्यक्षमता की आवश्यकता है।

पर jQuery प्रलेखन से .data("events")

1.9 से पहले, .data ("इवेंट्स") का उपयोग किसी तत्व के लिए jQuery के अनिर्दिष्ट आंतरिक ईवेंट डेटा संरचना को पुनः प्राप्त करने के लिए किया जा सकता है यदि किसी अन्य कोड ने "ईवेंट" नाम के साथ डेटा तत्व को परिभाषित नहीं किया था। इस विशेष मामले को 1.9 में हटा दिया गया है। इस आंतरिक डेटा संरचना को पुनः प्राप्त करने के लिए कोई सार्वजनिक इंटरफ़ेस नहीं है, और यह अनिर्दिष्ट है। हालाँकि, jQuery माइग्रेट प्लगइन कोड के लिए इस व्यवहार को पुनर्स्थापित करता है जो उस पर निर्भर करता है।


स्वीकृत उत्तर भी हाल के संस्करणों के लिए इसे प्राप्त करने के नए, सही तरीके को स्पष्ट रूप से दिखाता है : jQuery._data( elem, "events" );...
इयान

2
एक निजी, अविवादित तरीका कभी भी सही तरीका नहीं होगा । सही तरीका - जिसका अर्थ है दस्तावेज, सार्वजनिक और इरादा - माइग्रेट प्लगइन का उपयोग करना है।
ऑलिगॉफ्रेन

3
आप माइग्रेट प्लगइन की बात को गलत समझते हैं। jQuery ने हटाए गए सुविधाओं को हटा दिया है, और माइग्रेट प्लगइन डेवलपर के कोड को नए संस्करणों में माइग्रेट करने में मदद करने के लिए है ताकि वे तुरंत नई सुविधाओं और सुधारों का लाभ उठा सकें, लेकिन कार्यक्षमता खोना नहीं। यह कोडर को यह देखने में मदद करने के लिए है कि उन्हें jQuery के नए संस्करणों का उपयोग ठीक से शुरू करने के लिए क्या करने की आवश्यकता है। सुविधाओं को पुनर्स्थापित करने के लिए आपको इसका उपयोग उत्पादन में नहीं करना चाहिए । इसके अलावा, कई चीजों का दस्तावेज नहीं है और jQuery के प्रलेखन में तारीख तक - उन्होंने इसे पहले बताया है, इसलिए यह एक कारण नहीं है
इयान

इसके अलावा, अगर इसे jQuery ब्लॉग में एक सुझाव के रूप में शामिल किया गया है, तो मैं इसका उपयोग करूंगा
Ian

माइग्रेट प्लगइन पर आपका तर्क उचित लगता है। यदि मैं अपना उत्तर हटाऊं तो ठीक है?
ओलिगोफ़ेन

5

एक तत्व पर घटनाओं की जांच करने के लिए:

var events = $._data(element, "events")

ध्यान दें कि यह केवल प्रत्यक्ष ईवेंट हैंडलर के साथ काम करेगा, यदि आप $ (दस्तावेज़) .on ("ईवेंट-नाम", "jq-selector", फ़ंक्शन () {// लॉजिक}) का उपयोग कर रहे हैं, तो आप देखना चाहेंगे getEvents इस उत्तर के निचले भाग में कार्य करता है

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

 var events = $._data(document.getElementById("myElemId"), "events")

या

 var events = $._data($("#myElemId")[0], "events")

पूर्ण उदाहरण:

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
        <script>
            $(function() {
                $("#textDiv").click(function() {
                    //Event Handling
                });
                var events = $._data(document.getElementById('textDiv'), "events");
                var hasEvents = (events != null);
            });
        </script>
    </head>
    <body>
        <div id="textDiv">Text</div>
    </body>
</html>

जांच करने का एक अधिक संपूर्ण तरीका, जिसमें $ (दस्तावेज़) के साथ स्थापित गतिशील श्रोता शामिल हैं

function getEvents(element) {
    var elemEvents = $._data(element, "events");
    var allDocEvnts = $._data(document, "events");
    for(var evntType in allDocEvnts) {
        if(allDocEvnts.hasOwnProperty(evntType)) {
            var evts = allDocEvnts[evntType];
            for(var i = 0; i < evts.length; i++) {
                if($(element).is(evts[i].selector)) {
                    if(elemEvents == null) {
                        elemEvents = {};
                    }
                    if(!elemEvents.hasOwnProperty(evntType)) {
                        elemEvents[evntType] = [];
                    }
                    elemEvents[evntType].push(evts[i]);
                }
            }
        }
    }
    return elemEvents;
}

उदाहरण उपयोग:

getEvents($('#myElemId')[0])

यह getEventsविधि अत्यधिक शानदार है, लेकिन बात यह है कि यह IE11 में डुप्लिकेट प्रविष्टियाँ देता है (मुझे पता है, IE फिर से, लेकिन कॉर्पोरेट को इसकी आवश्यकता है ...)। संपादित करें: $ ._ डेटा में तत्व के लिए डुप्लिकेट ईवेंट शामिल हैं, भले ही एफएफ पर इसमें कोई भी नहीं है ... अजीब आईई दुनिया। लेकिन डुप्लिकेट इवेंट होने की इस संभावना के लिए यह देखना महत्वपूर्ण है।
डोमिनिक Szymański

ओह, टॉम, यह वास्तव में आपका कोड है जो इस पद्धति के प्रत्येक निष्पादन के साथ घटनाओं को गुणा कर रहा है। अच्छा नही।
डोमिनिक Szymański

4

मैंने एक कस्टम jQuery चयनकर्ता बनाया है जो नियत इवेंट हैंडलर के साथ ही jQuery के कैश के खिलाफ जांच करता है और साथ ही ऐसे तत्व भी हैं जो उन्हें जोड़ने के लिए मूल विधि का उपयोग करते हैं:

(function($){

    $.find.selectors[":"].event = function(el, pos, match) {

        var search = (function(str){
            if (str.substring(0,2) === "on") {str = str.substring(2);}
            return str;
        })(String(match[3]).trim().toLowerCase());

        if (search) {
            var events = $._data(el, "events");
            return ((events && events.hasOwnProperty(search)) || el["on"+search]);
        }

        return false;

    };

})(jQuery);

उदाहरण:

$(":event(click)")

यह उन तत्वों को लौटाएगा जिनके पास एक क्लिक हैंडलर जुड़ा हुआ है।


2

ECMAScript 5.1 / के साथ एक आधुनिक ब्राउज़र में Array.prototype.map, आप भी उपयोग कर सकते हैं

jQuery._data(DOCUMENTELEMENT,'events')["EVENT_NAME"].map(function(elem){return elem.handler;});

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


jQuery._data('ct100_ContentPlaceHolder1_lcsSection','events')["EVENT_NAME"].map(function(elem){return elem.handler;}); बिना टाइप किए गए प्रकार: अज्ञात <अज्ञात>: 1: 62
माइक डब्ल्यू

'ct100_ContentPlaceHolder1_lcsSection'एक स्ट्रिंग है, एक डोम तत्व नहीं है।
जेसन फफन

2

ईवेंट का उपयोग करके पुनर्प्राप्त किया जा सकता है:

jQuery(elem).data('events');

या jQuery 1.8+:

jQuery._data(elem, 'events');

नोट: उपयोग $('selector').live('event', handler) की जाने वाली घटनाओं का उपयोग करके पुनर्प्राप्त किया जा सकता है:

jQuery(document).data('events')

2
jQuery (दस्तावेज़) .डेटा ('ईवेंट') मुझे अपरिभाषित देता है
माइक डब्ल्यू

1

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

मेरे पास एक पंक्ति में एक छवि थी:

<table>
  <td><tr><img class="folder" /></tr><tr>...</tr></td>
</table>

और उस छवि पर एक क्लिक ईवेंट हैंडलर जुड़ा हुआ था:

imageNode.click(function () { ... });

मेरा इरादा क्लिक करने योग्य क्षेत्र को पूरी पंक्ति में विस्तारित करना था, इसलिए मुझे पहली बार सभी छवियां और रिश्तेदार पंक्तियां मिलीं:

tableNode.find("img.folder").each(function () {
  var tr;

  tr = $(this).closest("tr");
  // <-- actual answer
});

अब वास्तविक एवेन्यू लाइन में मैंने मूल प्रश्न का उत्तर देते हुए इस प्रकार किया:

tr.click(this.onclick);

इसलिए मैंने इवेंट हैंडलर को सीधे DOM एलिमेंट से लिया और jQuery क्लिक इवेंट हैंडलर में डाल दिया। एक जादू की तरह काम करता है।

अब, सामान्य मामले में। पुराने प्री-jQuery दिनों में आप दो साधारण अभी तक शक्तिशाली कार्यों के साथ एक वस्तु से जुड़ी सभी घटनाओं को प्राप्त कर सकते हैं, जो हमें डगलस क्रॉकफोर्ड द्वारा नश्वर के लिए उपहार में दिए गए हैं :

function walkTheDOM(node, func)
{
  func(node);
  node = node.firstChild;
  while (node)
  {
    walkTheDOM(node, func);
    node = node.nextSibling;
  }
}

function purgeEventHandlers(node)
{
  walkTheDOM(node, function (n) {
    var f;

    for (f in n)
    {
      if (typeof n[f] === "function")
      {
        n[f] = null;
      }
    }
  });
}


0

यह करने के लिए एक और तरीका है कि बस तत्व को हथियाने के लिए jQuery का उपयोग करें, फिर वास्तविक जावास्क्रिप्ट के माध्यम से जाओ और सेट करें और इवेंट हैंडलर के साथ खेलें। उदाहरण के लिए:

var oldEventHandler = $('#element')[0].onclick;
// Remove event handler
$('#element')[0].onclick = null;
// Switch it back
$('#element')[0].onclick = oldEventHandler;

1
मुझे लगता है कि jQuery इवेंट हैंडलिंग ऑप्टिमाइज़ेशन करता है जो मुझे लगता है कि यहां आपके कोड द्वारा परिधिबद्ध है।
एमिल बर्जरॉन

धन्यवाद, हाँ, मुझे लग रहा था कि यह हैकिंग है - उस अनुकूलन के बारे में अधिक जानने के लिए कोई अच्छा लिंक?
टेम्प्रानोवा

0

मैंने ऊपर दिए गए कुछ उत्तरों को जोड़ दिया और इस पागल दिखने वाली लेकिन कार्यात्मक स्क्रिप्ट का निर्माण किया, जो कि दिए गए तत्व के अधिकांश घटना श्रोताओं की उम्मीद है। बेझिझक इसे अनुकूलित करें।

var element = $("#some-element");

// sample event handlers
element.on("mouseover", function () {
  alert("foo");
});

$(".parent-element").on("mousedown", "span", function () {
  alert("bar");
});

$(document).on("click", "span", function () {
  alert("xyz");
});

var collection = element.parents()
  .add(element)
  .add($(document));
collection.each(function() {
  var currentEl = $(this) ? $(this) : $(document);
  var tagName = $(this)[0].tagName ? $(this)[0].tagName : "DOCUMENT";
  var events = $._data($(this)[0], "events");
  var isItself = $(this)[0] === element[0]
  if (!events) return;
  $.each(events, function(i, event) {
    if (!event) return;
    $.each(event, function(j, h) {
      var found = false;        
      if (h.selector && h.selector.length > 0) {
        currentEl.find(h.selector).each(function () {
          if ($(this)[0] === element[0]) {
            found = true;
          }
        });
      } else if (!h.selector && isItself) {
        found = true;
      }

      if (found) {
        console.log("################ " + tagName);
        console.log("event: " + i);
        console.log("selector: '" + h.selector + "'");
        console.log(h.handler);
      }
    });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="parent-element">
  <span id="some-element"></span>
</div>


0

jQuery आपको केवल किसी दिए गए तत्व के लिए घटनाओं तक पहुंचने नहीं दे रहा है। आप उन्हें अनिर्दिष्ट आंतरिक विधि का उपयोग करके एक्सेस कर सकते हैं

$._data(element, "events")

लेकिन यह अभी भी आपको सभी घटनाओं को नहीं देगा, सटीक होने के लिए आपको सौंपी गई घटनाओं को नहीं दिखाएगा

$([selector|element]).on()

इन घटनाओं को दस्तावेज़ के अंदर संग्रहीत किया जाता है, ताकि आप उन्हें ब्राउज़ करके प्राप्त कर सकें

$._data(document, "events")

लेकिन यह कठिन काम है, क्योंकि पूरे वेबपेज के लिए ईवेंट हैं।

टॉम जी ऊपर बनाया गया फ़ंक्शन जो केवल दिए गए तत्व की घटनाओं के लिए दस्तावेज़ को फ़िल्टर करता है और दोनों तरीकों के आउटपुट को मर्ज करता है, लेकिन इसमें आउटपुट में दोहराव की घटनाओं का दोष था (और प्रभावी रूप से आपके आवेदन के साथ गड़बड़ करने वाले तत्व की jQuery की आंतरिक घटना सूची पर)। मैंने वह दोष ठीक किया और आप नीचे दिए गए कोड को पा सकते हैं। बस इसे अपने देव कंसोल या अपने ऐप कोड में पेस्ट करें और दिए गए तत्व के लिए सभी घटनाओं की अच्छी सूची प्राप्त करने के लिए आवश्यक होने पर इसे निष्पादित करें।

ध्यान देना महत्वपूर्ण है, तत्व वास्तव में HTMLElement है, न कि jQuery ऑब्जेक्ट।

function getEvents(element) {
    var elemEvents = $._data(element, "events");
    var allDocEvnts = $._data(document, "events");
    function equalEvents(evt1, evt2)
    {
        return evt1.guid === evt2.guid;
    }

    for(var evntType in allDocEvnts) {
        if(allDocEvnts.hasOwnProperty(evntType)) {
            var evts = allDocEvnts[evntType];
            for(var i = 0; i < evts.length; i++) {
                if($(element).is(evts[i].selector)) {
                    if(elemEvents == null) {
                        elemEvents = {};
                    }
                    if(!elemEvents.hasOwnProperty(evntType)) {
                        elemEvents[evntType] = [];
                    }
                    if(!elemEvents[evntType].some(function(evt) { return equalEvents(evt, evts[i]); })) {
                        elemEvents[evntType].push(evts[i]);
                    }
                }
            }
        }
    }
    return elemEvents;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.