您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

对js中事件模型的解析

2024/8/11 15:19:49发布32次查看
这篇文章主要介绍了关于javascript中的事件模型,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
0. 事件与事件流
事件是浏览器与文档交互的瞬间,如点击按钮、填写表格等操作,它是javascript与html之间沟通的桥梁。dom是树状结构,如果同时给父节点都绑定事件时,当触发子节点的时候,这两个事件的发生顺序就牵涉到事件流的内容,它描述的是页面接受时间的顺序。事件流描述的是从页面接收事件的顺序,但比较有意思的是ie和netscape开发团队居然提出了差不多完全相反的概念。ie的事件流是事件冒泡流,而netscape communicator的事件流是事件捕获流。
从而使得 事件流主要分为两种:事件冒泡和事件捕获。
ie的事件流叫做事件冒泡,即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。netscape团队提出的另一种事件流叫做事件捕获(event capturing),事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。捕获的用意在于在事件到达预定目标前捕获它。
dom2级事件规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。
1. dom0级事件模型
dom0级事件模型是早期的事件模型,又称为原始事件模型,在该模型中,事件不会传播,即没有事件流的概念。事件绑定监听函数较为简单,要使用javascript指定事件处理程序,首先必须取得一个要操作的对象的引用。
每个元素(包括window和document)都有自己的事件处理属性,这些属性通常全部小写,如onclick。将这种属性设置成函数就可以指定事件处理程序:
btn = document.getelementbyid("mybtn"= "clicked!"
//html事件处理程序<form method="post"> <input type="text" name="username" value=""> <input type="button" value="username" onclick = "alert(username.value)"></form>
2. dom2级事件模型
在这种模型中,分为三个过程:事件捕获阶段、处于目标阶段7事件冒泡阶段;
事件捕获阶段(capturing phase)。事件从document一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行。
事件处理阶段(target phase)。事件到达目标元素, 触发目标元素的监听函数。
事件冒泡阶段(bubbling phase)。事件从目标元素冒泡到document, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行。
dom2级定义了两个方法,用于处理指定和删除事件处理程序的操作,addeventlistener()和removeeventlistener()。所有dom节点都包含这两个方法,并且有三个参数,要处理的事件名、作为事件处理程序的函数和一个布尔值。要在click事件添加事件处理程序,可以用:
var btn = document.getelementbyid("mybtn");btn.addeventlistener("click", functioin() { alert(this.id);}, false);btn.addeventlistener("click", function() { alert("hello kid");}, false);
此时执行顺序是顺序执行:"mybtn" "hello kid"。ie中的话执行顺序正好相反。
移除事件监听函数的方式如下:
var btn = document.getelementbyid("mybtn");var handler = function() { alert(this.id);};
"click", handler, btn.removeeventlistener("click", handler, );
这里只能用函数表达式的形式作为事件处理程序,因为removeeventlistener()移除的时候要求传入的参数与添加应用程序时使用的参数相同。而通过匿名函数添加的事件监听函数将无法被移除。
3. ie中的事件模型
ie中使用与dom中类似的两个方法:attachevent()和detachevent()。这两个方法接受相同的两个参数,事件处理程序名称和事件处理程序函数。由于ie8及更早的版本只支持事件冒泡,所以通过attachevent()添加的事件处理程序都会被添加到冒泡阶段。如果使用attachevent()为按钮添加一个事件处理程序可用:
var btn = document.getelementbyid("mybtn");var handler = function() { alert(this.id);};btn.attachevent("onclick", handler);//添加事件处理程序btn.detachevent("onclick", handler);//删除事件处理程序
4. 事件对象
dom中的事件对象
type表示被触发的事件类型
target表示事件的目标
currenttarget表示事件处理程序当前正在处理事件的那个元素
cancelable (boolean) 表明是否可以取消事件的默认行为
bubbles (boolean)表明事件是否冒泡
perventdefault()取消事件的默认行为。如果cancelable为true,则可以使用这个方法
stoppropagation()取消事件的进一步捕获或冒泡。如果bubbles为true,则可以使用这个方法。
ie中的事件对象
type表示被触发的事件类型
srcelement表示事件的目标
cancelbubble (boolean)默认是false,将其设为true就可以取消事件冒泡
returnvalue (boolean) 默认是true,将其设置为false就可以取消事件的默认行为
有了上面的事件对象,就可以写出跨浏览器的事件对象封装成事件包裹了。
var eventutil = { addhandler: function(element, type, handler){ if (element.addeventlistener){ element.addeventlistener(type, handler, false); } else if (element.attachevent){ element.attachevent("on" + type, handler); } else { element["on" + type] = handler; } }, removehandler: function(element, type, handler){ if (element.removeeventlistener){ //dom2 element.removeeventlistener(type, handler, false); } else if (element.detachevent){ //ie element.detachevent("on" + type, handler); } else { element["on" + type] = null; //dom0 } }, getevent: function(event){ return event ? event : window.event; }, gettarget: function(event){ return event.target || event.srcelement; }, preventdefault: function(event){ if (event.preventdefault){ event.preventdefault(); } else { event.returnvalue = false; } }, stoppropagation: function(event){ if (event.stoppropagation){ event.stoppropagation(); } else { event.cancelbubble = true; } }};
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注!
相关推荐:
通过node.js来调取baidu-aip-sdk实现身份证识别的功能
如何把js变量值传到php
以上就是对js中事件模型的解析的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product