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 相关文章推荐
Extjs入门之动态加载树代码
Apr 09 Javascript
Jquery公告滚动+AJAX后台得到数据
Apr 14 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
FireBug 调试JS入门教程 如何调试JS
Dec 23 Javascript
一个js过滤空格的小函数
Oct 10 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
May 20 Javascript
bootstrap配合Masonry插件实现瀑布式布局
Jan 18 Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 Javascript
jquery动态添加带有样式的HTML标签元素方法
Feb 24 jQuery
小程序实现五星点评效果
Nov 03 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 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中的按位与和按位或操作示例
2014/01/27 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
javascript this用法小结
2008/12/19 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
实例讲解python中的协程
2018/10/08 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
NumPy中的维度Axis详解
2019/11/26 Python
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
暑期实践思想汇报
2014/01/06 职场文书
实习生的自我评价
2014/01/08 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
2014年材料员工作总结
2014/11/19 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python
配置nginx负载均衡
2022/05/06 Servers
MySQL普通表如何转换成分区表
2022/05/30 MySQL
html中两种获取标签内的值的方法
2022/06/16 jQuery
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL