js 事件和事件处理

一般我们给一个元素添加事件,有两种方式

一个是0级DOM,直接在html中属性中添加各类事件

<html>
<body>
    <div id="div1" onclick="fn1()">div1
        <div id="div2">div2
            <div id="div3">div3</div>
        </div>
    </div>
</body>
</html>

还可以在js中添加相应事件

<script>
    document.getElementById("div1").onclick = fn1;  //处理函数是没有()的,不然传递的就是函数的结果
     function fn1(){
     alert("div1");
}
</script>                

上面说的是两个比较常用的添加事件的方法,都是0级DOM事件

下面来看另外一种 :2级DOM事件

DOM2级事件流:

一个事件流包含三个阶段,事件捕获阶段,处于目标阶段和事件冒泡阶段。

随意触发一个事件,比如click或者mouseover,这个事件就会产生一个事件流,然后先从目标对象的外层传入,然后处于目标对象之上,最后又传到外层。

addEventListener(type,fn,bool)  //第一个参数是事件类型如“click”,fn指的是处理的函数,bool表示输入一个布尔值,如果为true,则指定事件句柄将在事件传播的捕捉阶段用于捕捉事件。如果参数为false,则事件句柄就是常规的,当事件直接发生在对象上,或发生在元素子女上,又向上起泡到该元素上的时候,被触发。

attachEvent(type,fn)    //type是一个事件类型,如“onclick” ,这个与上面的方法不同,它是有on的,fn也是只的是处理函数。

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <style type="text/css">
 6         #div1{
 7             background:red;
 8         }
 9         #div2{
10             background:blue;
11         }
12         #div3{
13             background:green;
14         }
15     </style>
16     <script>
17         window.onload = function () {
18             var eventHandler = {                  //事件类
19                 addEvent: function (element, type, fn) {             //添加事件
20                     if (element.addEventListener) {
21                         element.addEventListener(type, fn, false)   //true 先触发外部,在逐渐触发内部 ,false先触发内部,然后触发外部
22                     } else if (element.detachEvent) {
23                         element.attachEvent("on" + type, fn);
24                     } else {
25                         element["on" + type] = fn;
26                     }
27                 },
28                 removeEvent: function (element, type, fn) {         //删除事件
29                     if (element.removeEvenListener) {
30                         element.removeEvenListener(type, fn, false);
31                     } else if (element.detachEvent) {
32                         element.detachEvent(type, fn);
33                     } else {
34                         element["on" + type] = null;
35                     }
36                 }
37             }
38
39             var div1 = document.getElementById("div1");
40             var div2 = document.getElementById("div2");
41             var div3 = document.getElementById("div3");
42             eventHandler.addEvent(div1, "click", function () { alert("div1") });
43             eventHandler.addEvent(div2, "click", function () { alert("div2") });
44             eventHandler.addEvent(div3, "click", function () { alert("div3") });
45         }
46     </script>
47 </head>
48 <body>
49     <div id="div1">div1
50         <div id="div2">div2
51             <div id="div3">div3</div>
52         </div>
53     </div>
54 </body>
55 </html>

捕获阶段 在 div1 处检测是否有 useCapture 为 true 的事件处理程序,若有,则执行该程序,然后再同样地处理 div2。

目标阶段 在 div3 处,发现 div3 就是鼠标点击的节点,所以这里为目标阶段,若有事件处理程序,则执行该程序,这里不论 useCapture 为 true 还是 false。

冒泡阶段 在 div2 处检测是否有 useCapture 为 false 的事件处理程序,若有,则执行该程序,然后再同样地处理 div1。

addEventListener-事件流

当一个事件发生时,分为三个阶段:

捕获阶段 从根节点开始顺序而下,检测每个节点是否注册了事件处理程序。如果注册了事件处理程序,并且 useCapture 为 true,则调用该事件处理程序。(IE 中无此阶段。)

目标阶段 触发在目标对象本身注册的事件处理程序,也称正常事件派发阶段。

冒泡阶段 从目标节点到根节点,检测每个节点是否注册了事件处理程序,如果注册了事件处理程序,并且 useCapture 为 false,则调用该事件处理程序。

关于参数3 userCaoture,

  • true 的触发顺序总是在 false 之前;
  • 如果多个均为 true,则外层的触发先于内层;
  • 如果多个均为 false,则内层的触发先于外层。

之前我们0级DOM上面,一个事件只能绑定一个函数,用2级DOM则可以添加多个处理函数。

<script>
            var div1 = document.getElementById("div1");
            div1.addEventListener("click", fn1, false);
            div1.addEventListener("click", fn2, false);
//添加2个处理函数,fn1,fn2  ,而0级DOM是不可以的
</script>

2级DOM事件优点:

可以对同一物件的同一事件绑定多个事件处理程序。

可以通过事件流三个阶段更好地控制何时触发事件处理程序。

工作于 DOM 元素,而不仅是 HTML 元素。

js 事件和事件处理

时间: 2024-10-14 05:12:50

js 事件和事件处理的相关文章

【js事件详解】js事件封装函数,js跨浏览器事件处理机制

一.事件流 事件流描述的是从页面中接受事件的顺序.IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流1.事件冒泡事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上转播至最不具体的节点(文档).2.事件捕获事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件. 相关知识链接:js的事件冒泡和事件捕获 二.事件处理程序 1.HTML事件处理程序2.DOM0级事件处理程序3.DOM2级事件处理程序 DOM2级事件定义了两个方法

【repost】JavaScript 事件模型 事件处理机制

什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击.鼠标经过某个特定元素或按下键盘上的某些按键.事件还可能是 Web 浏览器中发生的事情,比如说某个 Web 页面加载完成,或者是用户滚动窗口或改变窗口大小. 通过使用 JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应. 今天的事件 在漫长的演变史,我们已经告

JS事件(事件冒泡和事件捕获)

事件流:描述的是在页面中接收事件的顺序 事件冒泡:由最具体的元素接收,然后逐级向上传播至最不具体的元素的节点(文档) 事件捕获:最不具体的节点先接收事件,而最具体的节点应该是最后接收事件 DOM中:用于处理指定和删除事件处理程序的操作addEventListener()和removeEventListener().他们都接收三个参数:要处理的事件名.作为事件处理程序的函数和布尔值(事件处理的时候)[true:事件捕获时;false:事件冒泡时] DOM中的事件对象: type属性 用于获取事件类

JS的Touch事件们,触屏时的js事件

丫的,终于找到了JS在平板电脑上的事件!!! iphone.ipod Touch.ipad触屏时的js事件 1.Touch事件简介 pc上的web页面鼠标会产生onmousedown.onmouseup.onmouseout.onmouseover.onmousemove的事件,但是在移动终端如iphone.ipod Touch.ipad上的web页面触屏时会产生ontouchstart.ontouchmove.ontouchend.ontouchcancel事件,分别对应了触屏开始.拖拽及完成

JS事件绑定和JQ的事件绑定的几种方式

JS事件绑定的方式: 1.内嵌法: <input type="button" onclick="test()" value="click me"/> 或者是多事件绑定:<input type="button" onclick="javascript:test();test1();" value="click me"/> 2.动态绑定 直接为对象赋值 documen

js事件相关知识点总结

HTML页面是怎样实现交互的? 2017-05-22 js事件之事件流: 事件流原理图:事件流是从window开始,最后回到window的一个过程,分为三个阶段(1~5)捕获过程.(5~6)目标过程.(6~10)冒泡过程. 冒泡型事件:事件按照从最具体的事件目标到最不具体的事件目标(document对象)向上传播的顺序触发. IE 5.5: div -> body -> document IE 6.0: div -> body -> html -> document Mozi

js事件监听机制(事件捕获)总结

在前端开发过程中我们经常会遇到给页面元素添加事件的问题,添加事件的js方法也很多,有直接加到页面结构上的,有使用一些js事件监听的方法,由于各个浏览器对事件冒泡事件监听的机制不同,le浏览器只有事件冒泡,没有事件监听的机制,对于事件监听的兼容性问题是最大的难题: 1.直接把事件的方法写在页面结构上 function eventfun(){ //console.log(this); } <input type="button" onclick="eventfun()&qu

js事件冒泡和捕捉

(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div -> body -> html -> document Mozilla 1.0: div -> body -> html -> document -> window (2)捕获型事件(event capturing):事件从最不精确的对象(document 对象)开

js 事件冒泡是什么如何用jquery阻止事件冒泡

什么是事件起泡:一个事件不能凭空产生,这就是事件的发生等等,接下来为大家介绍下jquery阻止事件起泡以及关于js事件起泡的验证,感兴趣的朋友可以参考下哈 (1)什么是事件起泡 首先你要明白一点,当一个事件发生的时候,该事件总是有一个事件源,即引发这个事件的对象,一个事件不能凭空产生,这就是事件的发生. 当事件发生后,这个事件就要开始传播.为什么要传播呢?因为事件源本身并没有处理事件的能力.例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身不能处理这个事件(废话),事件必须从这个