js事件探秘
Javascript中的事件,可以和html交互。
事件流
IE&Opera:事件冒泡
其他浏览器: 事件捕获
事件冒泡:事件由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至最不具体的那个节点(文档)。
事件捕获:不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。
事件处理程序
1. HTML事件
缺点:
- HTML和js代码紧密的耦合在一起,
- 不利于扩展,
- 只能添加一个事件
2. DOM0 级事件处理程序
把一个函数赋值给一个事件处理程序的属性。
可以添加多个事件处理程序。
3. DOM2 级事件处理程序
DOM2级事件定义了2个方法:
用于处理指定和删除事件处理程序的操作:addEventListener() 和 removeEventListener()
都接收三个参数:要处理的事件名、作为事件处理程序的函数和布尔值(true:表示在事件捕获阶段调用事件处理程序 false:表示事件在事件冒泡阶段调用事件处理程序)。
var btn3 = document.getElementById('btn3');
btn3.addEventListener('click', showMessage, false); // 添加事件
btn3.removeEventListener('click', showMessage, false); // 删除事件
4. IE事件处理程序
attachEvent() 添加事件处理程序
detachEvent() 删除事件处理程序
都接收两个参数:事件处理程序名称和事件处理程序函数
不加第三个参数是因为IE8之前的浏览器只支持事件冒泡。
btn3.attachEvent('onclick', showMessage); // 添加事件处理程序
btn3.detachEvent('onclick', showMessage); // 删除事件处理程序
5. 跨浏览器事件处理程序
使用浏览器能力检测(Browser Compatibility)方法
封装方法:跨浏览器事件处理程序方法封装
var eventUtil = {
// 添加句柄
addHandler: function (element, type, handler) {
if(element.addEventListener){ //DOM2级
element.addEventListener(type, handler, false);
}else if(element.attachEvent){ // DOM0级 IE
element.attachEvent('on' + type, handler);
}else{ // HTML事件
element['on' + type] = handler;
}
},
// 删除句柄
removeHandler: function (element, type, handler) {
if(element.removeEventListener){ //DOM2级
element.removeEventListener(type, handler, false);
}else if(element.detachEvent){ // DOM0级 IE
element.detachEvent('on' + type, handler);
}else{ // HTML事件
element['on' + type] = null;
}
}
}
DOM中的事件对象
在触发DOM上的事件时都会产生一个对象,叫做事件对象。
DOM事件对象event的属性:
1. type属性
用于获取事件类型
如:click等
2.target属性
用于获取事件目标
如:target.nodeName
3.stopPropagation()
用于阻止事件冒泡
4. preventDefault()
用于阻止事件的默认行为
IE中的事件对象
1. type 属性
用于获取事件类型
2. srcElement 属性
用于获取事件目标
IE中没有e.target属性,而是 e.srcElement 属性。
所以,js中获取元素最兼容的写法是:
e = event || window.event; // IE8之前使用window.event 传递事件
var element = e.target || e.srcElement;
3. cancelBubble 属性
用于阻止事件冒泡
true:表示阻止事件冒泡
fales:表示不组织事件冒泡
4. returnValue 属性
用于阻止事件的默认行为
false:表示阻止事件的默认行为
继续封装eventUtil
var eventUtil = {
// 添加句柄
addHandler: function (element, type, handler) {
if(element.addEventListener){ //DOM2级
element.addEventListener(type, handler, false);
}else if(element.attachEvent){ // DOM0级 IE
element.attachEvent('on' + type, handler);
}else{ // HTML事件
element['on' + type] = handler;
}
},
// 删除句柄
removeHandler: function (element, type, handler) {
if(element.removeEventListener){ //DOM2级
element.removeEventListener(type, handler, false);
}else if(element.detachEvent){ // DOM0级 IE
element.detachEvent('on' + type, handler);
}else{ // HTML事件
element['on' + type] = null;
}
},
// 获取事件对象
getEvent: function (event) {
return event ? event : window.event;
},
// 获取事件类型
getType: function (event) {
return event.type;
},
// 获取事件目标对象
getElement: function (event) {
return event.target || event.srcElement;
}
// 阻止事件的默认行为
preventDefault: function (event) {
if (event.preventDefault) {
event.preventDefaul();
}else{
event.returnValue = false;
}
},
// 阻止冒泡
stopPropagation: function (event) {
if (event.stopPropagation) {
event.stopPropagation();
}else{
event.cancelBubble = true;
}
}
}
js事件探秘的更多相关文章
- 转 js事件探秘
Javascript中的事件,可以和html交互. 事件流IE&Opera:事件冒泡其他浏览器: 事件捕获 事件冒泡:事件由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至 ...
- DOM事件探秘
说到DOM事件,就不得不说以下几点: 1 事件流 事件流:描述的是从页面中接受事件的顺序 事件流分为事件冒泡流和事件捕获流.那么什么是事件冒泡,什么是事件捕获呢? 事件冒泡:即事件最开始由最具体的元素 ...
- dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来
dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...
- 什么是JS事件冒泡?
什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理 程序或者事件返回true,那么 ...
- js事件技巧方法整合
window.resizeTo(800,600); //js设置浏览器窗口尺寸 window.open (function(){ resizeTo(640,480);//设置浏览器窗口尺寸 moveT ...
- js事件浅析
js中关于DOM的操作很多,因此js事件机制也就尤为重要. 事件绑定形式: 一. 内联形式 耦合度高,不利于维护 <button onclick="alert('你点击了这个按钮'); ...
- js 事件大全
Js事件大全一般事件 事件 浏览器支持 描述onClick IE3|N2|O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击onDblClick IE4|N4|O 鼠标双击事件onMouseDo ...
- 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别
一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...
- JS事件
JS事件: 声明:为了事件对象event跨浏览器兼容: var oEvent==ev||event; 所以在下面用到 event 的地方都用 oEvent 代替 1)doucument的 ...
随机推荐
- 《剑指offer》-孩子们的游戏(圆圈中最后剩下的数)
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m ...
- 【C语言】字节对齐(内存对齐)
数据对齐 1. 对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...
- hdu 1548 升降梯
题目大意:有一个升降机,它有两个按钮UP和DOWN,给你一些数i表示层数,并且每层对应的Ki,如果按UP按钮,会从第i层升到第i+Ki层:如果按了DOWN则会从第i层降到第i-Ki层:并规定能到的层数 ...
- BZOJ1367 [Baltic2004]sequence 堆 左偏树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1367 题意概括 Description Input Output 一个整数R 题解 http:// ...
- Redis数据结构之字符串
学习阶段分成两个部分,一个是redis客户端,一个是java客户端操作 一:在redis客户端操作 1.先删除里面的几个key 2.set与get与getset 3.数值的增减 值递增1,或者减一 如 ...
- 076 Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)
1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...
- python tkinter-窗体
1.导入自带的包名 import tkinter 2.创建一个窗体对象 form=Tkinter.Tk() 3.显示窗体(这句应该是所有的设置部署完最后执行的一句代码) form.mainloop() ...
- How to uninstall Maya on a Mac
How to uninstall Maya on a Mac Products and versions covered By: Support Jun 15 2018 SHARE ADD TO ...
- (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md
第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...
- JAVA "GMT+10" 和 "GMT+0010"
可以使用 getAvailableIDs 方法来对所有受支持的时区 ID 进行迭代.可以选择受支持的 ID 来获得 TimeZone.如果想要的时区无法用受支持的 ID 之一表示,那么可以指定自定义时 ...