(第九天)DOM事件
addEventListener
使用addEventListner()方法可以为事件目标注册事件处理程序。addEventListner()接受三个参数。第一个是要注册处理程序的事件类型,这个事件类型(或名字)是字符串,但它不包括应该用于设置事件处理程序属性的前缀”on“。第二个参数是当指定类型的事件发生时应该调用的函数。最后一个参数时布尔值。通常情况下,会给这个参数传递false。如果相反传递了true,那么函数将注册为捕获事件处理程序,并在事件不同的调度阶段调用。你可以忽略第三个参数并无须传递false,同时规范最终应该会改变从而允许这么做。但在下面例子忽略这个参数可能在某些浏览器中报错。
<button id = "btn">click me</button>
var b = document.getElementById("btn");
b.onclick = function() {
alert("Thanks for clicking me!");
}
b.addEventListener("click", function() {
alert("Thanks again!");
}, false);
上述中用"click"作为第一个参数调用addEventListener()不会影响onclick属性的值。在前面的代码中,单击按钮会产生两个alert()对话框。
(1)通过多次调用addEventListener()为同一个对象注册同一事件类型的多个处理程序函数。当对象发生事件时,所有该事件类型的注册处理程序都会按照注册的顺序调用。
(2)使用相同的参数在同一个对象上多次调用addEventListener()是没用的,处理程序仍然只注册一次,同时重复调用也不会改变调用处理程序的顺序。
attachEvent
IE9之前的IE不支持addEventListener()和removeEventListener()。IE5及以后版本定义了类似的方法attachEvent()和detachEvent()。
attachEvent()和detachEvent()方法的工作 原理与addEventListender()和removeEventListener()类似,但有一下例外:
- 因为IE事件模型不支持事件捕获,所以attachEvent()和detachEvent()要求只有两个参数:事件类型和处理程序函数。
- IE方法的第一个参数使用了带”on“前缀的事件处理程序属性名,而非没有前缀的事件类型。例如,当给addEventListener()传递"click"时,要给attachEvent()传递”onclick“。
- attachEvent()允许相同的事件处理程序函数注册多次。当特定的事件类型发生时,注册函数的调用次数和注册次数一样。
经常可以看到的事件处理程序注册代码是在支持addEventListener()的浏览器中就调用它,否则就用attachEvent():
var b = document.getElementById("mybutton");
var handler = function() { alert("Thanks!"); };
if (b.addEventListener)
b.addEventListener("click", hanlder, false);
else if (b.attachEvent)
b.attachEvent("onclick",handler)
事件处理程序的参数
在IE8以前的版本中,通过设置属性注册事件处理程序,当调用它们时并未传递传递事件对象。取而代之,需要通过全局对象 window.event 来获得事件对象。出于互通性,你可编写如下程序,这样如果没有参数就使用window.event:
function handler(event) {
event = event || window.event;
}
向使用attachEvent()注册事件处理程序传递事件对象,但它们也能使用window.event。
事件取消
在支持addEventListener()的浏览器中,也通过调用事件对象的 preventDefault() 方法来取消事件的默认操作。不过,在IE9之前的IE中,可以通过设置事件对象的 returnValue 属性为false来达到同样的效果。
window.onload = function() {
var a = document.getElementById("a");
a.onclick = function(event){
event.preventDefault();
}
}
<a id="a" href="http:www.cnblogs.com">clcik me</a>
/*在IE9以下是不好使的!显示错误:无法获取未定义或 null 引用的属性“preventDefault”*/
接下来进行修改如下:
window.onload = function() {
var a = document.getElementById("a");
a.onclick = function(event){
var event = event || window.event;
event.preventDefault();
}
}
<a id="a" href="http:www.cnblogs.com">clcik me</a>
/*但是在IE8以下还是不支持,必须用event.returnValue = false*/
下面的代码给出三种事件取消技术
function cancelHandler(event) {
var event = event || window.event;
/*这里是处理事件的代码*/
if (event.preventDefault) event.preventDefault(); //标准技术
if (event.returnValue) event.returnValue = false; //IE
return false; //用于处理使用对象属性注册的处理程序
}
事件传播(事件冒泡)
概念
在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。
(1)event.stopPropagation()
事件处理过程中,阻止了事件冒泡,但不会阻击默认行为(它就执行了超链接的跳转)
【注】IE9之前IE不支持stopPropagation()方法。相反,IE事件对象有一个 cancelBubble 属性,设置这个属性为 true 能阻止事件进一步传播。
(2)return false
事件处理过程中,阻止了事件冒泡,也阻止了默认行为
(3)event.preventDefault()
它的作用是:事件处理过程中,不阻击事件冒泡,但阻击默认行为(它只执行所有弹框,却没有执行超链接跳转)
(4)stopImmediatePropagation()
此方法阻止了任何其他对象的事件传播,但也阻止了在相同对象上注册的任何其他事件处理程序的调用。【注】该方法只在IE 11+上支持,如果要求对IE兼容性支持的话,此方法不建议使用
鼠标事件
click contextmenu
/*可以取消的事件,当上下文菜单即将出现时触发。当前浏览器在鼠标右键时显示上下文菜单,所以这个事件也能像click事件使用*/ ondblclick
/*当用户双击鼠标时触发*/ mousedown
/*当用户按下鼠标按键时触发*/ mouseup
/*当用户释放鼠标按键时触发*/ mousemove
/*当用户移动鼠标时触发*/ mouseover
/*当鼠标进入元素时触发*/ mouseout
/*当鼠标离开元素时触发*/ mouseenter
/*类似”mouseover,但不冒泡。IE将其引入,HTML5将其标准化,但未广泛实现“*/ mouseleave
/*类似”mouseout,但不冒泡。IE将其引入,HTML5将其标准化,但尚未广泛实现“*/
文本事件
浏览器有三个传统的键盘输入事件。onkeydown事件、onkeyup事件和onkeypress事件。这三者中keypress是比较高级的事件,它表示产生了一个可打印字符。并且通过keypress事件传递的对象更加混乱。一个onkeypress事件表示输入的单个字符。事件对象以数组Unicode编码的形式指定字符,所以必须用String.fromCharCode()把它转换成字符串。
(第九天)DOM事件的更多相关文章
- DOM 事件深入浅出(二)
在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性 ...
- DOM 事件深入浅出(一)
在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件.敲击键盘事件等.这样的事件行为都是前端DOM事件的组成部分,不同的DOM事件会有不同的触发条件和触发效果.本文 ...
- DOM事件
在慕课网上学习了DOM事件探秘课程,特此整理了一下笔记. 慕课网DOM事件探秘课程地址:http://www.imooc.com/learn/138 事件 是文档或浏览器窗口中发生的特定的交互瞬间.[ ...
- 理解DOM事件流的三个阶段
本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...
- 你真的了解DOM事件么?
你真的了解DOM事件么? 我们大家都知道,人与人之间的交流可以通过语言,文字,肢体动作,面部微表情等,但是你知道Javascript和HTML之间是通过什么进行交互的么?你又知道Javascript和 ...
- [DOM Event Learning] Section 4 事件分发和DOM事件流
[DOM Event Learning] Section 4 事件分发和DOM事件流 事件分发机制: event dispatch mechanism. 事件流(event flow)描述了事件对象在 ...
- dom事件与event对象总结
1 事件:就是文档或浏览器窗口中发生的一些特定的交互瞬间. tips:js和xhtml的交互是通过当用户或浏览器操作网页时发生的事件来处理的. 1.1 事件流:即事件的顺序. 事件 ...
- DOM事件简介--摘自admin10000
Click.touch.load.drag.change.input.error.risize — 这些都是冗长的DOM(文档对象模型)事件列表的一部分.事件可以在文档(Document)结构的任何部 ...
- 从click事件理解DOM事件流
事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这 ...
- DOM事件机制进一步理解
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
随机推荐
- xcode 版本控制推送代码到远程git仓库的步骤
一 代码推送到远程git仓库 1.在git中建立一个下项目(假设项目名称为->Mygit) 2.在xocde上新建一个测试项目(假设项目名称为GitTest) 3.打开电脑终端: 1)首先利用终 ...
- 简单C#、asp.net mvc验证码的实现
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;u ...
- Myeclipse 不能保存汉字
window-->首选项-->content type-->Text-->Default encoding改为UTF-8,点击update
- php随机ip
$ip_long = array( array('607649792', '608174079'), //36.56.0.0-36.63.255.255 array('1038614528', '10 ...
- java发送邮件..转
使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) . 你可以在 JavaMail ...
- Openssl生成证书三板斧
证书创建三步曲: 一.密钥文件 二.请求文 三.根证书签名 最后看需要是否合并证书文件 1. 创立根证书密钥文件(自己做CA)root.key: [kk@test ~]$ openssl genrsa ...
- keepalived 原主上线时vip漂移情况
1. 设置为MASTER,BACKUP 优先级相同 的情况: master端的keepalived起来就会获取到vip变成主. 2. 设置为BACKUP,BACKUP 一个优先级高一个优先级低 的情况 ...
- H5文件操作api--持续完善中
Drop Here <input type="file" onchange="upload(this)" /></p> <div ...
- 学习建模 - UML
最轻量级的工具下载地址 http://staruml.io/download 下载解压依赖:libgcrypt11 https://pan.baidu.com/s/1i3wb6M5 学习地址 http ...
- 四则运算安卓客户端UI截图(部分)
1.我们组安卓手机客户端UI设计主要由林培文同学负责,界面中用到的素材全部由他一人用PS制作,所以在素材来源上当属原创啦.正因为UI由一个人设计,同时他还得分担少量后台代码的编写,颇多的工作量与人才短 ...