• ECMAScript—事件


    事件

    JavaScript和HML之间的交互是通过事件是实现的。就是用户或者浏览器自身执行的某种动作。
    即可以为HTML的元素设定事件处理程序来预定事件,以便在事件发生的时执行相应的代码。

    事件流

    描述的是从页面中接收事件的顺序。

    例如当点击一个按钮这样的事件产生的时候,并不只是当前的按钮元素接收到这个点击事件,这个按钮的父级容器甚至整个文档都接收到了这个事件。
    事件流要描述的问题就是,这个点击事件它是从父级容器传到按钮本身,还是从按钮本身传到个个父级容器的。

    事件流的分歧
    1.IE的事件冒泡,事件由最具体的元素开始接收,然后逐级向上传到较为不具体的节点。
    2.Netscape 的事件捕获,与IE的顺序相反。
    3.DOM事件流

    综合了以上两个模型,将事件流分为三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。


    要对事件进行处理那么就需要注册事件处理程序,为相应的HTML元素设置事件监听器。

    设置事件监听器的方法

    1.HTML事件处理程序
    在html元素上面对相应的事件属性添加JavaScript事件处理代码

    <button lang-id="button.login" type="submit" id="login-btn" onclick="doLogin()">登录</button>

    缺点:不够灵活,html和JavaScript代码的耦合度太高


    2.单纯的用JavaScript指定事件处理程序

    (1)DOM0级方法
    优点:简单,跨浏览器
    缺点:只支持一个事件处理程序

    var btn=docment.getElementById("login-btn");
    //添加监听器
    btn.onclick=function(){
    //dealing code.........
    };
    //删除
    btn.onclick=null;

    (2)DOM2级方法
    使用 addEventListener()和 removeEventListener()两个方法来添加和删除
    参数:事件名,处理函数(最好写函数名,写匿名函数删除不了监听器),布尔值
    布尔值:true 表示在捕获阶段执行处理 false在冒泡阶段执行处理
    支持的浏览器:主流的浏览器,IE9+

    优点:支持添加多个事件处理程序,按照添加的顺序被执行

    btn.addEventListener("click",hander,false);
    btn.removeEventListener("click",hander,false);

    (3)IE事件处理程序
    使用:attachEvent() 和 detachEvent()
    参数:事件名、 处理函数

    btn.attachEvent("click",hander);
    btn.detachEvent("click",hander); 

    支持的浏览器:opera和IE
    优点:支持添加多个事件处理程序,按照添加的顺序反向被执行


    事件对象
    在事件被触发的时候会产生一个事件对象event,保存着与事件相关的属性和方法。

    1.DOM事件对象
    在兼容DOM事件流的浏览器中,event对象会作为事件处理函数的一个参数被传到函数中。

    2.IE中事件对象的获取方式稍有点复杂
    在IE获取事件对象的方式,是根据指定事件处理程序的方式不同而不同的。
    (1)使用DOM0级方式添加事件处理程序
    btn.onclick=function(){
    var e=window.event;//通过window对象获取
    };

    (2)使用attachEvent方法添加
    a、event对象会作为事件处理函数的一个参数被传到函数中
    b、和DOM0级方式一样通过window.event访问

    兼容性问题:
    对于DOM和IE的事件对象它们的属性和方法是有区别的。虽然实现的功能一样但是名字并不统一。


    其他

    事件流是在具体发生元素和它的父级元素上传播的,那么注册事件程序并不一定要写在当前元素上。下面是在chrome浏览器下做的一个小的测试。

    //======html=========
    <input type="button" id="btn" value="登录" />
    <input type="button" id="btn1" value="登录1" />
    
    //=======js=========
    var btn= document.getElementById('btn');
    btn.onclick=function(e){
             console.log(e.currentTarget);
             console.log(this);
             console.log(e.target);
    };
    document.body.onclick=function(e){
             console.log(e.currentTarget);
             console.log(this);
             console.log(e.target);
    };

    分别点击两按钮,演示效果如下:

  • 相关阅读:
    [国家集训队]墨墨的等式(同余最短路)
    [洛谷P2575]高手过招
    [CSP校内集训]rank
    杀人游戏(tarjan思维好题)
    骑士游戏(spfa好题)
    机房模拟测试4:计数类dp+水题+树上计数
    机房测试模拟2:模拟+数学+数位dp
    机房测试11:最小生成树(最小生成树+二分)
    机房测试模拟1(day2):矩阵+树上贪心+bfs+状压
    机房测试16:字符串专题(AC自动机+dp+kmp)
  • 原文地址:https://www.cnblogs.com/fanglylu/p/6847531.html
Copyright © 2020-2023  润新知