js学习总结之DOM2兼容处理顺序问题的解决方法


Posted in Javascript onJuly 27, 2017

DOM2兼容处理顺序问题的解决方法,具体如下

解决顺序问题:我们不用浏览器自带的事件池了,而是自己模拟标准浏览器的事件池实现,具体代码如下:

/*
 bind:处理DOM2级事件绑定的兼容性问题(绑定方法)
 @parameter:
  curEle->要绑定事件的元素
  evenType->要绑定的事件类型("click","mouseover")
  evenFn->要绑定的方法
*/
function bind(curEle,evenType,evenFn){
 if('addEventListener' in document){
  curEle.addEventListener(evenType,evenFn,false);
  return;
 }
 //给evenFn化妆 并且把化妆前的照片贴在自己对应的脑门上
 var tempFn = function(){
  evenFn.call(curEle)
 }
 tempFn.photo = evenFn;
 //首先判断自定义属性之前是否存在,不存在的话创建一个,由于要存储多个化妆后的结果,所以我们让其值是一个数组
 if(!curEle["mybind"+evenType]){//根据不同的事件类型是不同的数组
  curEle["mybind"+evenType] = [];
 }
 //解决重复问题:每一次自己在往自定义属性对应的容器中添加前,看一下是否已经存在,存在的话就不用重新的添加了,同理也不需要往事件池里面存储了
 var ary = curEle["mybind"+evenType];
 for(var i = 0;i<ary.length;i++){
  var cur = ary[i];
  if(cur.photo === evenFn){
   return;
  }
 }
 ary.push(tempFn);
 curEle.attachEvent("on"+evenType,tempFn);
 //这里的开始想法是改变this的指向,把this不指向window
 /*
  box.attachEvent("onclick",function(){
   fn1.call(box)
  })
  这样虽然解决了this的问题,但是又抛出了一个新的问题,不知道该如何删除了(我们不知道匿名函数是谁)
  var tempFn = function(){
   fn1.call(box)
  }
  box.attachEvent("onclick",tempFn);
  box.detachEvent("onclick",tempFn);
 */
}

function unbind(curEle,evenType,evenFn){
 if('removeEventListener' in document){
  curEle.removeEventListener(evenType,evenFn,false);
  return;
 }
 //拿evenFn到curEle["myBind"]这里找化妆后的结果,找到之后再事件池中把化妆后的结果移除事件池
 var ary = curEle['myBind'+evenType];
 for(var i = 0;i<ary.length;i++){
  if(ary[i].photo===evenFn){
   ary.splice(i,1)//找到后 把自己存储的容器中对应的移除掉
   curEle.detachEvent("on"+evenType,ary[i]);//在把事件池中对应的也移除掉
   break;
  }
 }
 
}
//创建事件池,并且把需要给当前元素绑定的方法依次的增加到事件池中
function on(curEle,evenType,evenFn){
 if(!curEle["myEvent"+evenType]){
  curEle["myEvent"+evenType] = [];
 }
 var ary = curEle["myEvent"+evenType];
 for(var i = 0;i<ary.length;i++){
  var cur = ary[i];
  if(cur===evenFn){
   return;
  }
 }
 ary.push(evenFn);
 //执行on的时候,我们给当前元素绑定了一个点击的行为,当点击的时候执行run方法:run方法中的this是当前元素curEle,并且浏览器给run传递一个MouseEvent事件对象
 // curEle.addEventListener(evenType,run,false);
 bind(curEle,evenType,run)

}
//在自己的事件池中把某一个方法移除
function off(curEle,evenType,evenFn){
 var ary = curEle["myEvent"+evenType];
 for(var i = 0;i<ary.length;i++){
  var cur = ary[i];
  if(cur===evenFn){
   ary.splice(i,1);
   break;

  }
 }
}
//我们只给当前元素的点击行为绑定一个方法run,当触发点击的时候执行的是run方法,我在run方法中根据自己存储的方法顺序分别的在把这些方法执行

function run(e){
 // this 当前点击的对象curEle
 e = e || window.event;
 var flag = e.target?true:false;
 if(!flag){
  e.target = e.srcElement;

 }
 //获取自己事件池中绑定的那些方法,并且让这些方法依次的执行就可以了
 var ary = this["myEvent"+e.type];//e.target也代表curEle
 for(var i = 0;i<ary.length;i++){
  var tempFn = ary[i];
  tempFn.call(this,e);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery自带的一些常用方法总结
Sep 03 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
Oct 21 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
javascript实用方法总结
Feb 06 Javascript
JS实现很酷的水波文字特效实例
Feb 26 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
May 14 Javascript
高效利用Angular中内置服务$http、$location等
Mar 22 Javascript
微信小程序实现滚动消息通知
Feb 02 Javascript
JavaScript中常见内置函数用法示例
May 14 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
Jul 09 Javascript
JavaScript JSON使用原理及注意事项
Jul 30 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 #Javascript
vue中计算属性(computed)、methods和watched之间的区别
Jul 27 #Javascript
angular2+node.js express打包部署的实战
Jul 27 #Javascript
利用Ionic2 + angular4实现一个地区选择组件
Jul 27 #Javascript
vue单页应用中如何使用jquery的方法示例
Jul 27 #jQuery
详解win7 cmd执行vue不是内部命令的解决方法
Jul 27 #Javascript
Vue2.0如何发布项目实战
Jul 27 #Javascript
You might like
Parse正式发布开源PHP SDK
2014/08/11 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
两款万能的php分页类
2015/11/12 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
python开启多个子进程并行运行的方法
2015/04/18 Python
python中sleep函数用法实例分析
2015/04/29 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
C语言笔试题回忆
2015/04/02 面试题
高一生物教学反思
2014/01/17 职场文书
2014年公司庆元旦活动方案
2014/03/05 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
党员承诺践诺书
2014/05/20 职场文书
班风口号
2014/06/18 职场文书
2014年女职工工作总结
2014/11/27 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS
Python创建SQL数据库流程逐步讲解
2022/09/23 Python