javascript - 如何找到任何元素的绑定(bind)事件

标签 javascript jquery html events event-handling

让,

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

这里我只是举个例子。这里与 span 两个事件已经绑定(bind)。

有没有javascriptjquery方法来找出与任何html元素绑定(bind)的所有事件?

最佳答案

您不能使用 DOM2 样式的事件处理程序(通过 addEventListener/attachEvent 添加的事件处理程序),这几乎意味着您不想这样做DOM2+ 处理程序越来越成为其应有的完成方式(tm)

不过,您在示例中显示的是 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
}

...但是您必须有一个您想了解的列表。

这是一个示例( live copy ):

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+ 处理程序。

另请注意,当您单击某个元素时,即使该元素没有该事件的事件处理程序,也可能会处理该事件 - 因为该事件可以冒泡到父级,而父级会查看event.target,查看相关子项,并采取适当的操作。这就是事件委托(delegate)的工作方式,而且它也越来越成为完成它的方式(tm),所以... :-)

关于javascript - 如何找到任何元素的绑定(bind)事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6544825/

相关文章:

javascript - 如何仅在动态创建的字段上强制使用数字?

javascript - 如何使用正则表达式替换 <li>anything</li> 中的 "i"

javascript - 检查 textarea 是否为空(仅将 'enter' 视为空)?

javascript - td 内的 DIV 找不到父级

html - iframe 不占用全部空间,具体取决于文档类型

javascript - 选择下拉菜单在 Firefox 中提供空白选项

javascript - html canvas可以绘制上传的图像吗?

javascript - 为什么我的浏览器从 Express 加载 JSON 响应?

javascript - 无法下载 HTML Canvas 上的图像

javascript - 后退按钮永远被拦截 - Phonegap/Android