在JavaScript中添加事件的最佳方法是什么?

pau*_*reg 8 html javascript events event-binding

我看到了在JavaScript中设置事件的两种主要方法:

  1. 直接在标记内添加事件,如下所示:

    <a href="" onclick="doFoo()">do foo</a>

  2. 通过JavaScript设置它们,如下所示:

    <a id="bar" href="">do bar</a>

并在该<script>部分内部<head>或外部JavaScript文件中添加一个事件,如果您正在使用prototypeJS:

Event.observe(window, 'load', function() {
    $('bar').observe('click', doBar);
}
Run Code Online (Sandbox Code Playgroud)

我认为第一种方法更容易阅读和维护(因为JavaScript操作直接绑定到链接)但它不是那么干净(因为即使页面没有完全加载,用户也可以点击链接,这可能会导致JavaScript错误在某些情况下).

第二种方法更清晰(在页面完全加载时添加操作)但是更难以知道操作链接到标记.

哪种方法最好?

一个杀手的答案将完全赞赏!

Kon*_*lph 9

我认为第一种方法更易于阅读和维护

我发现事实恰恰相反.请记住,有时会将多个事件处理程序绑定到给定控件.

在一个中心位置声明所有事件有助于组织网站上发生的操作.如果您需要更改某些内容而不必搜索所有调用函数的位置,则只需在一个位置进行更改即可.添加更多应该具有相同功能的元素时,您不必记住向它们添加处理程序; 相反,它通常足以让它们声明一个类,甚至根本不更改它们,因为它们逻辑上属于一个容器元素,所有子元素都连接到一个动作.从实际代码:

$$('#itemlist table th > a').invoke('observe', 'click', performSort);
Run Code Online (Sandbox Code Playgroud)

这将事件处理程序连接到表中的所有列标题,以使表可排序.想象一下,努力使所有列标题可以单独排序.


Tho*_*zer 4

根据我的经验,主要有两点:

1)最重要的是保持一致。我认为这两种方法不一定更容易阅读,只要你坚持下去。只有当这两种方法都在项目中使用时(或者在同一页面上使用更糟糕)时,我才会感到困惑,因为那时我必须开始搜索调用,并且不立即知道在哪里查找。

2) 第二种,Event.observe()即当对多个事件采取相同或非常相似的操作时具有优势,因为当所有这些调用都在同一位置时这变得明显。此外,正如康拉德指出的那样,在某些情况下,这可以通过一次调用来处理。