js-API 03 DOM兼容性问题集中处理

一,兼容性
1,冒泡
如何阻止冒泡(存在兼容性)
e.stopPropagation(); 谷歌和火狐支持,IE不支持
window.event.cancelBubble=true; IE特有的,谷歌支持,火狐不支持
兼容性代码(封装进javascript函数中使用)
event = event || window.event;
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = true;
}

2,节点
获取子节点 ,children与childNodes
返回节点的子节点集合
children: 获取子元素节点,无兼容问题
childNodes:
IE:获取子元素节点
非IE(chrome,Firefox等):获取子节点,包括元素节点和文本节点
获取第一个儿子元素节点,firstChild与firstElementChild
firstChild:
IE6,7,8:获取第一个子元素节点
非IE6,7,8:获取第一个子节点,元素节点/文本节点
firstElementChild:
IE6,7,8:不支持
非IE6,7,8: 获取第一个子元素节点
获取最后一个子元素节点,lastChild与lastElementChild
lastChild:
IE6,7,8:获取最后一个子元素节点
非IE6,7,8:获取最后一个子节点,元素节点/文本节点
lastElementChild:
IE6,7,8:不支持
非IE6,7,8:获取最后一个元素节点
获取后一个兄弟元素节点,nextSibling与nextElementChild
nextSibling:
IE6,7,8:获取后一个兄弟元素节点
非IE6,7,8:获取后一个兄弟节点,元素节点/文本节点
nextElementChild:
IE6,7,8:不支持
非IE6,7,8:获取后一个兄弟元素
获取前一个兄弟元素节点previousSibling与previousElementChild
previousSibling:
IE6,7,8:获取前一个兄弟元素节点
非IE6,7,8:获取前一个兄弟节点,元素节点/文本节点
previousElementChild:
IE6,7,8:不支持
非IE6,7,8:获取前一个元素节点
3,绑定
绑定事件的新方式
addEventListener和attachEvent方法
var son = document.querySelector(".son");
son.addEventListener('click', once1);
function once1() {
alert(1)
}
son.addEventListener('click', once2);
function once2() {
alert(2)
} 

对象.addEventListener("事件类型",事件处理函数,false);--谷歌和火狐支持,IE8不支持
 参数1:事件的类型---事件的名字,没有on
参数2:事件处理函数---函数(命名函数,匿名函数)
参数3:布尔类型,目前就写false(后面会说,现在你不理解)
区别 this不同,addEventListener 中的this是当前绑定事件的对象 
对象.attachEvent("有on的事件类型",事件处理函数)--谷歌不支持,火狐不支持,IE8支持
数1:事件的类型---事件的名字,有on
参数2:事件处理函数---函数(命名函数,匿名函数)
参数3:布尔类型,目前就写false(后面会说,现在你不理解)
attachEvent中的this是window
兼容性代码
function addEventListener(element,type,fn) {
//判断浏览器是否支持这个方法
if(element.addEventListener){
element.addEventListener(type,fn,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,fn);
}else{
element["on"+type]=fn;
}
}
 
addEventListener(my$("btn"),"click",function () {
console.log("哦1");
});
addEventListener(my$("btn"),"click",function () {
console.log("哦2");
});
addEventListener(my$("btn"),"click",function () {
console.log("哦3");
});

移除解绑事件
解绑事件
解绑事件
* 对象.addEventListener("没有on的事件类型",命名函数,false);---绑定事件
* 对象.removeEventListener("没有on的事件类型",函数名字,false);
* 解绑事件
* 对象.attachEvent("on事件类型",命名函数);---绑定事件
* 对象.detachEvent("on事件类型",函数名字);
解绑兼容代码
function removeEventListener(element,type,fnName) {
if(element.removeEventListener){
element.removeEventListener(type,fnName,false);
}else if(element.detachEvent){
element.detachEvent("on"+type,fnName);
}else{
element["on"+type]=null;
}
}
function f1() {
console.log("第一个");
}
function f2() {
console.log("第二个");
}
addEventListener(my$("btn1"),"click",f1);
addEventListener(my$("btn1"),"click",f2);
my$("btn2").onclick=function () {
removeEventListener(my$("btn1"),"click",f1);
}; 

解绑事件的其他方法
// my$("btn2").onclick=function () {
// //1.解绑事件
// my$("btn").onclick=null;
// };
4,inner
InnerText细节技术点
设置标签中的文本内容,应该使用textContent属性,谷歌,火狐支持,IE8不支持
设置标签中的文本内容,应该使用innerText属性,谷歌,火狐,IE8都支持
浏览器兼容性写法
如果这个属性在浏览器中不支持,那么这个属性的类型是undefined
判断这个属性的类型 是不是undefined,就知道浏览器是否支持
核心代码 typeof element.textContent =="undefined"
innerText和innerHTML的区别
使用innerText主要是设置文本的,设置标签内容,是没有标签的效果的
innerHTML是可以设置文本内容
innerHTML主要的作用是在标签中设置新的html标签内容,是有标签效果的
想要设置标签内容,使用innerHTML,想要设置文本内容,innerText或者textContent,或者innerHTML,
推荐用innerHTML
//获取的时候:
//innerText可以获取标签中间的文本内容,但是标签中如果还有标签,那么最里面的标签的文本内容也能获取.获取不到标签的,文本可以获取
5,event
Event事件的兼容写法
获得event对象兼容性写法 
event || (event = window.event); 
获得target兼容型写法 
event.target||event.srcElement
function addEventListener(element,type,fn) {
//判断浏览器是否支持这个方法
if(element.addEventListener){
element.addEventListener(type,fn,false);
}else if(element.attachEvent){
element.attachEvent("on"+type,fn);
}else{
element["on"+type]=fn;
}
}
addEventListener(my$("btn"),"click",function () {
console.log("哦1");
});
addEventListener(my$("btn"),"click",function () {
console.log("哦2");
});
addEventListener(my$("btn"),"click",function () {
console.log("哦3");
});
原文地址:https://www.cnblogs.com/adylz111/p/13433662.html