zoukankan      html  css  js  c++  java
  • 慕课网课程学习--JS事件探秘

     事件流

    事件冒泡(IE):事件最先被最具体的元素(文档中嵌套层次最深的节点)接受,然后逐级向上传播至最不具体的节点(.. -> body ->html -> document);

    事件捕获(网景):不具体的节点更早接收到事件,最具体的节点最后接收到事件,和事件冒泡相反。


    事件处理程序

    1、HTML事件处理程序

    原理:把事件直接在HTML结构中的HTML元素上。

    方法一、

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

    方法二、

    <input type="button" value="click" onclick="show()">
    <script>
      function show() {
        alert('hello');
      }
    </script>

    缺点:HTML和JS代码紧密耦合在一起。

    2、DOM0级事件处理程序 (简单、跨浏览器优势、用得较多)

    原理:把一个函数赋值给一个事件的处理程序属性。

    1 <input type="button" value="click" id="bnt">
    2 <script>
    3   var bnt1 = document.getElementById('bnt'); //获得bnt按钮对象
    4   btn1.onclick = function() {     //onclick事件是bnt按钮对象的属性
    5        alert('hello');
    6   }
    7 </script>

    如果想取消这个事件(删除bnt1的onclick属性):

    bnt1.onclick = null;

    3、DOM2级事件处理程序

    原理:通过定义两个方法实现, 1)指定事件处理程序 2)删除事件处理程序。

    所有的DOM节点均包含这两个方法.

    对于IE,Opera: attachEvent();  detachEvent();

    接收两个参数(因为是IE,事件流为:事件冒泡,所以没有第三个参数--IE8及更早版本的浏览器只支持事件冒泡):

    1、要处理的事件名(如'onclick',需要加'on')

    2、事件处理程序的函数

     1 <input type="button" value="click" id="bnt">
     2 <script>
     3    function show () {
     4       alert('hello');
     5    }
     6   
     7     var bnt1 = document.getElementById("bnt");
     8     bnt1.attachEvent('onclick', show; //添加事件
     9     bnt1.detachEvent('onclick', show, false); //删除事件
    10 </script>

    其他浏览器: addEventListener();  removeEventListener();

    接收三个参数:

    1)要处理的事件名(如click,注意没有'on')

    2)事件处理程序的函数

    3)布尔值(true-捕获阶段调用,false-冒泡阶段调用)

     1 <input type="button" value="click" id="bnt">
     2 <script>
     3   function show () {
     4      alert('hello');
     5   }
     6  
     7    var bnt1 = document.getElementById("bnt");
     8    bnt1.addEventListener('click', show, false); //添加事件
     9    bnt1.removeEventListener('click', show, false); //删除事件
    10 </script>

    浏览器兼容性处理

    方法:判断浏览器具有那种事件处理的能力。

     1 <script>
     2 var eventUtil = {
     3     addHandler: function(element, type, handler) {
     4         if (element.addEventListener) { //DOM2级事件处理程序
     5             element.addEventListener(type, handler, false);
     6         } else if (element.attachEventListener) {
     7             element.addEventListener("on" + type, handler); //IE事件处理程序
     8         } else {
     9             element["on" + type] = handler; //因为type为事件属性,所以可以用中括号
    10         }
    11     };
    12 
    13     removeHandler: function(element, type, handler) {
    14         if (element.removeEventListener) { //DOM2级事件处理程序
    15             element.removeEventListener(type, handler, false);
    16         } else if (element.detachEventListener) {
    17             element.EventListener("on" + type, handler);
    18         } else {
    19             element["on" + type] = null;
    20         }
    21     };
    22 }
    23 
    24 function show() {
    25     alert("hello");
    26 }
    27 
    28 var bnt1 = document.getElementById("bnt");
    29 eventUtil.addHandler(bnt1, "click", show);
    30 
    31 </script>
    32 
    33 <input type="button" value="click" id="bnt">
    View Code

     事件对象

    非IE浏览器,可以直接使用event,IE8之前的IE浏览器必须使用window.event。

    1、DOM中的事件对象:

    在触发DOM上的事件都会产生一个事件对象-Event。Event常用属性、方法:

    1. type :事件类型
    2. Target :事件目标
    3. stopPropagation() : 阻止事件冒泡
    4. preventDefault() : 阻止事件默认行为

    2、IE中的事件对象:

    Event常用属性、方法:

    1. type :事件类型
    2. srcElement :事件目标
    3. cancelBubble : 阻止事件冒泡(true阻止)
    4. returnValue : 阻止事件默认行为(false阻止)

     3、解决兼容性问题:

    1 var event = event || window.event;
    2 if(event.stopPropagation) {  //事件方法在判断时也不需要加()
    3   event.stopPropagation();
    4 }else {
    5   event.cancelBubble = true;
    6 }
    7     

  • 相关阅读:
    js中面向对象的写法
    js中防止全局变量被污染的方法
    移动端的头部标签和meta
    励志
    UX是什么?
    HTTP
    Django RestFramework (DRF)
    Vue(一)
    Vue-基础
    Vue-es6基础语法
  • 原文地址:https://www.cnblogs.com/hemi/p/4008200.html
Copyright © 2011-2022 走看看