事件:交互
异步监听,不是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. [小技巧]让你的GridView支持IQueryable,并自动实现真分页

    众所周知,asp.net自带的GridView在自带分页方面设计得很2,因为它是假分页,即内存分页.而且它不智能支持强大的Iqueryable. 但这表明微软忽略了现实中的分页需求吗?答案应该不是,我 ...

  2. Modelsim的demo入门教程

    写在前面的话学过MCU设计的朋友都知道,系统调试是多么的重要.而对于FPGA设计来说,仿真确实最重要的.一个完整的项目,必须有完整的仿真平台.有朋友说,按键仿真模型没法搞. 我只能说,你并不了解硬件及 ...

  3. Oracle把两个空格以上的空格,替换为两个空格

    substr( ,instr(,)),)) ) 解释如下: 1. 去掉原字串左右的空格的字符(STR),2.查找STR中空格出现二次的位置(LOC),3.从STR中的第一位到LOC-1截取STR||L ...

  4. [转]log4net 使用指南

    声明:本文内容主要译自Nauman Leghari的Using log4net,亦加入了个人的一点心得(节3.1.4). 请在这里下载示例代码 1           简介 1.1          ...

  5. OC中数组类NSArray的详解,常用属性和方法(一)

    数组是一个有序的集合,OC中的数组只能存储对象类型, 但是对于对象的类型没有限制. 通过下标访问数组元素,下标从0开始. NSA

  6. 0-N背包为题(动态规划算法)

    /****************0-N背包问题****************** * 有n个物体装入容量为c的背包,每一个物体有一个体积 * 和一个价值,所装入的物体体积之和不大于背包体积, * ...

  7. 模仿cocos2dx 风格用工厂方法,实现class A,不使用宏,

    class A { static A *create(); bool init(); }; A* A::create() { A *pRet=new A; if(pRet && pRe ...

  8. Sqrt(x)

    Implement int sqrt(int x). Compute and return the square root of x. 参考:http://standalone.iteye.com/b ...

  9. Spark系列—02 Spark程序牛刀小试

    一.执行第一个Spark程序 1.执行程序 我们执行一下Spark自带的一个例子,利用蒙特·卡罗算法求PI: 启动Spark集群后,可以在集群的任何一台机器上执行一下命令: /home/spark/s ...

  10. Daily Scrum7

    今天我们小组开会内容分为以下部分: part 1: 研讨上一届的项目里积分制度的功能,确定其不足,以及我们可以改进的地方: part 2: 讨论确定我们项目的积分制度的功能目标: part 3:针对用 ...