[DOM Event Learning] Section 1 DOM Event处理器绑定的几种方法

 
  网页中经常需要处理各种事件,通常的做法是绑定listener对事件进行监听,当事件发生后进行一些特定处理.
  监听事件的几种方法如下文.
 

第一种,写在页面标签里面

<button onclick="alert('Hello')">Say hello</button>

  上面这行代码,将按钮点击后的弹窗操作在标签声明的时候就绑定了.

  这是一种糟糕的方法,原因如下:
  1.View code(HTML)和交互code(JS)强耦合了.这意味着每次我们想改方法,都需要编辑HTML.
  2.可扩展性差.如果这个方法需要被附加在多个元素上,重复的代码会让页面膨胀,并且维护困难.
 
 

第二种,用JavaScript设置元素对应的onXXX事件属性

  如代码:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
window.onload = function () {
// Event binding using onXXX property from JavaScript
var helloBtn = document.getElementById("helloBtn");
helloBtn.onclick = function (event) {
alert("Hello Button");
}
}
</script> </head>
<body>
<button id="helloBtn">Say hello</button>
</body>
</html>
  这种方法比较简单,并且会覆盖之前的handler,也没有什么浏览器兼容的问题.
 
 

第三种,使用addEventListener()方法

  获取元素之后,可以用addEventListener()方法:
<!DOCTYPE html>
<html> <head>
<script type="text/javascript">
window.onload = function () {
// Event binding using addEventListener
var helloBtn = document.getElementById("helloBtn");
helloBtn.addEventListener("click", function (event) {
alert("Hello.");
}, false); }
</script>
</head>
<body>
<button id="helloBtn">Say hello</button>
</body> </html>
  这种方法在现代的浏览器上是工作良好的,但是在IE9之前的IE浏览器是没有这个方法的,它们用attachEvent().
 

第四种,使用jQuery的方法进行事件处理器绑定

  jQuery为我们处理了这种不兼容问题,因此可以用jQuery的方法来绑定事件:
// Event binding using a convenience method
$("#helloBtn").click(function (event) {
alert("Hello.");
});
  jQuery监听事件有很多种方法:
// The many ways to bind events with jQuery
// Attach an event handler directly to the button using jQuery's
// shorthand `click` method.
$("#helloBtn").click(function (event) {
alert("Hello.");
}); // Attach an event handler directly to the button using jQuery's
// `bind` method, passing it an event string of `click`
$("#helloBtn").bind("click", function (event) {
alert("Hello.");
}); // As of jQuery 1.7, attach an event handler directly to the button
// using jQuery's `on` method.
$("#helloBtn").on("click", function (event) {
alert("Hello.");
}); // As of jQuery 1.7, attach an event handler to the `body` element that
// is listening for clicks, and will respond whenever *any* button is
// clicked on the page.
$("body").on({
click: function (event) {
alert("Hello.");
}
}, "button"); // An alternative to the previous example, using slightly different syntax.
$("body").on("click", "button", function (event) {
alert("Hello.");
});
 
  jQuery 1.7开始,所有的事件绑定方法最后都是调用.on()方法.
  上面这个例子中,前三个方法调用是等价的.
  第四个和第五个方法,监听的是body上所有button元素的click事件.
  DOM树里更高层的一个元素监听发生在它的children元素上的事件,这个过程叫做事件代理(event delegation).
 
 

参考资料

[DOM Event Learning] Section 1 DOM Event 处理器绑定的几种方法的更多相关文章

  1. [DOM Event Learning] Section 3 jQuery事件处理基础 on(), off()和one()方法使用

    [DOM Event Learning] Section 3 jQuery事件处理基础 on(),off()和one()方法使用   jQuery提供了简单的方法来向选择器(对应页面上的元素)绑定事件 ...

  2. [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event

    [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event   事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...

  3. [DOM Event Learning] Section 4 事件分发和DOM事件流

    [DOM Event Learning] Section 4 事件分发和DOM事件流 事件分发机制: event dispatch mechanism. 事件流(event flow)描述了事件对象在 ...

  4. Visual Event :快速查看 DOM 上绑定的 JS 事件

    http://web.jobbole.com/82503/ Javascript中的事件经常被认为如谜一般不可解.Javascript是一个事件驱动的语言,在这样的前提下前面的看法是很奇怪,但是说到它 ...

  5. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

  6. why updating the Real DOM is slow, what is Virtaul DOM, and how updating Virtual DOM increase the performance?

    个人翻译: Updating a DOM is not slow, it is just like updating any JavaScript object; then what exactly ...

  7. 框架操作DOM和原生js操作DOM比较

    问题引出 对于Angular和React操作DOM的速度,和原生js操作DOM的速度进行了一个比较: 一个同学做的demo 代码如下: <!DOCTYPE html> <html n ...

  8. JQuery总结:选择器归纳、DOM遍历和事件处理、DOM完全操作和动画 (转)

    JQuery总结:选择器归纳.DOM遍历和事件处理.DOM完全操作和动画 转至元数据结尾 我们后台可能用到的页面一般都是用jquery取值赋值的,发现一片不错的文章 目录 JQuery总结一:选择器归 ...

  9. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

随机推荐

  1. HttpUrlConnection发送url请求(后台springmvc)

    1.HttpURLConnection发送url请求 public class JavaRequest { private static final String BASE_URL = "h ...

  2. JavaScript变量声明提前

    上周四吃完午饭,leader发了一道JavaScript的题目给我们做,我们Team里面有做前端的,有做后台的,也有做mobile web的,所以大家对题目的理解各自都不一样,然后在QQ讨论组里面进行 ...

  3. 在ASP.NET Web API项目中使用Hangfire实现后台任务处理

    当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送.由于推送这个具体功能,我们采用了第三方的服务.而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现 ...

  4. EasyUI DataGrid 实用例子(2015-05-22)

    代码经过精心改良,可以直接使用,具体看注释吧. 1,前台,代码如下:         <%@ Page Language="C#" AutoEventWireup=" ...

  5. Notepad++使用小结

    还是那句话“工欲善其事必先利其器”用Notepad++也有一段时间了,也积累了一些东西,写篇博文与大家分享一下使用Notepad++的一些心得.  简单的说一下Notepad++是什么东西吧,Note ...

  6. MySQL数据库实例参数对比脚本

    如何对比两个MySQL实例的参数情况,生产中常会有这样的需求,最近写了个python脚本,可基本实现该需求. 脚本 #!/usr/bin/python import MySQLdb,sys def f ...

  7. publishing failed with multiple errors resource is out of sync with the file system--转

    原文地址:http://blog.csdn.net/feng1603/article/details/7398266 今天用eclipse部署项目遇到"publishing failed w ...

  8. 如何获取byte的各个bit值以及常见位操作

    项目中通过信号采集板的数据获取车上仪表盘指示灯的信息,将接收到的数据转成byte后,还要将每一个Byte的各个Bit值分离出来,这样才知道每个bit的值代表的具体信息.这里记录下如何获取byte的各个 ...

  9. Oracle管理磁盘空间和资源

    1.可恢复的空间分配 2.可移动表空间 3.Oracle段收缩功能 4.Oracle数据库资源管理 Reference 1.可恢复的空间分配 1.1 了解可恢复的空间分配 一般情况,我们发出一个大型数 ...

  10. ASP.NET 实现站内信功能(点对点发送,管理员群发)

    正好这段时间在研究这个功能,还是得感谢这位大神,没有他的引路,我就不可能把站内信做出来. http://www.cnblogs.com/grenet/archive/2010/03/08/168065 ...