js事件篇
javascript和html之间的交互式通过事件来实现的,事件就是文档或浏览器窗口中发生的一些特定的交互。
事件流:描述的是从页面中接收事件的顺序。
不同的是,IE和Netscape开发团队竟然提出了差不多是完全相反的事件流概念。IE的事件流失事件流冒泡,而Netscape的事件流是事件流捕获。
<div id="demo"><span id='demo1'>sdasd</span></div>
<script>
var oDiv = document.getElementById('demo');
var oDiv1 = document.getElementById('demo1');
oDiv.onclick = function(){
alert();
}
oDiv1.onclick = function(){
alert("abc");
}
</script>
以这段代码为例
事件冒泡:span->div->body->html->document->window
事件捕获: window->document->html->body->div->span
事件冒泡:
IE的事件流叫做事件冒泡,是指事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点。事件冒泡:span->div->body->html->document->window
事件捕获:
Netscape Communicator团队提出的另一种事件流叫做事件捕获,思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件,事件捕获的用意在于在事件到达预定目标之前捕获它。事件捕获: window->document->html->body->div->span
事件处理程序:
<input onclick="alert(123)">
oDiv.onclick = function(){
alert();
}
oDiv.addEventListener('click',function(){
alert();
},false);
上面是三种事件处理方法,首先第一种方法不推荐,因为违反了HTML与JavaScript分离的准则。
第二种方法只能给一个事件绑定一个响应函数,重复绑定会覆盖之前的绑定。
第三种方法比较推荐,可以绑定多个不同的函数。
addEventListener这个方法有三个参数,第一个参数是你要绑定的事件,第二个参数是执行的函数,第三个参数有两个值(true flase)。
true表示该元素在事件的“捕获阶段”(由外往内传递时)响应事件,
false表示该元素在事件的“冒泡阶段”(由内往外传递时)响应事件;
IE事件处理程序:
IE实现了与DOM中类似的两个方法:attachEvent()和detachEvent()。
btn.attachEvent('click',function(){
alert();
});
由于IE8及更早版本只支持事件冒泡,所以通过attachEvent()添加的事件处理程序都会被添加到冒泡阶段。
下面我们来封装一个能力检测的js库的事件部分:
var oDiv = document.getElementById('demo');
var Event = {
addEvent:function(element,type,even){
if(element.addEventListener){
element.addEventListener(type,even,false);
}else if(element.attachEvent){
element.attachEvent('on'+type,even);
}else{
element["on"+type]=even;
}
},
removeEvent:function(element,type,even){
if(element.removeEventListener){
element.removeEventListener(type,even,false);
}else if(element.detachEvent){
element.detachEvent('on'+type,handler);
}else{
element["on"+type]=null;
}
}
};
Event.addEvent(oDiv,"click",function(){
alert();
});
下面我们来介绍一下如何取消事件(冒泡):
事件对象还提供了一个.stopPropagation()方法,该方法可以完全阻止事件冒泡。这个方法也是一种纯JavaScript特性,但在跨浏览器的环境中则无法安全地使用 。不过,只要我们通过jQuery来注册所有的事件处理程序,就可以放心地使用这个方法。w3c的方法是event.stopPropagation(),IE则是使用window.event.cancelBubble = true.
下面我们来封装一个取消事件冒泡的函数:
function stopEventBubble(event){
var e=event || window.event;
if (e && e.stopPropagation){
e.stopPropagation();
}
else{
e.cancelBubble=true;
}
}
是不是很简单呢?其实我们遇到的不都是事件的冒泡与捕获,我们在工作中还可能遇到一些其他的问题。
例如:
我们把单击事件注册到一个锚元素,当用户单击链接时,浏览器会加载一个新页面。这种行为和事件处理程序是不同的。类似地,当用户在编辑完表单后,会触发表单的submit事件,在此事件发生后,表单提交才会真正发生。如果我们不希望执行这种默认操作,那么在事件对象上调用.stopPropagation()方法也没用,因为默认操作不是在正常的事件传播流中发生的。在这种情况下,.preventDefault()方法则可以在触发默认操作之前终止事件 。
事件的传播和浏览器默认操作是相互独立的两套机制,在二者任何一方发生时,都可以终止另一方。
如果想要同时停止事件传播和默认操作,可以在事件处理程序中返回false。
return false;
最后:我们做的许许多多的东西只要涉及到交互就一定涉及到事件的绑定,所有学好js中事件的部分我认为还是非常有必要的,你说是吧?
js事件篇的更多相关文章
- [js]事件篇
一.事件流 1.冒泡事件:从特定的事件到不特定事件依次触发:(由DOM层次的底层依次向上冒泡) (1)示例: <html onclick="add('html<br>')& ...
- 2. web前端开发分享-css,js进阶篇
一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无从下手 ...
- js事件监听器用法实例详解
这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分 ...
- 移动终端学习2:触屏原生js事件及重力感应
如今智能移动设备已经渗透到人们生活的方方面面,用户数量也在不断迅速增长(市场研究机构 eMarketer 在今年初发表的趋势报告中预测,2014年至2018年,中国智能手机用户从总人口的 38.3%增 ...
- web前端开发分享-css,js进阶篇
一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践 经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无 从 ...
- css,js工具篇
4. web前端开发分享-css,js工具篇 web前端开发乃及其它的相关开发,推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emm ...
- 前端面试题目汇总摘录(JS 基础篇)
JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string typeof null; // o ...
- 这可能是最简明扼要的 js事件冒泡机制+阻止默认事件 讲解了
哎 js事件冒泡机制和阻止冒泡 阻止默认行为好像永远也整不清楚,记了忘 忘了记...醉了 这篇文章写完以后下次再忘记 就呼自己一巴掌,忘一次一巴掌 首先要明白两个概念——事件和事件流 事件指的是用户或 ...
- js事件委托 jQuery写法
http://www.cnblogs.com/liugang-vip/p/5616484.html 不是抄的,这篇文章写的细 这是js 事件委托写法 <!DOCTYPE html> < ...
随机推荐
- C++:获取指定目录下的所有文件
1.获得指定目录下的所有文件(不搜索子文件夹) 需要包含的头文件 #include <io.h> #include <string> #include <vector&g ...
- HTML5页面,用JS 禁止弹出手机键盘
用户点击input的时候: 会默认调出手机软键盘: 场景:文本框获取焦点时,需要禁止手机弹出自带的输入键盘: 解决方案1: 用一个p/div等标签显示内容:然后放一个隐藏的input: (可能的场景: ...
- html/css/javascript练习代码
这两天心血来潮学习了前端,自己也做了个小小的网页,不好看QAQ 不过网页上集结了很多零碎的知识,在这里先马克一下.图片地址:https://github.com/lesroad/html-css-js ...
- halcon中你不知道的标定板细节
本人文着重阐述以下问题: halcon是否只能使用halcon专用的标定板? halcon标定板如何生成? halcon标定板如何摆放,拍照数量有无限制? halcon是否只能使用halcon专用的标 ...
- 2017北京赛区H题
题目链接 题意:在n*m的矩阵中选择变换或者不变换一个数变成p,使得最大子矩阵和最小 1<=n,m<=150, -1000<=p<=1000; 题解: 他人题解链接 涉及到知识 ...
- 剑指offer--48.机器人的运动范围
这道题不是要求走一趟最多走多少,而是最多走多少,WA几次才想通. ------------------------------------------------------------------- ...
- c# IE 清除缓存
Response.Buffer = true; Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-); Response.Expir ...
- angularjs 缓存
设置缓存请求的数据:只有请求URL不变,就不会重新发请求 设置带定时时间的缓存: .factory('cacheInterceptor', ['$cacheFactory', '$timeout', ...
- 在Golang中获取系统的磁盘空间内存占用
获取磁盘占用情况(Linux/Mac下有效) import ( "syscall" ) type DiskStatus struct { All uint64 `json:&quo ...
- vue-router(二)后代路由
关键字:router,children ,router-link,router-view,router-link-active 先理解什么是children? 后代路由为某路由中用到router-vi ...