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 获取对象 根据属性、内容匹配, 还有表单元素匹配
May 31 Javascript
使用jQuery和PHP实现类似360功能开关效果
Feb 12 Javascript
jQuery进行组件开发完整实例
Dec 15 Javascript
js阻止冒泡和默认事件(默认行为)详解
Oct 20 Javascript
js省市区级联查询(插件版&amp;无插件版)
Mar 21 Javascript
详解vue-router 2.0 常用基础知识点之router-link
May 10 Javascript
浅谈Express异步进化史
Sep 09 Javascript
react 兄弟组件如何调用对方的方法示例
Oct 23 Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
Sep 11 Javascript
npm qs模块使用详解
Feb 07 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
Nov 06 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中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
php排序算法实例分析
2016/10/17 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
一个基于jquery的图片切换效果
2010/07/06 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
JS使用数组实现的队列功能示例
2019/03/04 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
python中shell执行知识点
2020/05/06 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
兰兰过桥教学反思
2014/02/08 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
经典商业广告词
2014/03/13 职场文书
服务标语大全
2014/06/18 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android