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 相关文章推荐
xtree.js 代码
Mar 13 Javascript
javascript flash下fromCharCode和charCodeAt方法使用说明
Jan 12 Javascript
js鼠标点击图片实现随机变换图片的方法
Feb 16 Javascript
JavaScript中利用各种循环进行遍历的方式总结
Nov 10 Javascript
Vue异步加载about组件
Oct 31 Javascript
vue.js的computed,filter,get,set的用法及区别详解
Mar 08 Javascript
关于AOP在JS中的实现与应用详解
May 06 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
May 14 Javascript
vue以组件或者插件的形式实现throttle或者debounce
May 22 Javascript
Jquery动态列功能完整实例
Aug 30 jQuery
微信小程序图片自适应实现解析
Jan 21 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
Feb 28 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
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
JavaScript实现答题评分功能页面
2020/06/24 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
python读取oracle函数返回值
2016/07/18 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
Python callable内置函数原理解析
2020/03/05 Python
美国眼镜网:GlassesUSA
2017/09/07 全球购物
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
医学院护理专业应届生求职信
2013/11/12 职场文书
企业项目策划书
2014/01/11 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
法学院毕业生求职信
2014/06/25 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
项目投资意向书范本
2015/05/09 职场文书
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS