IE8事件模型和DOM事件模型有何不同?如何处理DOM事件模型与IE8事件模型的兼容性?

1 事件模型不一样

    DOM的浏览器兼容性问题:事件模型   3个阶段            01 外向内:捕获           02 目标触发            03内向外:冒泡

    IE8: 2个阶段:   没有捕获阶段 ,只有两个阶段  。   目标触发  和 冒泡阶段

2事件绑定不一样  

      DOM: elem.addEventListener(“click”,function(){},false)      第三个参数capture: 是否在捕获阶段就提前触发

      IE8:    elem.attachEvent(“onclick”,function(){})    事件名一定要 用on开头

3移除事件   

    DOM: elem.removeEventListener(“click”,function(){},false)

     IE: elem.detachEvent(“onclick”,function(){})

4获取事件对象event的方法

    DOM: elem.addEventListener(“click”,function(e){ e->event })

      IE8: 不会自动传入事件对象e

     事件对象event始终保存在一个全局变量window.event中

     elem.attachEvent(“onclick”,function(){

        var e=window.event

       })

兼容所有浏览器的做法:      e=e||window.event;

5获取目标元素

    DOM: e.target

    IE8: e.srcElement

兼容所有浏览器的写法:   var target=e.target||e.srcElement;

6阻止冒泡: 

    DOM:   e.stopPropagation()

    IE8:       e.cancelBubble=true;     ---- kan sao babao

兼容所有浏览器的写法:

    if(e.cancelBubble!==undefined){ //IE8

      e.cancelBubble=true;

    }else{ //DOM

      e.stopPropagation()

      }

7阻止默认行为

    DOM: e.preventDefault();

    IE8 :   return false;  或者  e.returnValue = false;

    if(typeof e.preventDefault!=='function'){
         e.returnValue = false;
    }else{
      e.preventDefault()
    }
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<button id="btn">点击</button>
<script>
// 定义一个函数,可以支持所有浏览器中的处理函数绑定:
function bindEvent(elem, eventName, handler){
if(elem.addEventListener){//DOM
elem.addEventListener(eventName,handler)
alert('dom')
}else{//IE8
elem.attachEvent('on'+eventName,function(){
//this->elem
alert('ie')
var e=window.event;
e.target=e.srcElement;
handler.call(this,e)
})
}
}
bindEvent(btn, 'click', function(e){
this //当前事件冒泡到的父元素
var target=e.target; //目标元素
}) </script>
</body>
</html>

最新文章

  1. QT,静态变量要记得初始化
  2. Windows Live Writer 的昨日荣光
  3. shell中创建mysql库和执行sql脚本
  4. NSFileManager
  5. 转--Invalidate和postInvalidate的更新view区别
  6. spring @resource @ Autowired
  7. jq中的移除事件
  8. matlab最简单程序模板
  9. Lucene初体验——Hello Word实现
  10. iptables 从一台机到另一台机端口转发
  11. var foo = function bar() {}
  12. mybatis-plus调用自身的 selectById 方法报错:org.apache.ibatis.binding.BindingException:
  13. Oracle EBS AP 取消付款
  14. Android事件分发机制浅析(2)
  15. Linux下不能挂载NTFS格式硬盘/U盘
  16. Saiku2.6 保存查询后,重新打开报 Error Loading Query错误。
  17. SpringMVC WEB应用上传照片的实现
  18. 转载:resNet论文笔记
  19. 主攻ASP.NET.4.5.1 MVC5.0之重生:系统角色与权限(二)
  20. ASP.NET CORE RAZOR :将搜索添加到 Razor 页面应用

热门文章

  1. 如何判断当前LINUX系统启用了ASLR
  2. 理解Promise (4)
  3. windows cmd bat处理文件
  4. C++ begin()和end()
  5. 【leetcode】1039. Minimum Score Triangulation of Polygon
  6. 各种IO之间的区别
  7. Java中的栈和队列
  8. AutoLayout面试题记录-自动布局
  9. mybatisplus中使用SqlRunner出错
  10. 台哥原创:java五子棋源码(人机对弈)