zoukankan      html  css  js  c++  java
  • JavaScript--事件模型

    JavaScript--事件模型


    1、HTML事件处理程序

     1.直接在HTML中定义事件处理程序及动作:

    <input type="button" value="Click" onclick="alert('click')">

     2.在HTML定义事件处理程序,调用其他地方的执行函数:

    <script>
    function show(){
    alert("hello world!");
    }
    </script>
    <input type="button" value="Click" onclick="show()">
      • 局部变量event就是指事件对象,onclick="alert(event.type)"弹出click事件
      • this值等于时间目标元素,比如onclick="alert(this.value)",可以得到input的value值。

    2、DOM0级事件处理程序

      优势:简单、跨浏览器的

      弱点:每次只能绑定一个事件,多次绑定会覆盖前面的事件。

    <script>
    var btn= document.getElementById("btn");
    btn.onclick= function () {
    alert("hello world!");
    }
    </script>
    <input type="button" value="Click" id="btn">

      删除DOM0级事件程序:

    btn.onclick=null
    

      

    3、DOM2级事件处理程序

      定义了两个方法添加和删除事件处理程序:addEventListener()和removeEventListener();

      都接受三个参数:事件名,事件处理程序的函数,布尔值

      布尔值:参数是true,表示捕获阶段调用事件处理程序;参数是false,表示在冒泡阶段调用事件处理程序。

          使用DOM2方法添加两个事件处理程序。

    var btn=document.getElementById("btn");
            btn.addEventListener("click", function () {
                alert("helllo world");
            },false);
            btn.addEventListener("click", function () {
                alert(this.id);
            },false);
    <input type="button" value="hello" id="btn"/>

      通过addEventListener()添加的事件处理程序只能通过removeEventListener()来移除;移除的时候传入的参数与添加事件处理程序的参数相同。

     var btn=document.getElementById("btn");
        btn.addEventListener("click", function () {
            alert("hello");
        },false);
        btn.removeEventListener("click", function () {//没有效果
            alert("hello");
        },false);
    

      上面removeEventListener()中的参数,看似和addEventListener()所用的相同,实际不同。

    var btn=document.getElementById("btn");
        var handler=function () {
            alert("hello");
        }
        btn.addEventListener("click",handler ,false);
        btn.removeEventListener("click",handler,false);//有效
    

      

    4、IE事件处理器

       IE中也定义两个方法添加和删除事件处理程序:attachEvent( )和detachEvent( );

      两个相同参数:事件名,事件处理程序函数

      • IE11只支持addEventListener()和removeEventListener();和DOM的的弹出顺序一样。
      • IE9和IE10对attachEvent( )和addEventListener( )都支持//下面的代码可以尝试
    <input id="btn" type="button" value="click"/>
    var btn=document.getElementById("btn"); btn.addEventListener("click",function () { alert("hello"); } ,false); btn.addEventListener("click",function () { alert("world"); } ,false);

     使用attachEvent( )和detachEvent( )

    <input id="btn" type="button" value="click"/>
    var btn=document.getElementById("btn");
        btn.attachEvent("onclick", function () {
            alert("hello");
        });
        btn.attachEvent("onclick", function () {
            alert("world");
        });
    

      删除事件处理程序:attachEvent添加的事件处理程序,必须通过detachEvent删除,参数必须一致。

      同DOM一样,匿名函数无法删除,删除事件处理程序,代码可以这样:

    var btn=document.getElementById("btn");
        var handler= function () {
            alert("hello world");
        };
        btn.attachEvent("onclick", handler);
        btn.detachEvent("onclick",handler);
    

      作用域:在IE中的attachEvent()和DOM中的addEventListener( )主要区别也正于,作用域。

      • DOM2或DOM0级的方法作用域在元素内部,this、值为目标元素。
      • attachEvent( )方法,事件处理程序是在全局作用域,this==window
    <input type="button" value="click" id="btn">//只能在IE10及以下才能运行
    var btn=document.getElementById("btn");
        var handler= function () {
            alert(this==window);
        };
        btn.attachEvent("onclick", handler)
    

      

    5、事件对象

    bubble         表明时间是否冒泡

    cancelable            表示是否可以取消事件冒泡的默认行为

    currentTarget       其实事件处理程序当前正在处理时间的那个元素

    defaultPrevented    为true表示已经调用了preventDefault( )(DOM3级事件中新增)

    detail                      与事件相关的细节

    eventPhase               表示事件处于程序阶段:1、表示捕获阶段,2、表示“处于目标阶段,3、表示冒泡阶段

    preventDefault( )     取消事件默认行为。如果cancelable是true,则可以使用这个方法

    stopImmediatePropagation( ) 取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用(DOM3级事件新增)

    stopPropagation( )  取消事件的进一步捕获或冒泡。如果bubbles为true,则可以使用这个方法

    target                      事件目标

    trusted                    为true表示浏览器生成,为false表示事件由开发人员通过javascript创建(DOM3级事件中新增)

    type       被触发的事件类型

    view                        与事件关联的抽象视图,等同于事件的window对象

    dom.dispatchEvent():模拟事件中触发事件

    6、DOM 事件流

     DOM2级事件规定事件流包括三个阶段: 事件捕获阶段、处于目标阶段和事件冒泡阶段

      这里借了个图。

    假设我们点击了<div>元素,我们会按上图中的顺序触发事件 。

    捕获阶段从document到<html>再到<body>后结束

    然后就是“处于目标”阶段,最后一次返回document(冒泡阶段)

     http://runjs.cn/detail/le6kbt1r  //查看效果

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
        <style>
            #parent{
                border: solid 1px black;
                 200px;
                height: 200px;
            }
            #child{
                border: solid 1px yellowgreen;
            }
        </style>
    </head>
    <body>
    <div>
        <ul>
            <li id="parent">
                我是parent
                <span id="child">
                   我是child
                </span>
            </li>
        </ul>
    </div>
    <script>
        window.onload= function () {
    
            var p=document.getElementById("parent");
            var c=document.getElementById("child");
    
            p.addEventListener("click", function () {
                alert("parent捕获")
            },true);
            p.addEventListener("click", function () {
                alert("parent冒泡")
            },false);
    
            c.addEventListener("click", function () {
                alert("child捕获")
            },true);
            c.addEventListener("click", function () {
                alert("child冒泡")
            },false);
    
        };
    </script>
    </body>
    </html>
      • 点击parent,先在document上,然后到parent上捕获到事件,处于目标阶段event.target==parent触发捕获事件,就是current.Target==target,理解为到底开始冒泡
      • 点击child,从document到parent再到child事件目标,就会先触发parent捕获事件,child捕获事件,然后冒泡从child到parent再到document,依次触发,child冒泡,parent冒泡。
  • 相关阅读:
    转:django关于csrf防止跨站的ajax请求403处理
    django后台的admin工具
    转: 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment
    windowsError:32
    FormData
    django的settings文件
    jquery.serialize() 函数详解
    pycharm中出现unresolved reference的解决办法
    android Listview,gridview局部刷新,部分刷新
    转:Android listview异步图片加载之优化篇——ImageLoader
  • 原文地址:https://www.cnblogs.com/sisiliu/p/5636407.html
Copyright © 2011-2022 走看看