转 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;
}
}
}
原出处:http://www.cnblogs.com/fanyong/
转 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的 ...
随机推荐
- Hibernate第二天——实体类 与缓存机制
第二天,我们先来了解一下框架里的一个重要概念:实体类 实体类:把数据表或其它持久化数据的格式映射成的类,就是实体类. 实体类的编写规则:由于对应的是javabean,因而也遵循javabean的一些规 ...
- 2016年JD工作遇到的问题:6-15,日常小问题
6.eclipse通过类名,找到所在的jar包. 解决办法:选中class, 快捷键 Ctrl +Shift+ T!!然后-- 之前经常是,根据类名找到对应的源文件,大脑短路,忘了下面的jar包提示. ...
- bzoj2564 集合的面积
Description 对于一个平面上点的集合P={(xi,yi )},定义集合P的面积F(P)为点集P的凸包的面积. 对于两个点集A和B,定义集合的和为: A+B={(xiA+xjB,yiA+yjB ...
- jQuery学习- 子选择器与可见性选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- python模拟随机游走
在python中,可以利用数组操作来模拟随机游走. 下面是一个单一的200步随机游走的例子,从0开始,步长为1和-1,且以相等的概率出现.纯Python方式实现,使用了内建的 random 模块: # ...
- 05- views视图层
1.配置index 主url from django.contrib import admin from django.urls import path, re_path, include urlpa ...
- zhengruioi 470 区间
区间 链接 题意:给定n个区间[li,ri].你可以选出任意一些区间,设选出的区间个数是s,[l,r]是这些区间的交,求min(s,r-l+1)的最大值. N≤3×105 分析:首先按照左端点排序,然 ...
- vivado与modelsim的联合仿真
转载: 一.在vivado中设置modelsim(即第三方仿真工具)的安装路径.在vivado菜单中选择“Tools”——>“Options...”,选择“General”选项卡,将滚动条拉倒最 ...
- GNS3 jungle newsfeed 隐藏
windows 7 windows 8.1 1.开始---运行 输入(没有引号):“%appdata%” 2.修改---GNS3/gns3_gui.ini 的两行参数 "default_lo ...
- JAVAWEB和数据库 Mysql连接不上的原因及解决方案
有可能是安装了phpstudy或者wampserver这类自带mysql的web集成环境, 在关闭集成环境时误关了相对应的mysql服务,所以我们需要手动启动服务. 启动mysql的命令: net s ...