zoukankan      html  css  js  c++  java
  • JavaScript的事件

    一、事件绑定

    要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数。所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称。它是事件驱动编程模式的主要编程方式

    javascript中,有三种常用的绑定事件的方法:

    1. 在DOM元素中直接绑定;
    2. Element节点的事件属性; //DOM0级事件处理程序
    3. 绑定事件监听函; //DOM2级事件处理程序

    在DOM元素中直接绑定(HTML的on-属性)

    在HTML中,我们可以在DOM元素上绑定onclick、onmouseover、onmouseout、onmousedown、onmouseup、ondblclick、onkeydown、onkeypress、onkeyup等

    <div onclick="test()">
    
    <script>
    fucntion test(){
        alert("Hello World");
    }
    </script>

    使用这个方法,只会在冒泡阶段触发。

    使用这种方法时,on-属性的值是将会执行的代码,而不是一个函数。

    Element节点的事件属性(在JavaScript代码中绑定事件)

    在JavaScript代码中(即script标签内)绑定事件可以使JavaScript代码与HTML标签分离,文档结构清晰,便于管理和开发。

    <div id="test">
    
    <script>
    var div = document.getElementById("test");
    div.onclick = function(){
      console.log('Hello World');
    };
    </script>

    使用这个方法,只会在冒泡阶段触发。

    使用事件监听绑定事件(addEventListener方法)

    3个事件阶段

    关于事件监听,W3C规范中定义了3个事件阶段,依次是捕获阶段、目标阶段、冒泡阶段。

    1. 第一阶段:从window对象传导到目标节点,称为“捕获阶段”(capture phase)。
    2. 第二阶段:在目标节点上触发,称为“目标阶段”(target phase)。
    3. 第三阶段:从目标节点传导回window对象,称为“冒泡阶段”(bubbling phase)。

    EventTarget接口

    DOM的事件操作(监听和触发),都定义在EventTarget接口。Element节点、document节点和window对象,都部署了这个接口。

    该接口定义了三个方法:

    1. addEventListener:绑定事件的监听函数
    2. removeEventListener:移除事件的监听函数
    3. dispatchEvent:触发事件

    addEventListener:

    用于在当前节点或对象上,定义一个特定事件的监听函数。(同一节点可以绑定多个事件)

    element.addEventListener(event, function, useCapture)
    
    • event : (必需)事件名,支持所有 DOM事件 。
    • function:(必需)指定要事件触发时执行的函数
    • useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false。

      function test() {
        console.log('Hello world');
      }
      
      var div = document.getElementById('test');
      div.addEventListener('click', test, false);

    removeEventListener:

    用来移除addEventListener方法添加的事件监听函数。(可以解除相应的绑定)

    div.addEventListener('click', listener, false);
    div.removeEventListener('click', listener, false);
    

    dispatchEvent:

    在当前节点上触发指定事件,从而触发监听函数的执行。(后面会细讲)

    二、事件委托

    事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果。

    1.可提高JavaScript性能

    <ul id="list">
      <li id="item1" >item1</li>
     <li id="item2" >item2</li>
     <li id="item3" >item3</li>
    </ul>
    
    <script>
    var item1 = document.getElementById("item1");
    var item2 = document.getElementById("item2");
    var item3 = document.getElementById("item3");
    
    document.addEventListener("click",function(event){
     var target = event.target;
     if(target == item1){
      alert("hello item1");
     }else if(target == item2){
      alert("hello item2");
     }else if(target == item3){
      alert("hello item3");
     }
    })
    </script>

    2.事件委托可用于对动态添加的元素动态的添加事件:

    <ul id="list">
     <li id="item1" >item1</li>
     <li id="item2" >item2</li>
     <li id="item3" >item3</li>
    </ul>
    
    <script>
    var list = document.getElementById("list");
    
    document.addEventListener("click",function(event){
     var target = event.target;
     if(target.nodeName == "LI"){
      alert(target.innerHTML);
     }
    })
    
    var node = document.createElement("li");
    node.id = "item4";
    var textnode = document.createTextNode("item4");
    node.appendChild(textnode);
    list.appendChild(node);
    </script>

    三、自定义事件

    通常情况下,事件的触发都是由用户的行为如点击、刷新等操作实现,但是,其实有的情况下,事件的触发必须又程序来实现。

    dispatchEvent是作为高级浏览器(如chrome、Firfox等)的事件触发器来使用的。

    document.createEvent();// 创建
    event.initEvent();// 初始化
    element.dispatchEvent();// 触发
    

    createEvent参数:HTMLEvents,MouseEvents,UIEvents

    initEvent(eventName, canBubble, preventDefault)。分别表示事件名称,是否可以冒泡,是否阻止事件的默认操作。

    dispatchEvent()就是触发执行了,dom.dispatchEvent(eventObject), 参数eventObject表示事件对象,是createEvent()方法返回的创建的Event对象。

    例子:
    $(dom).addEvent("alert", function() {
        alert("Holle World");
    });
    
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("alert", false, false);
    dom.dispatchEvent(evt);
  • 相关阅读:
    IOS 网络浅析-(四 get&post)
    IOS 网络浅析-(三 NSURLConnection代理)
    IOS 网络浅析 (二 网络异步请求)
    IOS 网络浅析(一 网络监测~Reachability)
    IOS 杂笔- 6(KVC-KVO)
    IOS 杂笔-5(NSTimer极浅析)
    IOS 杂笔-4(属性与成员变量的区别)
    No address associated with hostname
    安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础
    Android中SharedPerforences的简单使用示例 --Android基础
  • 原文地址:https://www.cnblogs.com/ZpandaZ/p/7421743.html
Copyright © 2011-2022 走看看