首先:如何處理兼容問題
1.如果兩個都是屬性,用邏輯||做兼容
2.如果有一個是方法,用三元做兼容
3.如果是多個屬性或方法,封裝函數做兼容
分享兩個小知識點:
1、取消拖拽的默認行為:
document.ondragstart = function(){
return false
}
2、阻止右鍵菜單的默認行為:
document.oncontextmenu = function(){
return false
}
開始兼容問題:
一、運用邏輯運算符||做的相關兼容
1、關於獲取滾動高度的不兼容問題
var scrollTop=documentElement.scrollTop
var scrollTop=document.body.scrollTop(chrome寫法)
兼容寫法:
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop
2、關於獲取事件對象的兼容:
function (eve){
var e = eve || window.event
}
3、獲取鍵盤編碼的兼容:
function (eve){
var e = eve || window.event
var keyValue = e.keyCode || e.charCode || e.which
}
4、關於事件委托獲取事件源的兼容問題:
function (eve){
var e = eve || window.event
var target = e.target || e.srcElement
}
二、運用三元表達式做的兼容
1、阻止事件冒泡的兼容
function (eve){
var e = eve || window.event
e.stopPropagation ? e.stopPropagation : e.cancleBubble = true;
}
2、阻止超鏈接的默認行為:
oA.onclick = function (eve){
var e = eve || window.event
e.preventDefault ? e.preventDefault() : e.returnValue = false
}
三、運用方法進行兼容的問題:
1、添加事件監聽:
function addEventListener(obj,event,fn,boo){
if(obj.addEventListener){
obj.addEventListener(event,fn,boo);
}else{
obj.attachEvent("on" + event,fn);
}
}
運用:
addEventListener(oBtn,"click",fn1,false);
addEventListener(oBtn,"click",fn2,false);
addEventListener(oBtn,"click",fn3,false);
2、移除事件監聽:
function removeEventListener(obj,evt,fn,boo){
if(obj.removeEventListener){
obj.removeEventListener(evt,fn,boo);
}else{
obj.detachEvent("on" + evt,fn);
}
}
removeEventListener(oBtn,"click",fn2,false);
3、獲取鼠標鍵值的兼容:(event.button)
function getbutton(eve){
var e = eve || window.event;
if(eve){//判斷是否為標准瀏覽器
return e.button
}else if(window.event){//判斷是不是IE
switch(e.button){
case 1 : return 0;
case 4 : return 1;
case 2 : return 2;
}}}
二:關於使用getAttribute獲取className不兼容的問題
<div id="box1"></div>
var oBox=document.getElementById("box1")
(1)console.log(oBox.getAttribute("className"))//標准瀏覽器不支持,ie7支持
(2)console.log(oBox.getAttribute("class")//標准瀏覽器支持,ie7不支持
兼容寫法:
function fn(obj){
if(obj.getAttribute("class"))==null{
return obj.getAttribute("className");
}else{
return obj.getAttribute("class")
}
};
三:關於getElementsByClassName("class屬性名稱")的不兼容問題;
console.log(obj.getElementsByClassName("class屬性名稱"))//標准瀏覽器支持,ie8以下不支持
兼容寫法:
function fn(obj.class屬性名稱){
if(obj.getElementsByClassName){
return obj.getElementsByClassName(className);
}else{
var list = [];
var arr = obj.getElementsByTagName(*)//上一步是獲取頁面所有的標簽元素
for(var i = 0;i < arr.length;i ++){
if(arr[i].className == className){
list.push(arr[i]);
}
}
return list;}}
遍歷所有元素,找出class名為指定名字的元素
四: 關於處理空白文本節點的問題
1.忽略空白文本節點
function fn(nodes){
var arr = [];
for(var i = 0;i < nodes.length;i ++){
if(nodes[i].nodeType === 3 &&
/^\s+$/.test(nodes[i].nodeValue)){
continue;
}else{
arr.push(nodes[i]);
}} return arr;}
2.刪除空白文本節點:
function fn(nodes){//nodes;所有的子節點
for(var i = 0;i < nodes.length;i ++){
if(nodes[i].nodeType === 3 &&
/^\s+$/.test(nodes[i].nodeValue)){
nodes[i].parentNode.removeChild(nodes[i]);}}
return nodes
}
3.移除空白節點
function fn(node){//node:父節點
var childs = node.childnodes;//獲取所有子節點
for(var i = 0;i < childs.length;i ++){
if(childs[i].nodeType === 3 &&
/^\s+$/.test(childs[i].nodeValue)){
node.removeChild(childs[i]);}}
return node;
}
五:獲取非行內樣式的兼容寫法
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,true)[attr];
}
attr:是屬性;比如
<style>#box{width:100px;}</style>
<div id = box></div>
<script>
var oBox = document.getElementById("box");
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,true[attr];
};
var s = getStyle(oBox,"width");
alert(s);
</script>