好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

自定义事件

自定义 事件

自定义 事件主要会被用于框架、组件设计与实现中。

自定义 的事件有许多的创建方式,但实际的业务场景中几乎不会被用到,网络上的文献记载其具体的使用场景也相对较少。

1. 使用 Event 构造 函数

使用 Event 构造 函数 就可以创建 一个 自定义 事件。

    < style  >   
    .btn    {   border  :  px solid  #4caf50  ;   padding  :  px px ;   min-width  :  px ;   color  :   #4caf50  ;   background  :  white ;   outline  :  none ;   } 
    .btn  :active    {   background  :   #4caf50  ;   color  :  white ;   } 
    </ style  >  

   < div  >  
     < button   class   =  " btn "   >  点击我   </ button  >  
   </ div  >  

   < script  >   
   var  afterClick  =   new   Event  (  'afterclick'  )  ; 

   var  btnEle  =  document .  querySelector  (  '.btn'  )  ; 

  btnEle .  addEventListener  (  'afterclick'  ,   function  (  )   { 
     alert  (  '我是点击事件执行完后做的事情'  )  ; 
   }  )  ; 

  btnEle .  onclick   =   function  (  )   { 
     alert  (  '我被点击了'  )  ; 

     this  .   dis patchEvent  ( afterClick )  ; 
   }  ; 
    </ script  >  
 

使用 new Event 可以创建 一个 自定义 事件,事件名就是构造 函数 的第 一个 参数 afterclick ,表示点击事件完成后做的事情。

创建 一个 自定义 事件后需要给 DOM 元素绑定这个事件,只有绑定后才能触发,使用 addEventListener 来绑定事件。

随后再给按钮绑定点击事件,在事件末尾,即事情做完后,使用 dis patchEvent 触发这个 自定义 事件。

自定义 事件是需要手动触发的!

Event 构造 函数 还 支持 第二个参数,其接受 一个 对象,可以传递三个 属性 ,都为布尔值:

bubbles 默 认 false ,表示是否会冒泡 cancelable 默 认 false , 表示事件是否可以被取消 composed 默 认 composed, 表示事件是否会在 Shadow DOM 根节点之外触发。

2. 使用 CustomEvent 构造 函数

上面使用 Event 构造 函数 的例子,将其替换成 CustomEvent 构造 函数 也是一样可以执行的。

    < style  >   
    .btn    {   border  :  px solid  #4caf50  ;   padding  :  px px ;   min-width  :  px ;   color  :   #4caf50  ;   background  :  white ;   outline  :  none ;   } 
    .btn  :active    {   background  :   #4caf50  ;   color  :  white ;   } 
    </ style  >  

   < div  >  
     < button   class   =  " btn "   >  点击我   </ button  >  
   </ div  >  

   < script  >   
   var  afterClick  =   new   CustomEvent  (  'afterclick'  )  ; 

   var  btnEle  =  document .  querySelector  (  '.btn'  )  ; 

  btnEle .  addEventListener  (  'afterclick'  ,   function  (  )   { 
     alert  (  '我是点击事件执行完后做的事情,我被改成了 CustomEvent'  )  ; 
   }  )  ; 

  btnEle .  onclick   =   function  (  )   { 
     alert  (  '我被点击了'  )  ; 

     this  .   dis patchEvent  ( afterClick )  ; 
   }  ; 
    </ script  >  
 

两个例子 效果 是一样的。

其主要的区别在参数和工作环境上,CustomEvent 是可以在 WebWorker 中被使用的,而 Event 不行。

CustomEvent 可以在构造 函数 的第二个参数中传递 detail 属性 ,在事件触发时,事件对象中就会携带这个 detail 属性 。

假设现在想完成 一个 键盘 的点击事件,即 键盘 上某个键按下并弹起后做的事情。

    < style  >   
   input   {  width  :  px ;  padding  :  px ;  font-size  :  px ;  outline  :  none ;  border  :  px dashed  #4caf50  ;  } 
   input :focus    {  border  :  px solid  #4caf50  ;  } 
    </ style  >  

   < div  >  
     < input   type   =  " text "   >  
   </ div  >  

   < script  >   
   var  inputEle  =  document .  querySelector  (  'input'  )  ; 

   var   onKeyClick   =   function  ( e )   { 
    console .  log  ( e )  ; 
     alert  (  '现在输入框 内容 是:'   +  e . detail . value  +   ',触发的键是:'   +  e . detail . keyCode )  ; 
   }  ; 

  inputEle .  addEventListener  (  'keyup'  ,   ( e )   =>   { 
    console .  log  (  ' 键盘 按键弹起了'  )  ; 

     var  keyClick  =   new   CustomEvent  (  'keyclick'  ,   { 
      detail :   { 
        value :  e . target . value , 
        keyCode :  e . keyCode , 
       }  , 
     }  )  ; 

    inputEle .  addEventListener  (  'keyclick'  ,  onKeyClick )  ; 

    inputEle .   dis patchEvent  ( keyClick )  ; 

    inputEle .  removeEventListener  (  'keyclick'  ,  onKeyClick )  ; 
   }  )  ; 
    </ script  >  
 

这里通过 keyup 事件,在事件处理器的最末尾 增加 了 一个 keyclick 事件。这里并没有结合 keydown 来判断按键的落下和弹起,因为 一个 按键要弹起,必定得先落下,所以只需要监听 keyup 。

其实可以看出这段 代码 比较奇怪,真正的业务场景并不会这样写,会选择直接 调用 onKeyClick 函数 。

    < style  >   
   input   {  width  :  px ;  padding  :  px ;  font-size  :  px ;  outline  :  none ;  border  :  px dashed  #4caf50  ;  } 
   input :focus    {  border  :  px solid  #4caf50  ;  } 
    </ style  >  

   < div  >  
     < input   type   =  " text "   >  
   </ div  >  

   < script  >   
   var  inputEle  =  document .  querySelector  (  'input'  )  ; 

   var   onKeyClick   =   function  ( value ,  keyCode )   { 
     alert  (  '现在输入框 内容 是:'   +  value  +   ',触发的键是:'   +  keyCode )  ; 
   }  ; 

  inputEle .  addEventListener  (  'keyup'  ,   ( e )   =>   { 
    console .  log  (  ' 键盘 按键弹起了'  )  ; 

     onKeyClick  ( e . target . value ,  e . keyCode )  ; 
   }  )  ; 
    </ script  >  
 

这段 代码 的执行结果和采用 CustomEvent 的 效果 是一样的。

这就是为什么 自定义 事件更常用于框架或者库,因为暴露事件有时候比单纯的提供回调配置项更好理解和解耦。

3. document.createEvent

使用 document.createEvent 也可以用来创建 自定义 事件,但其由于许多配套 属性 、 方法 都已经从标准中移除,MDN 也不再建议开发者使用,所以这里不再深入探讨,只做了解。

4. 小结

自定义 事件不常用,主要被应用于框架级别的设计上,日常开发很少有使用场景,许多场景下还会让 代码 变得冗余复杂。

表单校验 ? ?事件相关的优化

查看更多关于自定义事件的详细内容...

  阅读:37次

上一篇

下一篇

第1节:什么是 JavaScript    第2节:学习环境准备    第3节:调试方案    第4节:JavaScript 变量    第5节:JavaScript 数据类型    第6节:JavaScript if 语句    第7节:for 语句    第8节:JavaScript 算数运算符    第9节:JavaScript 比较运算符    第10节:JavaScript 逻辑运算符    第11节:JavaScript 函数    第12节:JavaScript 表达式    第13节:JavaScript 对象    第14节:JavaScript 字符串    第15节:JavaScript 数字    第16节:JavaScript 数组    第17节:JavaScript switch 语句    第18节:JavaScript while 语句    第19节:JavaScript 的 break 与 continue    第20节:JavaScript with    第21节:document.cookie    第22节:JavaScript Function    第23节:JavaScript Math    第24节:JavaScript Date    第25节:JavaScript RegExp    第26节:JavaScript JSON    第27节:什么是 DOM    第28节:DOM 和 JavaScript 的关系    第29节:获取和操作 DOM 节点    第30节:DOM 与事件    第31节:DOM 事件绑定    第32节:DOM 事件对象    第33节:DOM 事件流    第34节:事件相关的优化    第35节:自定义事件    第36节:表单校验    第37节:什么是 BOM    第38节:常用的 BOM 相关对象    第39节:BOM 常用属性和方法    第40节:AJAX    第41节:异常处理    第42节:三元运算符    第43节:逗号操作符    第44节:void    第45节:typeof    第46节:delete 操作符    第47节:debugger    第48节:getter & setter    第49节:new 运算符与构造函数    第50节:JavaScript 原型    第51节:JavaScript instanceof    第52节:JavaScript this    第53节:严格模式    第54节:作用域    第55节:闭包    第56节:变量提升    第57节:对象包装器    第58节:Lodash    第59节:moment    第60节:swiper    第61节:ECMAScript 6    第62节:Node.js    第63节:Babel    第64节:CSS 预处理器    第65节:代码规范    第66节:TypeScript    第67节:WebComponents    第68节:Vue、React、Angular    第69节:小程序    第70节:JavaScript 关键字    第71节:分号导致的问题    第72节:对象属性访问问题    第73节:this 使用问题    第74节:浮点数精度问题    第75节:独一无二的 NaN    第76节:避免全局污染    第77节:控制台观察对象问题    第78节:根据环境选择语言特性    第79节:相关资源