博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS中的事件
阅读量:4636 次
发布时间:2019-06-09

本文共 4052 字,大约阅读时间需要 13 分钟。

事件中的几种实现方式

    Dom0时代   

       1、直接在html的属性中写JS代码

1 
Div1 Element

       2、定义一个函数,赋值给html元素的onXXX属性

1 
Div Element
2

       3、使用element.onXXX方式

1 
Div Element
2

    Dom2时代

       4、添加事件方式,使用addEventListenerIE专有的attachEvent

 

事件流 

    官方的定义:事件按照从最特定的事件目标到最不特定的事件目标(document对象或者body)的顺序触发。

    也可说,从页面中接收事件的顺序。也就是说当一个事件产生时,这个事件的传播过程,就是事件流。

    事件不是单一的,比如:点击某个按钮,其实也点击了包含按钮的DIV、文档bod、document.

1 2     
3
4
5

    在IE中,冒泡,会按这个顺序输出:1,2,3;

    但在Netscape Navigator 4.0中则是‘反的’,它所支持的是捕获:输出3,2,1;

    而DOM标准中事件流将这两种方式结合

    window -> document -> body -> div -> button -> button -> div -> body -> document -> window;

    这某些情况下,我们可能就需要去阻止事件流的传播:

1 function stopEvent (evt) {2     var e = (evt != null) ? evt : window.event; 3     if (window.event) { 4         e.cancelBubble=true;  // ie5     } else { 6         e.stopPropagation();  // 标准组织7     } 8 }

    绑定、解绑、参数、事件对象IEW3C中的区别

1 Evt.extend({ 2         // 添加事件 3         on : function(ele,type, fn){ 4             if(document.addEventListener){ 5                 ele.addEventListener(type, fn, false); 6             }else if(document.attachEvent){ 7                 ele.attachEvent('on' + type, fn); 8             }else{ 9                 ele['on' + type] = fn;10             }11         },12         // 解除事件13         un : function(ele,type, fn){14             if(document.removeEventListener){15                 ele.removeEventListener(type, fn);16             }else if(document.detachEvent){17                 ele.detachEvent(type, fn);18             }else{19                 ele['on' + type] = null;20             }21         },22         /*点击*/23         click : function(ele,fn){24             this.on(ele,'click',fn);25         },26         // ...27       });

 

Event接口(IE低版本浏览器不做专门的讨论)

    JS里并没有严格的接口概念,只是为程序提供了某个对象拥有某些属性或者方法的描述

      Event对象实现Event接口或子接口,声明了该种事件类型的详细信息。

      其中Event是基础接口,UIEvent 和 MutationEvent是他的子接口。而MouseEvent又是UIEvent的子接口

   

  Event 接口具有如下属性和方法

    Type                     指明事件的类型

    Target                  发生事件的节点      // srcElement

    currentTarget        事件当前传播到达的节点。

    eventPhase            当前所处的事件传播阶段(捕获、目标、冒泡)

    timeStamp            事件发生的时间点(时间戳)

    cancelable              声明事件是否取消默认动作

    bubbles                 声明事件时候在文档中起泡

    stopPorpagation()   阻止冒泡     // cancelBubble

    preventDefault       阻止默认动作的执行

    ...

  UIEvent接口属性

    Event的子接口,在其基础上定义了两个新的属性:

       view   发生事件的window对象

       detail    提供事件的额外信息

  MouseEvent 接口属性

      UIEvent的子接口,在UIEvent基础上定义了下列属性

      button                                          mousedown  click 等事件中,鼠标键的状态(0鼠标左键2鼠标右键)

      altKey ctrlKey metaKay shiftKey      在鼠标事件发生时。是否按下了该键

      clientX \Y                                      事件发生时,鼠标指针相对于浏览器左上角的坐标  

      screenX\Y                                      相对于显示器左上角的坐标

          ...

事件的代理与委托

   通过事件的冒泡机制来实现的

    优点:

        1、是可以节省大量的内存占用,减少事件注册,比如在table上可以代理所有tdclick事件

        2、对新增的子对象不需要再次绑定事件,适于动态内容部分

    缺点:

        不能所有的事件都用代理,不应该触发的元素也被绑上了事件。

1 function delegate(pid, eventType, selector, fn) {  2     var parent = $$.$id(pid);  3     function handle(e){  4       var target = $$.GetTarget(e);  5       console.log(target.nodeName)  6       if(target.nodeName.toLowerCase()=== selector || target.id === selector || target.className.indexOf(selector) != -1){  7         fn.call(target);  8       }  9     } 10     parent[eventType]=handle; 11 } 12 delegate('table','onclick','td',function(){ 13   this.style.color='white' 14   this.style.background='red' 15 })

 自定义事件

 

1  //将有参数的函数封装为无参数的函数 2   function createFunction(obj, strFunc) { 3       var args = [];       //定义args 用于存储传递给事件处理程序的参数 4       if (!obj) obj = window; //如果是全局函数则obj=window; 5       //得到传递给事件处理程序的参数 6       for (var i = 2; i < arguments.length; i++){ 7         // alert(arguments[i]); 8         args.push(arguments[i]); 9       }10       //用无参数函数封装事件处理程序的调用11       return function() {12           obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序13       }14   }15   function class1() {16   }17   class1.prototype = {18       show: function() {19           this.onShow();20       },21       onShow: function() { }22   }23   function objOnShow(userName) {24       alert("hello," + userName);25   }26   function test() {27       var obj = new class1();28       var userName = "test";29       obj.onShow = createFunction(null, "objOnShow", userName);30       console.log(obj.onShow)31       obj.show();32   }33   test()

 

转载于:https://www.cnblogs.com/luqin/p/5239482.html

你可能感兴趣的文章
SqlServer 的IDENTITY_INSERT设置为OFF问题
查看>>
uploadify scriptData参数无法传参的问题
查看>>
atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc...
查看>>
J2SE核心实战开发—— 集合类框架
查看>>
Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程
查看>>
Java线程生命周期
查看>>
展示内容
查看>>
UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数...
查看>>
日志管理
查看>>
Go语言版黑白棋
查看>>
C++经典面试题汇总
查看>>
JavaScript 实现继承的5种方式
查看>>
PL/SQL Developer 9 注册机
查看>>
Serv-U搭建FTP服务器
查看>>
15_采用Pull解析器解析和生成XML内容
查看>>
Delphi语言最好的JSON代码库 mORMot学习笔记1
查看>>
样品GA的良好理解
查看>>
初识python之函数基础
查看>>
vue打包成app后,背景图片不显示
查看>>
Hibernate读书笔记
查看>>