[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. C标准库-数值字符串转换与内存分配函数

    原文链接:http://www.orlion.ga/977/ 一.数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); dou ...

  2. JAVA服务器搭建之问题总结

    负责维护公司产品的web服务器搭建与维护,最近遇到一下状况,今天在这里简单总结一下,希望对于刚刚一些刚入行的小伙伴有所帮助,避免再走弯路. 第一点:Tomcat内存设置: 一.常见的Java内存溢出有 ...

  3. 详解 ML2 Core Plugin(I) - 每天5分钟玩转 OpenStack(71)

    我们在 Neutron Server 小节学习到 Core Plugin,其功能是维护数据库中 network, subnet 和 port 的状态,并负责调用相应的 agent 在 network ...

  4. Java内存模型深度解析:锁--转

    原文地址:http://www.codeceo.com/article/java-memory-5.html 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步 ...

  5. 项目中遇到的Integer问题--转

    Integer类型值相等或不等分析 http://www.cnblogs.com/zzllx/p/5778470.html 看到博客园一位博友写的面试问题,其中一题是 Integer a = 1; I ...

  6. Masonry 当需要把某个控件进行隐藏的时候有警告的解决方案

    //查看全文 [self.moreBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo (self.conten ...

  7. jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数

    先来看一看jQuery的ajax核心处理流程($.ajax) a. ajax( [url,] options )执行流程 第一步,为传递的参数做适配.url可以包含在options中 //传递的参数只 ...

  8. 用ThreadLocal类实现线程安全的正确姿势

    大家通常知道,ThreadLocal类可以帮助我们实现线程的安全性,这个类能使线程中的某个值与保存值的对象关联起来.ThreadLocal提供了get与set等访问接口或方法,这些方法为每个使用该变量 ...

  9. springmvc处理上传图片代码(校验图片尺寸、图片大小)

    package com.maizuo.web.controller; import com.maizuo.domain.Result; import com.maizuo.util.Constants ...

  10. AngularJS中的方法参数的问题

    在使用AngularJS开发的过程中出现了如下的问题,一次贴记录下. 感觉也不能说是AngularJS的语法,应该说是JS里面的处理流程应该就是这样子,我现在想通过前端页面传递值到后端(通过方法传递) ...