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 相关文章推荐
JavaScript DOM学习第六章 表单实例
Feb 19 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
Apr 26 Javascript
jQuery动态添加、删除元素的方法
Jan 09 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
Web Uploader文件上传插件使用详解
May 10 Javascript
javascript 中的console.log和弹出窗口alert
Aug 30 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
微信小程序 开发MAP(地图)实例详解
Jun 27 Javascript
Vue 按键修饰符处理事件的方法
May 04 Javascript
微信小程序访问豆瓣电影api的实现方法
Mar 31 Javascript
Vue编程式跳转的实例代码详解
Jul 10 Javascript
分享8个JavaScript库可更好地处理本地存储
Oct 12 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
强烈推荐:php.ini中文版(1)
2006/10/09 PHP
几个php应用技巧
2008/03/27 PHP
追求程序速度,而不是编程的速度
2008/04/23 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
几种tab切换详解
2017/02/03 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python之pymysql的使用小结
2019/07/01 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
写自荐信的七个技巧
2013/10/15 职场文书
副厂长岗位职责
2014/02/02 职场文书
工程专业应届生求职信
2014/02/19 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技