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) ...
随机推荐
- [转]Squid中的日志出现TCP_CLIENT_REFRESH_MISS的问题排除
转自:http://www.php-oa.com/2008/07/15/tcp_client_refresh_miss.html 今天检查Squid发现大量的日志出现TCP_CLIENT_REFRES ...
- Django+Nginx+MongoDB+Mysql+uWsgi的搭建
搭建目标如下: 图:系统架构图 这个系统可以提供web服务及其它查询应用服务,我用其做一个二手房信息搜集.处理及分发的系统,可以通过浏览器访问,也可以通过定制的客户端进行访问. 一.安装篇 1.下载安 ...
- ios 将Log日志重定向输出到文件中保存
对于真机,日志没法保存,不好分析问题.所以有必要将日志保存到应用的Docunment目录下,并设置成共享文件,这样才能取出分析. 首先是日志输出,分为c的printf和标准的NSLog输出,print ...
- 【ExtJs】使用Cookie、切换主题和语言
转自:http://witmax.cn/extjs-cookie-theme-lang.html 使用Cookie: 1 2 3 Ext.state.Manager.setProvider(new ...
- 团队项目——NABC
N:根据自身遇到的问题,应对铁大环境——查询图书时只能登录网页进行查询,对于我们铁大莘莘学子着实是不方便的.所以此项目诞生. A:对于实现方法,首先我们随移动设备的潮流,做一个Android应用,对于 ...
- struts2标签详解
struts2标签讲解 要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可:<%@ taglib prefix="s" uri="/struts-t ...
- 5方与5W
方案:方位(角色).方向.方针.方式.方法 解答5W2H 轻重.缓急.深浅
- linux入门基础_centos(一)--基础命令和概念
闲来无事干,看看2014自己整理的一些学习笔记.独乐了不如众乐乐吗! 贴出来和大家分享一下,由于篇幅比较长,分成几篇发布吧,由于是学习笔记,可能有些地方写的不是很正确或者说不详细,或者你会看到上面的课 ...
- Asp.net将图片转为Base64编码
protected void Page_Load(object sender, EventArgs e) { Image img = new Bitmap(Server.MapPath("/ ...
- Windows窗体应用程序(非Console)使用libuv实现简单的异步WEB服务器
libuv是一个很强大的异步处理框架(严格意义上不能叫框架,其实就是一组异步函数库,当然框架这东西有各种各样的定义和理解_^...),最初的的目的是用于NODEJS的异步处理,不过因为它是一个独立的项 ...