在使用js的过程中,往往会发现关于IE浏览器的兼容问题,当然微软现在自己也打算抛弃IE,推出了edge浏览器,对于前端来说是个好消息.

但IE的用户占比仍然不容小觑,因此这里整理下常见的几个兼容问题附上解决方案,以免不时之需.

1.非行内样式的获取

  IE浏览器:element.currentstyle+attr

  正常浏览器(chrome,FF):getComputedStyle(element,false)+attr

这两类浏览器以下都简称为IE和正常

接下来封装一个函数,方便调用(兼容所有浏览器)

function getStyle(ele,attr){
var a = "";
if(ele.currentStyle){      //IE
a = ele.currentStyle[attr];
}else{
a = getComputedStyle(ele,false)[attr]; //正常
}

2.获取事件对象

     IE  : window.event

  正常 : 给事件传参

obox.onclick=function(eve){
var e=eve||window.event;
console.log(e)
}

3.阻止事件冒泡

 事件冒泡:当触发元素的某个事件时,它会先触发自己的对应事件,然后依次向上触发所有父级的相同事件;上一父级没有相同事件,继续向上触发
需要注意的是onmouseenter和onmouseleave不支持事件冒泡
   IE    : event.cancelBubble=true
  正常 : event.stopPropagation()
function stopBubble(e){
if(e.stopPropagation){
e.stopPropagation();    //正常
}else{
e.cancelBubble = true; //IE
}
}

4.事件委托

事件委托:将多个相同元素的相同事件,添加给页面上现存的共同的父元素,利用事件冒泡,配合事件源,找到真正点击的元素

  IE     : event.srcElement
  正常 : event.target
function tar(t){
var t = e.target || e.srcElement;}

5.添加事件绑定方式

事件绑定方式有两种:赋值式和监听式

(1)赋值式: (DOM 0级事件绑定)
 它比较常用,没兼容问题
  例子:obox.onclick=function(){}
(2)监听式: (DOM 2级事件绑定) 
  IE     : element.attachEvent("on"+type,cb)
  正常 : element.addEventListener(type,cb)
function addEvent(ele,type,cb){
if(ele.addEventListener){
ele.addEventListener(type,cb)   //监听式:正常
}else if(ele.attachEvent){
ele.attachEvent("on"+type,cb) //监听式:IE
}else{
ele["on"+type] = cb;      //赋值式
}
}

6.删除事件绑定方式

同样的,事件绑定方式的删除对应

(1)删除赋值式事件绑定
  例子:obox.onclick=null
(2)删除监听式事件绑定:
  IE     : element.detachEvent("on"+type,cb)
  正常 : element.removeEventListener(type,cb)
function removeEvent(ele,type,cb){
if(ele.removeEventListener){
ele.removeEventListener(type,cb)  //监听式:正常的删除
}else if(ele.detachEvent){
ele.detachEvent("on"+type,cb)   //监听式:IE的删除
}else{
ele["on"+type] = null;       //赋值式的删除
}
}

7.键盘事件的键值获取

IE     : event.which

正常 : event.keycode

function code(eve){
var e=eve||window.event; //先获取事件
var code=e.keyCode||e.which; //再获取键值
}

8.阻止默认事件

 IE     : event.returnValue = false
 正常 : event.preventDefault()
 function stopDefault(e){
if(e.preventDefault){
e.preventDefault() //正常
}else{
e.returnValue = false; //IE
}
}

9.鼠标的页面位置pageX,pageY

 function getPage(e) {
var pageX = e.pageX || e.clientX + getScroll().scrollLeft;
var pageY = e.pageY || e.clientY + getScroll().scrollTop;
return {
pageX: pageX,
pageY: pageY
}
}

10.滚轮移动距离scrollTop

function getScroll() {
if (document.documentElement.scrollTop) {
return document.documentElement.scrollTop;
} else if (document.body.scrollTop) {
return document.body.scrollTop;
}

11.严格模式的开启

;(function(){"use strict"})();

碰到新的兼容问题会继续更新,欢迎讨论

js中的兼容问题汇总的更多相关文章

  1. js中的DOM操作汇总

    一.DOM创建 DOM节点(Node)通常对应于一个标签,一个文本,或者一个HTML属性.DOM节点有一个nodeType属性用来表示当前元素的类型,它是一个整数: Element,元素 Attrib ...

  2. JS中的兼容问题总结

    今天总结总结在JS里面遇到的兼容性问题 1.获取滚动距离的兼容性问题: document.documentElement.scrollTop  ||  document.body.scrollTop ...

  3. JS中浏览器兼容问题

    body的子节点IE 火狐 显示3个  其他显示7个 float浮动中的兼容 link 操作外联的兼容

  4. js中浏览器兼容startsWith 、endsWith 函数

    在做js开发的时候用到了startsWith函数时,发现各个浏览器不兼容问题,因为对开发来说,chrome浏览器最好用,就一直在chrome浏览器中使用这两个函数没有任何问题,但在ie浏览器访问就直接 ...

  5. js中typeof的用法汇总[转载]

    http://www.jb51.net/article/43187.htm JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法, ...

  6. 记录js中的兼容问题及解决办法

    1.获取非行内样式的兼容问题: 2.获取事件对象的兼容问题: 3.事件冒泡的兼容: 4.keyCode的兼容问题: 5.处理默认事件的兼容问题: 6.事件的绑定兼容问题:

  7. js中typeof的用法汇总

  8. js中getBoundingClientRect的作用及兼容方案

    js中getBoundingClientRect的作用及兼容方案 1.getBoundingClientRect的作用 getBoundingClientRect用于获取某个html元素相对于视窗的位 ...

  9. 分享一个自定义的 console 类,让你不再纠结JS中的调试代码的兼容

    问题的产生 在写JS的过程中,为了调试我们常常会写很多 console.log.console.info.console.group.console.warn.console.error代码来查看JS ...

随机推荐

  1. go单元测试

    testing模块 测试代码放在当前包以_test.go结尾的文件中 测试函数以Test为名称前缀 测试命令(go test) 正常编译操作(go build/install)会忽略测试文件 单例模式 ...

  2. 七天学会NodeJS——第一天

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:http://nqdeng.github.io/7-days-nodejs Node.js 是一个能 ...

  3. 有趣的RPC理解

    RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通 ...

  4. JVM总结(二)

    JVM总结(2)java内存区域.字节码执行引擎 1.内存区域 程序计数器:知道线程执行位置,保证线程切换后能恢复到正确的执行位置. 虚拟机栈:存栈帧.栈帧里存局部变量表.操作栈.动态连接.方法返回地 ...

  5. Window.open使用总结

    前言 今天在项目中,突然看到window.open的使用,感觉还是很神奇,突然心血来潮查看了window.open的用法. 用途 主要用于在打开网站时弹出的其他窗口.用于通知广告一类的. 用法 win ...

  6. Oracle delete和truncate实践操作之一

    实践说明 本文章主要记录在Oracle中,delete和truncate进行数据删除之后,如何进行数据恢复.由于网上对delete和truncate的区别说明较多,此处不过多介绍两者区别. 注:由于环 ...

  7. 弃用 wget, 拥抱多线程下载 axel

    0x00 事件 对于在 Linux 的下载工具而言,比较常用的就是 wget 或者 curl,吾也一直用 wget 的方式进行网络上的资源下载.偶然发现了 axel 这个支持多线程的下载工具,试用了几 ...

  8. 记一次mysql数据库失而复得过程

    背景: 由于是自己买的vps搭建的博客,用的是军哥的一键lnmp源码编译安装的,文章也就几篇,对备份并不太重视,想着等服务器快到期的时候备份一下不就行了. 后来在该服务器上测试lnmp分别编译编译安装 ...

  9. 用小程序·云开发两天搭建mini论坛丨实战

    笔者最近涉猎了小程序相关的知识,于是利用周末时间开发了一款类似于同事的小程序,深度体验了小程序云开发模式提供的云函数.数据库.存储三大能力.关于云开发,可参考文档:小程序·云开发. 个人感觉云开发带来 ...

  10. Mybatis批处理(批量查询,更新,插入)

    mybatis批量查询 注意这里的 in 和   <trim prefix="(" suffix=")"> 以及 in ( )的三种方式的(例1(推 ...