Jquery, bir obyekt istifadə edərək qeydiyyatdan hadisə işleyicilerini tapır

Hansı hadisə işləyicilərinin obyektə qeydə alındığını tapmaq lazımdır.

Məsələn:

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

$("#el") qeydə alınmış siçandır.

Hadisəni işləyənləri tapmaq və ehtimal etmək üçün bir funksiya varmı?

Bu düzgün üsulları istifadə edərək, jQuery obyekti üçün mümkün deyilsə, sadə DOM obyektində mümkündürmü?

499
25 марта '10 в 21:47 2010-03-25 21:47 ages04 martın 25-də təyin edilir '10 da 21:47 2010-03-25 21:47
@ 14 cavab

JQuery 1.8-də olduğu kimi, hadisə məlumatları artıq "ictimai API" dan əldə edilə bilməz. Bu jQuery blog postunu oxuyun. İndi bunu istifadə etməlisiniz:

 jQuery._data( elem, "events" ); 

Element bir jQuery obyekti və selektor deyil, HTML elementi olmalıdır.

Xahiş edirik, bu "özəl" bir daxili quruluşdur və dəyişilməməlidir. Yalnız ayıklama məqsədləri üçün istifadə edin.

JQuery-nin köhnə versiyalarında, köhnə üsula ehtiyacınız ola bilər:

 jQuery( elem ).data( "events" ); 
621
25 марта '10 в 21:50 2010-03-25 21:50 Cavab 25 mart 2010- cu il saat 21: 50-də JPS tərəfindən verilmişdir. 2010-03-25 21:50

Bunu aşağıdakı kimi edə bilərsiniz:

 $("#el").click(function(){ alert("click");}); $("#el").mouseover(function(){ alert("mouseover"); }); $.each($("#el").data("events"), function(i, e) { alert(i); }); //alerts 'click' then 'mouseover' 

JQuery 1.4 + istifadə edirsinizsə, hadisəni və funksiyaları onunla əlaqəli olduğunu xəbərdar edəcək:

border=0
 $.each($("#el").data("events"), function(i, event) { alert(i); $.each(event, function(j, h) { alert(h.handler); }); }); //alerts: //'click' //'function (){ alert("click"); }' //'mouseover' //'function(){ alert("mouseover"); }' 

Burada jsFiddle ilə oynaya bilər.

73
25 марта '10 в 23:21 2010-03-25 23:21 Cavab Nik Craver tərəfindən 25 Mart 2010 tarixində saat 23: 21-də verilir. 2010-03-25 23:21

JQuery 1.8 + üçün, bu artıq işləməyəcək, çünki daxili məlumatlar başqa bir obyektə yerləşdirilir.

Son qeyri-rəsmi bir (lakin əvvəlki versiyalarda, ən azı 1.7.2 versiyasında işləyir) artıq $._data(element, "events")

Alt çizgi ("_") burada fərqləri yaradır. Inside, $.data(element, name, null, true) , sonuncu (dördüncü) parametr daxili ("pvt").

36
05 июля '12 в 14:38 2012-07-05 14:38 Cavab PhistucK tərəfindən 05.07.2012 14:38 tarixində verilir 2012-07-05 14:38

Xəyanətsiz plugin, lakin siz findHandlerJS istifadə edə bilərsiniz

Onu istifadə etmək üçün yalnız findHandlersJS (ya da xrom konsol koduna xam javascripti kopyalayıb yapışdırıb) və hadisə növünü və maraqlı elementlər üçün jquery selektorunu göstərməlisiniz.

Məsələn, işlədiyinizdə qeyd etdiyiniz hadisə işləyicilərini tez bir zamanda tapa bilərsiniz

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

Geri gələn nə budur:

  • element
    Hadisənin işləyicisinin qeydiyyatdan keçdiyi faktiki maddə
  • hadisələr
    Tədbirin maraq növü üçün (məsələn, klik, dəyişiklik və s.) Jquery hadisə işləyiciləri haqqında məlumat olan bir sıra.
    • Handler
      Sağ tıklayarak və Function Show Definition funksiyasını seçərək görə biləcəyiniz faktiki hadisə işləyicisi metodu

    • Seçici selektor təyin olunmuş hadisələri təmin etmişdir. Birbaşa hadisələr üçün boş olacaq.
    • qollar
      Bu hadisə işçisi ilə hədəf olan maddələrlə siyahısı. Məsələn, sənəd obyektində qeydə alınmış və səhifədə olan bütün düymələr üçün nəzərdə tutulan bir hadisə işləyicisi üçün bu xüsusiyyət səhifədə bütün düymələri göstərəcəkdir. Onlara baxa bilərsiniz və xromda vurğulandığını görə bilərsiniz.

Buradan cəhd edə bilərsiniz.

29
21 янв. Cavab Rui 21 Yanvar verilir . 2014-01-21 18:05 '14 da 18:05 2014-01-21 18:05

Bu məqsəd üçün Firebug üçün eventbug plugin istifadə edirəm.

13
26 июля '12 в 9:10 2012-07-26 09:10 Cavab Anton tərəfindən 26 iyul '12, saat 9:10 'da verilir 2012-07-26 09:10

Hər iki həllin bir funksiyaya birləşdirildim:

 jQuery.fn.getEvents = function() { if (typeof(jQuery._data) == 'function') { return jQuery._data(this.get(0), 'events') || {}; } else if (typeof(this.data) == 'function') { // jQuery version < 1.7.? return this.data('events') || {}; } return {}; }; 

Amma diqqətli olun, bu funksiya yalnız jQuery özü ilə təyin edilmiş hadisələri qaytara bilər.

8
12 нояб. Cavab 12 noyabr alqoritmi verilir . 2014-11-12 19:48 '14 at 19:48 2014-11-12 19:48

Sürüm 1.9-dan başlayaraq, keçmiş davranışı bərpa etmək üçün Migrate plugin istifadə etmək istisna olmaqla, hadisələri qəbul etmək üçün sənədli yol yoxdur. Jps xatırladır ki, _.data () metodundan istifadə edə bilərsiniz, ancaq bu daxili bir üsuldur. Beləliklə, bu funksiyanı yerinə yetirmək lazımdırsa, yalnız doğru qaydada istifadə edin və Migrate plugin istifadə edin.

.data("events") üzrə jQuery sənədlərindən

1,9-a qədər data ("hadisələr") jQuery-nin sənədsiz daxili hadisə məlumatlarının strukturunu "hadisələr" adlı bir məlumat elementi müəyyən edən başqa bir kod yoxdursa əldə etmək üçün istifadə edilə bilər. Bu xüsusi iş 1.9-cu ildə silindi. Bu daxili məlumat strukturunu çıxarmaq üçün heç bir açıq interfeys yoxdur və sənədsiz qalır. Lakin, jQuery Migrate plugin bu davranışdan asılı olan kodu üçün bərpa edir.

6
03 апр. Cavab oligofren verilir 03 Aprel. 2013-04-03 11:32 '13 'da 11:32' də 2013-04-03 11:32

ECMAScript 5.1 / Array.prototype.map ilə müasir bir brauzerdə istifadə edə bilərsiniz

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

brauzer konsolunda virgülle ayrılmış işleyicilerin kaynağını yazdırır. Hər şeyin müəyyən bir hadisə üzərində işlədiyini görmək faydalıdır.

3
07 мая '14 в 1:55 2014-05-07 01:55 Jesan Fafon tərəfindən 07.05.2014 tarixində verdiyi cavabda 1:55 2014-05-07 01:55

Hadisələrdən istifadə edilə bilər:

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

və ya jQuery 1.8 +:

 jQuery._data(elem, 'events'); 

Qeyd: $('selector').live('event', handler) istifadə etməklə məhdudlaşdıran hadisələr $('selector').live('event', handler) istifadə edərək qəbul edilə bilər:

 jQuery(document).data('events') 
2
26 июля '12 в 9:04 2012-07-26 09:04 Cavab R. Oosterholt tərəfindən 26 iyul '12 saat 09:04 'da veriləcək 2012-07-26 09:04

Cavabların çoxu maraqlıdır, lakin son zamanlarda mənim də oxşar problemim var idi və DOM yolundan sonra həll çox sadə idi. Bu fərqlidir, çünki təkrar deyilsiniz, ancaq lazım olan hadisə ilə birbaşa məqsədəuyğun olursunuz, amma aşağıda daha ümumi bir cavab verəcəyəm.

Bir sıra şəkil çəkdim:

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

Bu görüntüyə bir tıklama hadisə işleyicisi əlavə olunur:

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

Mənim məqam bütün xətt üzrə kliklə sahəni genişləndirmək idi, buna görə əvvəlcə bütün şəkilləri və nisbi xətləri çəkdim:

 tableNode.find("img.folder").each(function () { var tr; tr = $(this).closest("tr"); // <-- actual answer }); 

İndi əsl anwer xəttində, mən yalnız aşağıdakı sualları cavablandırdım:

 tr.click(this.onclick); 

Beləliklə, hadisə işleyicisini DOM elementindən birbaşa aldım və jQuery tıklama hadisə işleyicisinə qoydu. Bir cazibə kimi çalışır.

İndi ümumiyyətlə. JQuery'den əvvəlki günlərdə, bir obyektə bağlı olan bütün hadisələri ölümcül Douglas Crockford tərəfindən verilən iki sadə, lakin güclü funksiyaları ilə əldə edə bilərsiniz:

 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; } } }); } 
2
14 окт. cavab 14 aylıq pid verilir . 2014-10-14 17:44 '14 də 17:44 2014-10-14 17:44

JQuery önbelleğini və təyin edilmiş hadisə işleyicilerini, eləcə də əlavə etmək üçün öz metodunu istifadə edən elementləri yoxlayan xüsusi bir jQuery seçicisini yaratdım:

 (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); 

Məsələn:

 $(":event(click)") 

Bu, klik işleyicisinin bağlı olduğu maddələrin qaytarılmasına səbəb olacaq.

2
07 нояб. Cavab 07 İyul tarixində Erutan409 tərəfindən verilir. 2017-11-07 22:34 '17 saat 10:34 'da 2017-11-07 22:34

Bunu etmək üçün başqa bir üsul, sadəcə bir element ələ keçirmək üçün jQuery-i istifadə etməkdir və daha sonra hadisələr işləyiciləri ilə birlikdə almaq və qurmaq və oynamaq üçün faktiki Javascriptdən keçməkdir. Məsələn:

 var oldEventHandler = $('#element')[0].onclick; // Remove event handler $('#element')[0].onclick = null; // Switch it back $('#element')[0].onclick = oldEventHandler; 
1
06 апр. Cavab tempranova 06 apr verilir . 2016-04-06 12:32 '16 saat 12:32 'də 2016-04-06 12:32

Chrome istifadə edərkən juggery debugger plugin istifadə edin: https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi?hl=en

0
15 авг. cavab Marquinho Peli tərəfindən 15 avqu. 2016-08-15 18:32 '16 'da 18:32' də 2016-08-15 18:32

Bir maddə üzrə hadisələri yoxlamaq üçün:

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

Qeyd edək ki, bu, yalnız birbaşa hadisə işləyiciləri ilə işləyəcəkdir; $ (document) .on ("hadisə adı", "jq-selector", function () {// logic) istifadə etdiyinizdə, getEvents bu cavabın dibində

Məsələn:

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

və ya

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

Tam nümunə:

 <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> 

Dinamik dinləyicilər də daxil olmaqla daha geniş qiymətləndirmə üsulu, $ (sənəd) istifadə edərək təyin etdi .on

 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; } 

İstifadə nümunəsi:

 getEvents($('#myElemId')[0]) 
0
30 авг. Cavab Tom G 30 aug tərəfindən verilir . 2018-08-30 18:39 '18 'də saat 18:39' da 2018-08-30 18:39

bağlı digər suallar və ya sual