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函数式编程
Oct 11 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
Jan 04 Javascript
初识简单却不失优雅的Vue.js
Sep 12 Javascript
jquery实现楼层滚动效果
Jan 01 jQuery
关于vue中watch检测到不到对象属性的变化的解决方法
Feb 08 Javascript
JS 验证码功能的三种实现方式
Nov 26 Javascript
JavaScript this绑定过程深入详解
Dec 07 Javascript
JavaScript代码调试方法实例小结
Jan 05 Javascript
详解VUE调用本地json的使用方法
May 15 Javascript
解决vue-router路由拦截造成死循环问题
Aug 05 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
Sep 21 Javascript
如何利用JavaScript实现二叉搜索树
Apr 02 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
zf框架db类的分页示例分享
2014/03/14 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
Python访问MySQL封装的常用类实例
2014/11/11 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
python实现自动发送邮件
2018/06/20 Python
python3实现随机数
2018/06/25 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
大二自我鉴定
2014/01/31 职场文书
委托书范本
2014/09/13 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
暂停营业通知
2015/04/25 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
草房子读书笔记
2015/06/29 职场文书
校园安全学习心得体会
2016/01/18 职场文书
Python3接口性能测试实例代码
2021/06/20 Python
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis