JS之事件(一)
事件:交互
异步监听,不是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之事件(一)的更多相关文章
- 探讨Js的事件的冒泡阶段
近来看到了一个新的知识点叫Js的事件冒泡,因此决定自己来研究一番. 大家应该都知道,Js中的事件处理分为三个阶段,1:事件的捕获阶段,2:处于目标阶段,3:事件的冒泡阶段.那么什么是事件的捕获和冒泡呢 ...
- 浅谈js的事件冒泡机制
很多人都听说过,js的事件冒泡机制,其实,这个说法还是比较生动形象的,就是一个水泡在水底下,冒泡到水面的过程. 那js的事件冒泡机制呢,就是一个DOM树,一级一级向上冒的过程,最终是到document ...
- js键盘事件全面控制详解
js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件 ...
- Js 冒泡事件阻止
Js 冒泡事件阻止 1. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而event.target属性保存着发生事件的目标元素.这个属性是DOM API中规定的,但是没有被所有浏览 ...
- js event 事件兼容浏览器 ie不需要 event参数 firefox 需要
js event 事件兼容浏览器 ie不需要 event参数 firefox 需要 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
- JS通用事件监听函数
JS通用事件监听函数 版本一 //把它全部封装到一个对象中 var obj={ readyEvent:function (fn){ if(fn==null){ fn=document; } var o ...
- js键盘事件全面控制
js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...
- js键盘事件全面控制详解【转】
js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...
- js 鼠标事件的抓取代码
js 鼠标事件的抓取代码,分享给大家. 1.通过ele.setCapture();设置鼠标事件的抓取. 2,应用可以通过单.双击文字来获取时间. <html> <head> & ...
- js Touch事件(向左滑动,后退)
js Touch事件(向左滑动,后退) 代码如下 var touch_p = { c_x : 0, c_y : 0, hasbacked : false }; function touches(ev) ...
随机推荐
- C# 获取图片的EXIF 信息
关于 EXIF 信息的介绍. 1 EXIF,是英文Exchangeable Image File(可交换图像文件)的缩写.EXIF是一种图像文件格式,只是文件的后缀名为jpg.EXIF信息是由数码相 ...
- 002--VS C++ 获取鼠标坐标并显示在窗口上
//--------------------------------------------MyPaint() 函数------------------------------------------ ...
- DSP280x的数模转换使用
/*****************************************************************************Copyright: 2013File na ...
- 安装ubuntu时将boot目录单独挂载的意义
只有一个意义那就是当你的情况是:单个硬盘里面安装多个系统. 如果不是这样,就别动它.
- Socket 一对多通信
服务器(TCPServer.java): package visec; import java.net.*; import java.io.*; public class TCPServer{ pub ...
- SQL Server性能优化(4)命名和书写规范
命名规范是一个老生常谈的问题,好的命名规范对于团队程序开发,对bug定位.处理,项目延续有很重要的作用. 一. 列举现在的问题: 1.名称首字母不大写 2. 用中文名字 ...
- 第七周技术博客发表 web网页开发
a<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org ...
- C#做音乐播放器时在自动下一曲中报异常的解决办法
---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 在利用Media Player做音乐播放器的时 ...
- hdu 4005 The war
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4005 In the war, the intelligence about the enemy is ...
- 【BZOJ】【1717】【USACO 2006 Dec】Milk Patterns产奶的模式
后缀数组 o(︶︿︶)o 唉傻逼了一下,忘了把后缀数组的字典范围改回20001,直接21交了上去,白白RE了两发……sigh 既然要找出现了K次的子串嘛,那当然要用后缀数组了>_>(因为我 ...