Вы не можете использовать обработчики событий в стиле 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
, видит соответствующего потомка и предпринимает соответствующие действия. Вот как работает делегирование события , и это тоже все больше и больше. Как это будет сделано (тм) , так что ...: -)