[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. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  2. 亚马逊云架设WordPress博客

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 这篇文章介绍如何在亚马逊云架设WordPress博客.最强的云,加上最流行的建站工 ...

  3. 如何装出高逼格的64位win7系统

    自从有了ghost这个玩艺儿,装系统就不再是什么技术活了,但是一直崇尚纯净.原生.DIY的挨踢男来说,这种千篇一律的系统从来都不是他们想要的.为了榨干硬件的每一滴性能,发挥软件的最大效果,他们喜欢折腾 ...

  4. 如何远程备份MySQL binlog

    以前备份binlog时,都是先在本地进行备份压缩,然后发送到远程服务器中.但是这其中还是有一定风险的,因为日志的备份都是周期性的,如果在某个周期中,服务器宕机了,硬盘损坏了,就可能导致这段时间的bin ...

  5. [C#]浅析ref、out参数

    转载:http://www.cnblogs.com/vd630/p/4601919.html#top 按引用传递的参数算是C#与很多其他语言相比的一大特色,想要深入理解这一概念应该说不是一件容易的事, ...

  6. Tomcat服务器本地的搭建,以及在 IDEA软件下的配置,以及项目的测试运行(基于supermvc框架下的web)

    一.声明 使用了基于springmvc的supermvc的web框架.实习公司的框架. 二.tomact的下载与安装 1选择适合自己电脑配置的jdk和jre版本(截图来自tomcat的官方网站http ...

  7. DatePickerDialog、AutoCompleteTextView

    DatePickerDialog选择日期,调用showDialog(int id)方法,会执行onCreateDialog方法: @Override protected Dialog onCreate ...

  8. 三步将Node应用部署到Heroku上

    Heroku是一个提供快速部署服务的云平台.支持Node,Ruby,Java,PHP,Python,Go多种语言,今天体验了下,简直不要太爽.下面简单的介绍一下. 首先还是要注册一个账号:https: ...

  9. Sql Server之数据类型详解

      数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为 ...

  10. 加入一个线程:join

    在启动一个线程之后调用该线程的join()方法,会使该线程先执行,该线程执行完成后,再执行调用该线程的线程. 例如如下的任务: public class LiftOff extends Thread ...