事件:交互
异步监听,不是JS引擎监听的
一、绑定
1.ele.onxxxx(eg:onclick) = function (e) {
//回调函数/事件处理函数
}
兼容性很好,但同一个事件仅能绑定一个处理函数
等同在html行间写
this指向本身
2.obj.addEventListener(事件type《字符串》, 处理函数, false);
div.addEventListener('click', function(){
console.log('hald');
},false );
div.addEventListener('click', function(){
console.log('hald1');
} ,false);
同一个事件能同时绑定多个处理函数
但IE9以下不兼容
this指向本身
3.obj.attachEvent('on' + 事件type,function(){
console.log(hald);
} );
IE独有
同一个事件能同时绑定多个处理函数
*this指向window*
div.attachEvent('onclick',function (){
test.call(div);
} )

4/**/
function addEvent(ele, type, handle){
if(ele.addEventListener) {
ele.addEventListener(type,handle,false);
}else if(ele, attachEvent){
ele['temp' + type + handle] = handle
/*匿名函数无法解除绑定,重新写成显示函数使可以解除绑定*/
ele[type + handle] = function(){
ele['temp' + type + handle].call(ele);
}
ele.attachEvent('on' + type, ele[type + handle]);
}else{
ele['on' + type] = handle;
}
}
二.解除绑定
(1)div.onclick = null/''/false;
(2) div.removeEventListener(type, fn(不能是匿名,必须有名字,必须同一个函数), false);

(3)div.detachEvent('on' + type,fn(不能是匿名,必须有名字,必须同一个函数));
**若绑定匿名函数,无法解除

(4)/*封装*/
function removeEvent(ele,type,handle){
if(ele.removeEventListener){
ele.removeEventListener(type,handle,false);
}else if(ele.detachEvent){
ele.detachEvent('on' + type, handle);
}else {
ele['on' + type] = null;
}
}
三、事件冒泡:结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父 元素。(自底向上)
几乎所有事件都有事件冒泡,除个别特殊的
事件捕获:结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子 元素(事件源元素)。(自顶向下)
注意:(1)IE没有捕获事件,仅有谷歌有捕获事件
(2)如果既有冒泡,又有捕获,则先捕获,后冒泡,执行是先绑定的,先执行
(3)focus,blur,chaneg,submit, reset,select等事件不冒泡
四、取消冒泡 和 取消默认事件:
1.取消冒泡:
(1)w3c标准:event.stopPropagation(),不支持IE9以下版本
(2)IE独有:event.cancelBubble = true;
(3)取消冒泡封装:
function stopBubble(event){
if(event.stopPropagation){
event.stopPropagation();
}else {
event.cancelBubble = true;
}
}
2.取消默认事件:
默认事件:表单提交、a标签跳转、右键菜单
(1)return false; 以对象属性的方式注册的事件才生效(例如:document.contextmenu = function(){/*右键菜单事件*/} )
eg:
document.oncontextmenu = function(){//右键触发事件
console.log('a');
return false;//只有类似document这种形式绑定的事件才有用
}
(2) event.preventDefault(); w3c标注,IE9以下不兼容
(3)event.returnValue = false; 兼容IE
(4)封装兼容IE取消默认事件
/*因为return false;适用条件比较特殊,所以没有封装到函数内*/

function cancelHandler(event){
if(event.preventDefault){
event.preventDefault();
}else {
event.returnValue = false;
}
}
(5)<a href = "javascript:void(null)"></a>阻止a默认,古老方式,了解即可
五、事件对象
1.event || window.event 用于IE
IE不会向事件处理函数形参传递事件对象(其他浏览器会),而是将其传入window的event属性上;
2.无论冒泡 或者 捕获都存在第一个点击的对象,即事件源对象
获取方法:
(1)event.target 火狐独有
(2)event.srcElement IE独有
(3)上述两个谷歌都有
(4)兼容性写法:var tar = event.target || event.srcElement;
六、事件委托:利用事件冒泡,和事件源对象处理
eg:
点击事件添加到父元素上,当点击子元素时,由于冒泡事件,所以父元素的点击事件也会被触发,在父元素的点击事件内获取事件源对象(即真正被点击的对象),然后进行源对象的处理即可。
优点:
(1)性能 ,不需要循环所有的元素一个个绑定事件,仅需绑定一个父元素即可
(2)灵活, 当有新的子元素时,不需要重新绑定事件

JS之事件(一)的更多相关文章

  1. 探讨Js的事件的冒泡阶段

    近来看到了一个新的知识点叫Js的事件冒泡,因此决定自己来研究一番. 大家应该都知道,Js中的事件处理分为三个阶段,1:事件的捕获阶段,2:处于目标阶段,3:事件的冒泡阶段.那么什么是事件的捕获和冒泡呢 ...

  2. 浅谈js的事件冒泡机制

    很多人都听说过,js的事件冒泡机制,其实,这个说法还是比较生动形象的,就是一个水泡在水底下,冒泡到水面的过程. 那js的事件冒泡机制呢,就是一个DOM树,一级一级向上冒的过程,最终是到document ...

  3. js键盘事件全面控制详解

      js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件 ...

  4. Js 冒泡事件阻止

    Js 冒泡事件阻止   1. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而event.target属性保存着发生事件的目标元素.这个属性是DOM API中规定的,但是没有被所有浏览 ...

  5. js event 事件兼容浏览器 ie不需要 event参数 firefox 需要

    js event 事件兼容浏览器    ie不需要 event参数   firefox 需要 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  6. JS通用事件监听函数

    JS通用事件监听函数 版本一 //把它全部封装到一个对象中 var obj={ readyEvent:function (fn){ if(fn==null){ fn=document; } var o ...

  7. js键盘事件全面控制

    js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...

  8. js键盘事件全面控制详解【转】

    js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...

  9. js 鼠标事件的抓取代码

    js 鼠标事件的抓取代码,分享给大家. 1.通过ele.setCapture();设置鼠标事件的抓取. 2,应用可以通过单.双击文字来获取时间. <html> <head> & ...

  10. js Touch事件(向左滑动,后退)

    js Touch事件(向左滑动,后退) 代码如下 var touch_p = { c_x : 0, c_y : 0, hasbacked : false }; function touches(ev) ...

随机推荐

  1. SQLite之写一个表

    1.首先你需要一个路径. 获取document目录并返回数据库目录 - (NSString *)dataFilePath{ NSArray *paths = NSSearchPathForDirect ...

  2. Python实现kNN(k邻近算法)

    Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...

  3. 【上传AppStore】iOS项目上传到AppStore步骤流程(第二章) - 利用P12文件生成证书.多人开发必备 & 前言扫盲

    前言的前言 : 有几种关系需要搞清楚的.由我自己经历的坑和看着网上大多数资料来说,比较混乱.现在整理一下 正如前面的文章所言.一套由零 - 申请证书 - AppIDs - Provisioning P ...

  4. C++设计模式——代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...

  5. cocos中使用VS自动创建工程的方法

    为了省事,直接用VS编写了一小段代码,将cocos手动创建工程的命令改用system来执行,免去了手动输入命令的麻烦 其中: -d F:\\cocos2d-x-3.2-projects 是你要存放的工 ...

  6. Ant学习---第五节:Ant_Junit介绍(基于3的版本)

    Junit3 和 Junit4 有本质上的区别 1.普通java类,代码如下: package learn.junit; public class HelloWorld { public String ...

  7. 《实时控制软件设计》Git 基本操作练习

    根据老师提供的教程 对 数据库创建.提交文件.创建分支.删除分支.合并分支.冲突处理等操作进行了练习 得到log文件如下: yanbin-guo@yanbinguo MINGW64 /Git (mas ...

  8. 搭建SpringMVC+MyBatis开发框架五

    建立web结构 1.在webapp目录下新建css.img和js文件夹,删除默认的index.jsp文件:  2.在WEB-INF文件夹下建立一个page文件夹,然后在page下新建一个index. ...

  9. hibernate3连oracle的各种坑。。

    坑一:驱动错误导致sql查询不了,升级驱动到最新版即可 2.通过构造函数封装数据时,如果报错无法实例化并且不是因为字段不对应导致的,可以试试把float改为Float之类的包装类

  10. Unity的物理引擎是如何实现碰撞的呢?

    物理引擎不允许两个碰撞器重叠,当两个或多个物体碰撞时,Unity会根 据他们的旋转速度计算碰撞效果.计算主要根据物体的碰撞器是静止的还 是动态的.物体是不移动的,例如,墙,地面,院子里的喷池等.动态物 ...