1、IE 与常规浏览器兼容总结

1.1、变量声明

1.1.1、let

let声明关键字在IE 11及以下无法使用,使用时会报错 SCRIPT11011: 缺少 ';',在IE12 可以正确获取值,建议在IE11时使用关键字var

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color">#ccc</div></div><script>let box = document.getElementById('box');  // ==> IE11 以下报错: SCRIPT11011: 缺少 ';',IE 12 以上正确获取</script></body>复制代码

1.1.2、const

const声明关键字在IE 11及以下无法使用,使用时会报错 SCRIPT11011: 缺少 ';',在IE12 可以正确获取值,建议在IE11时使用关键字var

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color">#ccc</div></div><script>let box = document.getElementById('box');  // ==> IE11 以下报错: SCRIPT1109: 语法错误,IE 12 以上正确获取</script></body>复制代码

1.2、元素获取

1.2.1、document.querySelector

IE 8 以下不支持,IE 9 以上支持

   //==> IE8   <div class="box"></div><script>// IE 8 以下不支持  报错==>对象不支持“querySelector”属性或方法   var box = document.querySelector('.box');       console.log(box);</script>

	//==> IE9 [object Object] 返回查找元素对象信息复制代码

1.2.2、document.querySelectorAll

IE 8 以下不支持,IE 9 以上支持

<body> <div class="box"></div><script>// IE 8 以下不支持  报错==>SCRIPT11109: 对象不支持“querySelectorAll”属性或方法// IE 9 [object Object]   var box = document.querySelectorAll('.box');       console.log(box);</script></body>复制代码

1.2.3、document.getElementsByClassName

IE 9 以下不支持,IE 10 以上支持

<body><div class="box"></div><script>// IE 9 以下不支持  报错==>SCRIPT11109: 对象不支持“getElementsByClassName”属性或方法// IE 10 HtmlCollection   var box = document.getElementsByClassName('box');       console.log(box);</script></body>复制代码

1.3、节点获取

1.3.1、element.firstElementChild

element.firstElementChild在IE 9 以下会返回 undefined,IE 10 以上可以正确获取,常规浏览器支持。

IE 9 以下替换方案:element.firstChild

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color">#ccc</div></div><script>   var box = document.getElementById('box');       console.log(box.firstChild); // IE 9 以下不支持  输出==> undefined   console.log(box.firstElementChild);// IE 10 HtmlCollection</script></body>复制代码

兼容写法:

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color">#ccc</div></div><script>var box = document.getElementById('box');var res = box.firstElementChild ? box.firstElementChild : box.firstChildconsole.log(res); //==> [object Object] 元素对象</script></body>复制代码

1.3.2、element.lastElementChild

element.lastElementChild在IE 9 以下会返回 undefined,IE 10 以上可以正确获取,常规浏览器支持。

IE 9 以下替换方案:element.lastChild

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color">#ccc</div></div><script>   var box = document.getElementById 
       console.log(box.lastElementChild);// IE 9 以下不支持  输出==> undefinedd('box');   console.log(box.lastChild);// IE 10 HtmlCollection</script></body>复制代码

兼容写法:

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color">#ccc</div></div><script>var box = document.getElementById('box');var res = box.lastElementChild ? box.lastElementChild : box.lastChildconsole.log(res); //==> [object Object] 元素对象</script></body>复制代码

1.3.3、element.priviousElementSibling

element.priviousElementSibling在IE 9 以下会返回 undefined,IE 10 以上可以正确获取,常规浏览器支持。

IE 9 以下替换方案:element.priviousElement

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color" id="color">#ccc</div><button>确定</button></div><script>var box = document.getElementById('color'); console.log(box.previousElementSibling); //==> undefinedconsole.log(box.previousSibling); //==> [object Object]</script></body>复制代码

兼容写法:

var element = box.previousElementSibling || box.previousSibling复制代码

1.3.4、element.nextElementSibling

element.nextElementSibling在IE 9 以下会返回 undefined,IE 10 以上可以正确获取,常规浏览器支持。

IE 9 以下替换方案:element.nextSibling

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color" id="color">#ccc</div><button>确定</button></div><script>var box = document.getElementById('color'); console.log(box.nextElementSibling); //==> undefinedconsole.log(box.nextSibling); //==> [object Object]</script></body>复制代码

兼容写法:

var element = box.nextElementSibling || box.nextSibling复制代码

1.3.5、return的方式返回

function nextElementSibling(element){   return element.nextElementSibling ||element.nextSibling
}复制代码

1.4、样式获取

1.4.1、window.getComputedStyle

常规浏览器: window.getComputedStyle(当前要操作的元素对象, 当前元素的伪类) , 一般我们不用伪类,时写null

注意: window.getComputedStyle(当前要操作的元素对象, 当前元素的伪类) 会返回一个 CSSStyleDeclaration 集合(伪数组),可以用对象的形式 style.width获取,也可以通过下标值进行获取

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-9"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 1000px;height: 1000px;border-radius: 50%;background: #ccc;
        }</style></head><body><div class="box"></div><script>let box = document.querySelector('.box')let style = window.getComputedStyle(box,null)console.log(style);  //==> CSSStyleDeclaration</script></body></html>复制代码

IE 浏览器: element.currentStyle

element.currentStyle 会返回一个对象,只能通过element.currentStyle.width的方式或者遍历对象获取属性信息

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-9"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 1000px;height: 1000px;border-radius: 50%;background: #ccc;
        }</style></head><body><div class="box"></div><script>let box = document.querySelector('.box')let style = box.currentStyleconsole.log(style); //==> [object MSCurrentStyleCSSPropertiesPrototype]</script></body></html>复制代码

兼容写法:

/**
 * 
 * @param {*} element 获取类样式的元素
 * @param {String} attr 获取的类样式[可传可不传,不传则返回当前元素所有的类样式]
 */function getStyle(element, attr) {if (attr) {return window.getComputedStyle ? window.getComputedStyle(element)[attr] : element.currentStyle[attr]
    }else {return window.getComputedStyle ? window.getComputedStyle(element) : element.currentStyle
    }
}复制代码

1.5、事件

1.5.1、二级事件绑定和解绑

1.5.1.1、事件绑定

在常用浏览器中,可以使用addEventListener,但是在IE 9 以下不支持,需要使用attachEvent进行二级事件绑定。

兼容写法为:

/**
 * 
 * @param {*} element 需要绑定事件的元素
 * @param {*} type 事件类型
 * @param {*} callbak 绑定的回调函数
 */function getAddEventListener(element, type, callbak) {return element.getAddEventListener ? element.getAddEventListener(type,callbak):element.attachEvent('on'+type,callbak)
}复制代码

1.5.1.2、事件解绑

常用浏览器可以使用removeEventListener解绑事件,但是在IE9以下需要使用detachEvent进行事件解绑,callbackname为绑定的事件名

兼容写法:

/**
 * 
 * @param {*} element 需要进行事件解绑的元素
 * @param {*} callbakname 进行解绑的事件名
 */function getRemoveEventListener(element, callbakname) {return element.removeEventListener ? element.removeEventListener(callbakname):element.detachEvent(callbakname)
}复制代码

1.5.2、事件对象 e

在常用浏览器中,事件对象e为事件处理函数中可以使用形参e来获取(默认在事件处理函数第一位形参),在IE中为 window.event

兼容写法:

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color" id="color">#ccc</div><button>确定</button></div><script>document.querySelector('button').addEventListener('click',function(e){let event = e || window.event  //==> 可以使用此种方式获取事件对象})</script></body>复制代码

1.5.3、target

在事件对象中,获取target方式为:target  => e.target  || e.srcElement

<body><div class="box" id="box" name="121"><span>第一个子元素</span><div class="color" id="color">#ccc</div><button>确定</button></div><script>document.querySelector('button').addEventListener('click',function(e){let event = e || window.event// 获取targetlet target = e.target || e.srcElement
        })</script></body>复制代码

1.5.4、冒泡

由于事件会冒泡,根据不同的需求需要阻止事件冒泡。 常规浏览器:事件对象e中,有一个阻止事件冒泡的方法 e.stopProprogation() ,方法中不需要传参。 在IE 9以下:需要使用事件对象中的属性,e.cancelBubble = true

兼容写法:

document.querySelector('button').addEventListener('click',function(e){
  	e.stopProprogation ? e.stopProprogation() : e.cancleBubble = true         })复制代码

1.5.5、键盘事件中的keyCode

1.5.5.1  keyDown

获取键盘事件keyDown中的点击按键信息,在常规浏览器和IE浏览器具有差异 常规浏览器:e.which IE浏览器:e.keyCode

document.addEventListener('keydown',function(e){  	let event = e || window.event//==> 获取键盘按下的信息let key = event.which || event.keyCode
})复制代码

1.5.6、鼠标事件中的button与buttons

在鼠标事件对象e中,常规浏览器和IE 9 在button上有不同,但是可以兼容,所以不必要写兼容 常规浏览器中:e.button IE浏览器中:e.buttons

1.5.7、阻止标签自带的默认事件

阻止标签自带的默认事件,例如 a标签的跳转事件,form的提交等 在常规浏览器中: e.preventDefault()在IE中使用: e.returnValue = false;