Как найти событие привязки к любому элементу - PullRequest
0 голосов
/ 01 июля 2011

Позвольте,

<span onclick="foo()" onfocus="goo()">Have Event</span>

Здесь я приведу это только для примера.Здесь с span связывают два события.

Есть ли javascript или jquery способ узнать все события, связанные с любым элементом HTML?

Ответы [ 4 ]

3 голосов
/ 01 июля 2011

Вы не можете использовать обработчики событий в стиле DOM2 (добавленные с помощью addEventListener / attachEvent), что в значительной степени означает, что вы не хотите этого делать, так как обработчики DOM2 + становятся все более доступными. (тм) .

Те, что вы показали в своем примере, являются обработчиками событий DOM0, но вы можете проверить на: Вы можете просмотреть свойства элемента, просматривая те, которые начинаются с «on» и посмотрите, имеют ли они значение:

var element = document.getElementById("theSpan");
var name;
for (name in element) {
    if (name.substring(0, 2) === "on" && element[name]) {
        // It has a DOM0 handler for the event named by `name`
    }
}

Обновление

По-видимому, по крайней мере в Chrome свойства onXyz не перечисляются, поэтому они не отображаются в циклах for..in. А в Firefox вы видите только те, которые назначены программно, а не через атрибуты.

Итак, вы можете проверить их явно:

if (element.onclick) {
    // It has a DOM0-style `click` handler
}

... но у вас будет список тех, о ком вы хотите знать.

Вот пример ( живая копия ):

HTML:

<p id="thePara" onclick="foo()">This is the paragraph</p>
<script>
  // Some other bit of code setting a DOM0 handler programmatically
  document.getElementById("thePara").onmousedown = function() {
    display("<code>onmousedown</code> called for thePara");
  };
</script>

JavaScript:

window.onload = function() {
  // Look up all handlers on thePara
  var element = document.getElementById("thePara");
  var name;
  var names = "onclick onmousedown onchange onmouseup".split(" ");
  var index;

  for (name in element) {
    if (name.substring(0, 2) === "on" && element[name]) {
      display("[loop check] thePara has handler for <code>" + name + "</code>");
    }
  }

  for (index = 0; index < names.length; ++index) {
    name = names[index];
    if (element[name]) {
      display("[explicit check] thePara has handler for <code>" + name + "</code>");
    }
  }
};

function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = msg;
  document.body.appendChild(p);
}

function foo() {
  display("<code>foo</code> called");
}

Обратите внимание, однако, что вы, вероятно, не хотите этого делать, так как вы пропустите обработчики DOM2 +.

Также обратите внимание, что событие может быть обработано, когда вы щелкаете элемент, даже если у этого элемента нет обработчика события для события & mdash; потому что событие может пузырь для родителя, который смотрит на event.target, видит соответствующего потомка и предпринимает соответствующие действия. Вот как работает делегирование события , и это тоже все больше и больше. Как это будет сделано (тм) , так что ...: -)

1 голос
/ 01 июля 2011

Я не знаю, как получить все события, но мы можем получить его, указав его .. Вот код JQuery для отслеживания элементов и событий для onclick, onfocus и onblur.

<div id="log"></div>
<script language="javascript">
$('*[onclick],*[onblur],*[onfocus]').each(function () {
    if($(this).attr('onclick'))
    $('#log').html($('#log').html()+'<br>'+this.tagName+' : onclick : '+$(this).attr('onclick'));
    if($(this).attr('onblur'))
    $('#log').html($('#log').html()+'<br>'+this.tagName+' : onblur : '+$(this).attr('onblur'));
    if($(this).attr('onfocus'))
    $('#log').html($('#log').html()+'<br>'+this.tagName+' : onfocus : '+$(this).attr('onfocus'));
});
</script>
1 голос
/ 01 июля 2011

Если я хорошо помню, .data('events') хранит все связанные события элемента.

В jQuery 1.4.3 установка объекта данных элемента с помощью .data (obj) расширяет ранее сохраненные данныес этим элементом.Сам jQuery использует метод .data () для сохранения информации под именами 'events' и 'handle', а также резервирует любое имя данных, начинающееся с подчеркивания ('_') для внутреннего использования.

jQuery .data ()

Этот метод работает только для событий, связанных через jQuery.

0 голосов
/ 01 июля 2011

Если это просто из любопытства, и вам не нужно, чтобы эти данные обрабатывались каким-либо другим сценарием, вы можете использовать bookmarklet визуальных событий .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...