全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript 自定义事件之我见

事件

  技术一般水平有限,有什么错的地方,望大家指正。

  事件就是用户和浏览器交互的一种途径。假如一个用户注册的功能,我们在填写完基本信息之后,点击提交按钮就可以实现注册功能,要想完成这个功能所需要的就是点击事件。我们预先定义好操作行为,在用户点击提交按钮时就执行我们预先定好的行为,在本例中我们的代码逻辑一般就是收集用户填写信息,验证信息合法性,利用AJAX与服务器交互。

  这个过程就好像我们平时封装函数然后调用函数一样,事件其实也就类似函数定义函数调用这样的一个过程,只不过事件函数的调用是由用户的一些操作来告知浏览器,让浏览器在去调用函数的。

  首先浏览器已经给我们提供了一列的事件,包括click,keydown等等,为什么还需要自定义事件呢?其实就是对我们的行为进行更准确的描述。以上面的用户注册为例我们可以定义一个名为saveMessage的事件,在点击提交按钮时触发这个事件,好像看起来更加直观一些,不过这看起来和普通的函数调用没什么区别,仔细想了想函数调用和事件触发的区别就是由我们自己执行的函数就是函数调用,不是由我们执行的函数就是事件触发。看下面的代码:

window.onload = function(){
 var demo = document.getElementById("demo");
 demo.onclick = handler;
 function handler(){
  console.log("aaa");
 }
}

在我们点击按钮的时候就会打印aaa,而且很明显的可以看出函数并不是由我们调用的而是由浏览器来执行的,如果我们直接调用函数handler()一样可以打印aaa但这是由我们调用的所以是函数调用。

自定义事件的作用

  自定义事件就是我们按照浏览器对事件的机制来自定义的函数。自定义事件,可以对我们的处理函数带来更好的说明,也可以为我们的插件带来更好的处理流程。假如我们又一个这样的需求:从服务器端拉取一组数据然后在HTML中显示成列表,然后标识出第一条数据,假如我们利用一个现有的处理函数,我们可能会这样来写:

dataTable("url");
$("table").find("input[type='checkbox']:first").prop("checked",true);

 这是不能达到我们目的的因为JS是单线程的而AJAX是异步的,当代码$("table").find("input[type='checkbox']:first").prop("checked",true)执行的时候,我们需要的数据还没有获取到。我们去修改插件的内部实现显然是不明智的,一个可以被人接受的插件必然是有合理的回调函数(或者自定义事件)的,假如现在有一个列表绘制成功的回调函数,我们就可以把这个回调函数看做是一个事件,我们可以对这个事件添加事件操作,定义好处理函数,然后在列表绘制成功时让插件来执行这个处理函数。

自定义事件实现

  我们模拟浏览器原生的事件来实现自定义事件(en:自定义事件名称,fn:事件处理函数,addEvent:为DOM元素添加自定义事件,triggerEvent:触发自定义事件):

window.onload = function(){
 var demo = document.getElementById("demo");
 demo.addEvent("test",function(){console.log("handler1")});
 demo.addEvent("test",function(){console.log("handler2")});
 demo.onclick = function(){
  this.triggerEvent("test");
 }
}
Element.prototype.addEvent = function(en,fn){
 this.pools = this.pools || {};
 if(en in this.pools){
  this.pools[en].push(fn);
 }else{
  this.pools[en] = [];
  this.pools[en].push(fn);
 }
}
Element.prototype.triggerEvent = function(en){
 if(en in this.pools){
  var fns = this.pools[en];
  for(var i=0,il=fns.length;i<il;i++){
   fns[i]();
  }
 }else{
  return;
 }
}

由我们自己执行的函数是函数调用,非我们执行的函数我们可以叫做触发事件,既然函数不是由我们调用的,那么调用者怎样知道调用哪些函数就是一个问题了,所以就需要在添加事件函数和触发事件函数之间加上一些约束了,那就是两者之间有一个都能访问到的事件池,添加事件时把事件及对应的处理函数放在这个池子里,当满足触发条件时就去池子里找到要触发的事件,执行对应的处理函数,所以就有了我们上面的那一段代码。

  对同一个功能(事件)可能有很多个处理函数,所以我们就需要一个集合去存储这些处理函数,这时我们应该反映出两个方案JSON或者数组,JSON的结构是key:value,对于处理函数来说名字是没有什么作用的所以我们用数组来保存处理函数,这组函数是处理什么功能的,所以我们还需要对这组处理函数由一个说明这时候就需要JSON了-->{eventName:[]}。

  以简化的BootStrap模态窗来演示自定义事件的作用:

window.onload = function(){
 var show = document.getElementById("show");
 var hide = document.getElementById("hide");
 var content = document.getElementById("content");
 show.onclick = function(){
  content.modal("show");
 }
 hide.onclick = function(){
  content.modal("hide");
 }
 content.addEvent("show",function(){alert("show before")});
 content.addEvent("shown",function(){
  document.getElementById("input").focus();
  alert("show after");
 }); 
}
;(function(ep){
 ep.addEvent = function(en,fn){
  this.pools = this.pools || {};
  if(en in this.pools){
   this.pools[en].push(fn);
  }else{
   this.pools[en] = [];
   this.pools[en].push(fn);
  }
 }
 ep.triggerEvent = function(en){
  if(en in this.pools){
   var fns = this.pools[en];
   for(var i=0,il=fns.length;i<il;i++){
    fns[i]();
   }
  }else{
   return;
  }
 }
 ep.modal = function(t){
  switch(t){
   case "show":
    this.triggerEvent("show");
    this.style.display = "block";
    setTimeout(function(){this.triggerEvent("shown")}.bind(this),0);//该定时器主要是为了在视觉上先看见content,在弹出消息
    break;
   case "hide":
    this.style.display = "none";
    break;
   default:
    break;
  }
 }

}(Element.prototype));

我们可以预先定义好在弹窗出现之前和出现之后的处理函数,当弹窗触发对应事件的时候就执行对应的处理函数。


# 自定义事件  # Javascript自定义事件详解  # js事件模型与自定义事件实例解析  # 详解JavaScript中的自定义事件编写  # nodejs 中模拟实现 emmiter 自定义事件  # 详解javascript实现自定义事件  # JavaScript中自定义事件用法分析  # Nodejs中自定义事件实例  # JavaScript自定义事件介绍  # js实现屏蔽默认快捷键调用自定义事件示例  # js自定义事件及事件交互原理概述(二)  # js自定义事件及事件交互原理概述(一)  # js自定义事件代码说明  # javascript 自定义事件初探  # 自定义  # 是由  # 我们可以  # 回调  # 时就  # 用户注册  # 就可以  # 有一个  # 这组  # 是一个  # 这是  # 有什么  # 就会  # 还没有  # 放在  # 是有  # 也就  # 有很多  # 都能  # 被人 


相关文章: 宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  微信小程序 五星评分(包括半颗星评分)实例代码  如何选择CMS系统实现快速建站与SEO优化?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  微信小程序 input输入框控件详解及实例(多种示例)  XML的“混合内容”是什么 怎么用DTD或XSD定义  如何确保西部建站助手FTP传输的安全性?  C++时间戳转换成日期时间的步骤和示例代码  婚礼视频制作网站,学习*后期制作的网站有哪些?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  html制作网站的步骤有哪些,iapp如何添加网页?  建站上市公司网站建设方案与SEO优化服务定制指南  IOS倒计时设置UIButton标题title的抖动问题  Python多线程使用规范_线程安全解析【教程】  如何在景安服务器上快速搭建个人网站?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何在云主机快速搭建网站站点?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  成都响应式网站开发,dw怎么把手机适应页面变成网页?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  建站之星如何配置系统实现高效建站?  网站制作服务平台,有什么网站可以发布本地服务信息?  如何用PHP工具快速搭建高效网站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何获取免费开源的自助建站系统源码?  如何快速搭建个人网站并优化SEO?  免费视频制作网站,更新又快又好的免费电影网站?  网站制作公司,橙子建站是合法的吗?  网站制作免费,什么网站能看正片电影?  常州企业建站如何选择最佳模板?  名字制作网站免费,所有小说网站的名字?  宝塔面板创建网站无法访问?如何快速排查修复?  如何快速选择适合个人网站的云服务器配置?  建站主机选择指南:服务器配置与SEO优化实战技巧  外贸公司网站制作,外贸网站建设一般有哪些步骤?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  宁波自助建站系统如何快速打造专业企业网站?  如何快速配置高效服务器建站软件?  如何制作网站标识牌,动态网站如何制作(教程)?  建站主机默认首页配置指南:核心功能与访问路径优化  制作农业网站的软件,比较好的农业网站推荐一下?  如何在万网自助建站中设置域名及备案?  电商网站制作价格怎么算,网上拍卖流程以及规则?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  行程制作网站有哪些,第三方机票电子行程单怎么开?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  网站制作网站,深圳做网站哪家比较好?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何在IIS服务器上快速部署高效网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。