• javascript 事件整理(粗略)


    javascript 事件整理

           由于之前学习javascript时,只是看书并不做笔记,在编码时也不什么主意一些问题的总结,以致javascript的学习进度停滞不前,最近重新看了一次书,感觉很多知识因为不常用竟陌生了许多。因此重新学习和粗略整理一下。ps:参考资料《javascript高级程序设计第三版》

       

         一、事件流

               事件流主要描述的是从页面中接受事件的顺序。但是IE和Netscape却有两种不同的事件流。

              1、事件冒泡   

                        IE的事件流,概念:即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档节点);兼容性:所有的现代浏览器都支持事件冒泡,但具体实现上还是有一点差别。IE9、Firefox、Chrome和Safari 则将事件一直冒泡到window对象,IE5.5及更早版本中的事件冒泡会跳过<html>元素(从<body>直接跳到document。)

              2、事件捕获

                       Nestcape的事件流,概念:不太具体的节点应该更早接受到事件,而最具体的节点应该最后接受到事件,目的是在事件到达预定目标之前捕获它;兼容性:Netscape Communicator 唯一支持的事件流模型,但IE9、Safari、Chrome、Opera和Firefox目前也支持这种事件流。但少人用

              3、DOM事件流

                        “DOM2级事件”规定的事件流包括三个阶段:(1)事件捕获阶段,(2)处于目标阶段,(3)事件冒泡阶段;概念:首先发生的是事件捕获,为截获事件提供了机会,然后是实际的目标接受到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。总的来说综合了前两种事件流。兼容性:IE9、Opera、Firefox、Chrome、Safari都支持DOM事件流;IE8及更早版本不支持DOM事件流。

             总结:事件冒泡兼容性好,放心使用。

    二、事件处理程序

             1、HTML事件处理程序。

                      特点:某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定。这个特性的值应该是能够执行的javascript代码,事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码,也可以访问外部文件中的函数代码。例子:

    <input type="button" value="Click Me"  onclick="alert('clicked')"/>

                    注意:特性中的javascript代码可以通过this 访问当前元素的任何属性,同时可以直接通过event访问事件,例如:

    <input type="button" value="Click Me" onclick="function(){alert(this.id + '  '+ event.type);}">

              

    缺点:(1)用户在DOM节点结构未加载完时触发事件,事件尚未具备执行条件,会抛出错误(2)html和javascript耦合太紧,不利于管理和维护,建议避免使用。       

    2、DOM0级事件处理程序

                特点:通过javascript指定事件处理程序的传统方式,就是将一个函数赋值给一个事件处理程序属性(全部小写,例如onclick),前提条件是必须取得一个要操作的对象的引用。优势:(1)简单,(2)具有跨浏览器的优势。以这种方式添加的事件处理程序会在事件流冒泡阶段被处理

    var btn = document.getElementById("myBtn");
    btn.onclick = function (){
          alert(this.id);
    }

             注意:DOM0级事件处理程序中通过this可以访问元素的任何属性和方法。

             缺点:一个属性只能指定赋值一个事件处理程序,若赋值多个,则被覆盖,以最后的赋值为标准。也可以赋值为null(则删除以这种方式指定的事件处理程序)。

    3、DOM2级事件处理程序

                定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener(),并且它们都接受3个参数(1)要处理的事件名,(2)作为事件处理程序的函数(3)一个布尔值(true表示在捕获阶段调用,false表示在冒泡阶段调用)所有DOM节点都有这两个方法

                优点:可以添加多个事件处理程序。

    var btn = document.getElement("myBtn");
    btn.addEventListener("click",function(){ alert( this.id );},false);
    btn.addEventListener("clcik",function(event){ alert(event.type);},false);

                 注意:这两个事件处理函数会按照添加它们的顺序触发。同时如果在addEventListener()中使用到匿名函数作为事件处理程序时,则无法用removeEventListener()移除该事件处理程序,大多情况下,都是将事件处理程序添加到事件流的冒泡阶段,也即布尔值为false;

                 兼容性:IE9、Firefox、Safari、Chrome和Opera支持DOM2级事件处理程序。

    4、IE事件处理程序

                IE中也定义了两个方法:attachEvent()和detachEvent(),这两个方法接受相同的两个参数(1)“on”+事件处理程序名称(2)事件处理程序函数 ;这两个方法添加的事件处理程序都会被添加到冒泡阶段。  

               优点:可以添加多个事件处理程序。

    var btn = document.getElementById("myBtn");
    btn.attachEvent("onclick",function(){ alert(this === window);});

              注意:用attachEvent()添加的匿名函数将不能被移除,只要能够将对相同函数的引用传给detachEvent(),就可以移除相应的事件处理程序。

              兼容性:支持IE事件处理程序的浏览器有IE和Opera。

      三、事件对象

             1、DOM中的事件对象

                        兼容DOM的浏览器会将一个event对象传入到事件处理程序中。无论指定事件处理程序时使用什么方法(DOM0级或DOM2级),都会传入event对象。

                  

    var btn = document.getElementById("myBtn");
    btn.onclick = function(event){
               alert(event.type);
    };
    btn.addEventListener("click",function(event){ alert(event.type); },false)
    <input id=“btn” type="button" value="Click Me" onclick="alert(event.type)"/>/*三种样例的效果一样*/

                        DOM中的event对象的属性和方法如下:

                            属性/方法                           类型                                 说明

                              bubbles                        布尔值                              表明事件是否冒泡

                              cancelable                     布尔值                              表明是否可以取消事件的默认行为

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

                              target                           Element                           事件的目标

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

                              type                              String                             被触发的事件的类型

                              view                              AbstractView                   与事件关联的抽象视图。等同于发生事件的window对象

                              defaultPrevented            布尔值                              为true则表示已经调用了preventDefault(); {DOM3级事件中新增}

                              detail                            Integer                            与事件相关的细节信息

                              eventPhase                   Integer                            调用事件处理程序的阶段:1表示捕获阶段,2表示“处于目标”,3表示冒泡阶段

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

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

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

                                                             

                               【注意:以上属性或方法都是只读。】

                            

              事件处理程序中的this、currentTarget与target的区别:

                            在事件处理程序中对象this始终等于currentTarget的值(也就事件处理程序所被指定的元素对象中),而target则只包括事件的实际目标(就是真实触发的元素,目标元素)。

             2、IE中的事件对象

                        与访问DOM中的event对象不同,要访问IE中的event对象有几种不同的方式,取决于指定事件处理程序的方法。在使用DOM0级方法添加事件处理程序时,event对象作为window对象的一个属性存在。

    var btn = document.getElementById("myBtn");
    btn.onclick = function(){
                       var event = window.event;
                       alert( event.type );
    }

                    注意:如果事件处理程序是使用attachEvent()添加的,那么就会有一个event对象作为参数被传入事件处理程序函数中。

    var btn = document。getElementById("myBtn");
    btn.attachEvent("onclick",function(event){alert(event.type);});

                   IE中的事件对象event的属性或方法:

                         属性或方法                       类型                    说明

                         type                             String                 被触发的事件类型

                         srcElement                    Element              事件目标(与dom中的target属性同功能)

                         cancelBuble                 布尔值                默认值是false,但将其设置为true就可以取消事件冒泡,(与dom中的stopPropagation()相同)

                         returnValue                 布尔值                默认值为true,但将其设置为false就可以取消事件的默认行为(与dom中的preventDefault()相同)

               【 type,srcElement属性为只读,其他两个为读/写】

    四、跨浏览器的事件处理程序(综合)

          

    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 )
                                            element.removeEventListener(type,handler,false);
                                    else if( event.detachEvent)
                                              element.detachEvent("on"+type,handler);
                                    else
                                           element["on"+type] =null;
                                   },
            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;
                           }
    }
  • 相关阅读:
    hdu1124 Factorial (求解一个数的阶乘中出现多少个0)
    SQL on Linux: Erro Unable to read instance id from /var/opt/mssql/.system/instance_id
    Error during WebSocket handshake: Unexpected response code: 200 问题处理
    CUP计算资源争抢通过IIS启用处理器关联解决
    ABP在MultipleDbContext也就是多库的场景下发布后异常“Could not find content root folder”问题处理
    ABP运行Login failed for user 'IIS APPPOOL XXXXX Reason: Could not find a login matching the name provided问题解决
    vs2017cpu占用过高解决方案
    docker查看挂载目录Volume
    windows 10安装docker一直挂起在Installing Components and Removing Files
    ABP vue+asp.net core yarn serve报 Cannot find module 'typescript/package.json错误
  • 原文地址:https://www.cnblogs.com/hanbingljw/p/3508030.html
Copyright © 2020-2023  润新知