javascript的事件触发器介绍的实现


Posted in Javascript onJune 05, 2014

事件触发器从字面意思上可以很好的理解,就是用来触发事件的,但是有些没有用过的朋友可能就会迷惑了,事件不是通常都由用户在页面上的实际操作来触发的吗?这个观点不完全正确,因为有些事件必须由程序来实现,如自定义事件,jQuery的ajax框架的一些自定义事件就必须由事件触发器来实现。当然,在一些特殊情况下,用事件触发器来触发事件比用户的实际操作来触发事件更方便。

对于实现事件触发器,浏览器都有原生的方法来支持,但是在兼容性上又有很大的出入,这种兼容性的问题完全在意料之中,IE有自己的方法,其他标准浏览器也有一套方法,不说谁的方法好与不好,对于WEB开发者来说搞出几套方法就是对开发人员的一种折磨。IE支持fireEvent方法来实现事件触发,标准浏览器支持dispatchEvent来实现事件触发,两面派的IE9是两者都支持。下面是出自prototype.js的源码(其实我是从司徒正美的博客复制过来的):

var fireEvent = function(element,event){
 if (document.createEventObject){
  // IE浏览器支持fireEvent方法
  var evt = document.createEventObject();
  return element.fireEvent('on'+event,evt)
 }
 else{
  // 其他标准浏览器使用dispatchEvent方法
  var evt = document.createEvent( 'HTMLEvents' );
  // initEvent接受3个参数:
  // 事件类型,是否冒泡,是否阻止浏览器的默认行为
  evt.initEvent(event, true, true);  
  return !element.dispatchEvent(evt);
 }
};

上面的方法可以兼容主流的浏览器以实现事件触发器的功能。但是对于一些封装好的事件处理系统,如jQuery的event模块,就没这么简单了,只能通过模拟来实现了。我在之前写过一个很简单的事件处理系统,最近又碰到自定义事件的需求,于是在之前的事件系统的基础上模拟了一个事件触发器,代码如下:

/**
 * 事件触发器
 * @param { Object } DOM元素
 * @param { String / Object } 事件类型 / event对象
 * @param { Array }  传递给事件处理函数的附加参数
 * @param { Boolean } 是否冒泡
 */
trigger : function( elem, event, data, isStopPropagation ){
 var type = event.type || event,
  // 冒泡的父元素,一直到document、window
  parent = elem.parentNode || 
   elem.ownerDocument || 
   elem === elem.ownerDocument && win,
  eventHandler = $.data( elem, type + 'Handler' ); isStopPropagation = typeof data === 'boolean' ? 
  data : (isStopPropagation || false);
 data = data && isArray( data ) ? data : [];
 // 创建自定义的event对象  
 event = typeof event === 'object' ? 
  event : {
   type : type,
   preventDefault : noop,
   stopPropagation : function(){
    isStopPropagation = true;
   }
  };
 event.target = elem;  
 data.unshift( event );
 if( eventHandler ){
  eventHandler.call( elem, data );
 }
 // 递归调用自身来模拟冒泡
 if( parent && !isStopPropagation ){
  data.shift();
  this.trigger( parent, event, data );
 }
}

模拟的原理并不难,给某元素绑定一个事件处理函数,如果有触发事件的实际操作就会执行相应的事件处理函数,所以要达到事件触发器的功能只要获取到相应的事件处理函数然后执行就差不多了,这是最基本的。

在实际的事件发生时浏览器会生成一个event对象,里面包含了一些事件发生时的属性和信息。如果没有实际的事件发生是没有这个event对象的,所以上面的代码也创建了一个event对象满足最基本的功能。

还有事件冒泡,如果没有实际的事件发生,自然也不会有冒泡的行为,那么如果要模拟冒泡的功能,就必须不断的查找父元素并检查是否绑定了相同类型的事件,直至到document和window为止,如果结构复杂,这种递归调用的方法性能估计会不怎么样。

最后是浏览器的默认行为,我觉得这个要去模拟相当麻烦,麻烦到不知如何去实现,比如a标签默认的跳转,我测试了jQuery的trigger,也没有实现,但是一些其他的行为貌似又在API手册中有介绍。毕竟这个功能不是很重要,暂时也没做过多的深究。

 

 

Javascript 相关文章推荐
实例:用 JavaScript 来操作字符串(一些字符串函数)
Feb 15 Javascript
JavaScript flash复制库类 Zero Clipboard
Jan 17 Javascript
用jQuery模拟select下拉框的简单示例代码
Jan 26 Javascript
使用jquery.qrcode生成彩色二维码实例
Aug 08 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
JavaScript操作select元素和option的实例代码
Jan 29 Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
Mar 01 Javascript
vue系列之requireJs中引入vue-router的方法
Jul 18 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
Vue实现简单的留言板
Oct 23 Javascript
javascript中attribute和property的区别详解
Jun 05 #Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
Jun 05 #Javascript
用js的document.write输出的广告无阻塞加载的方法
Jun 05 #Javascript
javascript数组去重方法终极总结
Jun 05 #Javascript
javascript设计模式之解释器模式详解
Jun 05 #Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 #Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 #Javascript
You might like
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
php入门小知识
2008/03/24 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
yii操作session实例简介
2014/07/31 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
Python作用域用法实例详解
2016/03/15 Python
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
用python解压分析jar包实例
2020/01/16 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
通知函的格式
2015/04/27 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript