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 相关文章推荐
Firefox 无法获取cssRules 的解决办法
Oct 11 Javascript
网上抓的一个特效
May 11 Javascript
javascript每日必学之条件分支
Feb 17 Javascript
微信小程序实战之上拉(分页加载)效果(2)
Apr 17 Javascript
浅谈在koa2中实现页面渲染的全局数据
Oct 09 Javascript
10 种最常见的 Javascript 错误(频率最高)
Feb 08 Javascript
javascript显示动态时间的方法汇总
Jul 06 Javascript
微信小程序methods中定义的方法互相调用的实例代码
Aug 07 Javascript
新版小程序登录授权的方法
Dec 12 Javascript
vue-router跳转时打开新页面的两种方法
Jul 29 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 Javascript
JS不要再到处使用绝对等于运算符了
Apr 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
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
Yahoo的PHP面试题
2014/05/26 面试题
EJB3推出JPA的原因
2013/10/16 面试题
专科生就业求职信
2014/06/22 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
开平碉楼导游词
2015/02/06 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
如何写通讯稿
2015/07/22 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
反邪教教育心得体会
2016/01/15 职场文书