瀏覽器相容問題處理總結

Rocky1發表於2019-02-13

總結了一些關於瀏覽器相容性的問題供參考

1.在IE6/7/8下

Object.prototype.toString.apply(null) 返回"[object Object]" Object.prototype.toString.apply(undefined) 同樣返回"[object Object]"

2.IE8以下 JSON是不存在的

解決方法

var str = '{"a":100}'

// 1. JSON.parse : 將JSON格式的字串轉成JSON格式的物件

/*var o = JSON.parse(str);
    o.a=200;//{"a":200}
    console.log(o.a);
    console.log(JSON);*/
    
//在IE8以下,JSON是不存在的
console.log(eval("("+str+")"))
複製程式碼

3.獲取上一個哥哥元素節點,相容所有瀏覽器

 function getBrother(curEle) {
 
        var pre = curEle.previousSibling;
        
        while(pre)
        
        {
            if(pre.nodeType===1){
                return pre;
            }
            
            pre = pre.previousSibling;
            
            // pre等於哥哥節點的哥哥節點;
        }
    }
複製程式碼

4.bind傳參的方式和call方法一樣; IE8以下不相容

Function.prototype.myBind = function () {
        // this--> fn;
        var  that = this;
        // 如果myBind有第一個引數,那麼指向第一個引數,沒有指向window;
        var  arg = arguments[0]||window;
        // 截圖arguments中從索引1開始之後的項
        var ary1 = [].slice.call(arguments,1)
        return function () {
            // 類陣列轉陣列
            var ary2 = [].slice.call(arguments);
            // apply 可以傳陣列,concat將陣列連線在一起;
            that.apply(arg,ary1.concat(ary2));
        }
    }

複製程式碼

5.低版本ie獲取可視區域寬高

var winW=document.body.clientWidth

var winH=document.body.clientHeight
複製程式碼

6.相容瀏覽器獲取可視區域的方法

document.documentElement.clientWidth||docuemnt.body.clientWidth

document.documentElement.clientHeight||docuemnt.body.clientHeight
複製程式碼

Ie8以下不相容,window中沒有getComputedStyle這個方法

解決方法

元素.currentStyle.屬性名 //相容IE所有瀏覽器
//只能Ie使用
複製程式碼

通過類名(getElementsByClassName)IE8以及以前版本不相容

解決方法:

function getClassNames(classStr,tagName){
        if (document.getElementsByClassName) {
            return document.getElementsByClassName(classStr)
        }else {
        var nodes = document.getElementsByTagName(tagName),ret = []; 
        for(i = 0; i < nodes.length; i++) {
         if(hasClass(nodes[i],classStr)){
           ret.push(nodes[i])
            }
                }
            return ret;
        }
    }
    function hasClass(tagStr,classStr){
    var arr=tagStr.className.split(/\s+/ ); //這個正規表示式是因為class可以有多個,判斷是否包含
        for (var i=0;i<arr.length;i++){
            if (arr[i]==classStr){
                return true ;
            }
    }
        return false ;
    }
複製程式碼

IE8及IE8以下沒有addEventListener()

解決方法:

//ie支援
attachEvent("onclick",fn)
//事件需加上on
複製程式碼

注意:

  1. attachEvent繫結的事件方法順序是倒序的
  2. 重複繫結的問題:可以給同一個元素的同一個事件繫結相同的方法
  3. IE8以上既有addEventListener又有attachEvent
  4. 函式方法中的this指向window,不指向被繫結的那個元素
box.attachEvent("onclick",fn);
box.attachEvent("onclick",fn);
複製程式碼

IE8以下沒有事件物件

box.onclick=function(e){
    
}
console.log(e) //ie下undefined
複製程式碼

解決方法:

IE8及IE8以下可輸出

console.log(window.event);
e=e||window.event;
複製程式碼

注意:IE8以下

1. 事件物件裡沒有pageX

box.onclick = function (e) {
    e = e || window.event;
    e.pageX = e.pageX || e.clientX + document.documentElement.scrollLeft;
        }
複製程式碼

2. 事件物件裡沒有pageY

 box.onclick = function (e) {
        e = e || window.event;
        e.pageY = e.pageY || e.clientY + document.documentElement.scrollTop;
        }
複製程式碼

3. 事件物件裡沒有target

box.onclick = function (e) {
e.target = e.target || e.srcElement;
        e = e || window.event;
        }
複製程式碼

IE8沒法阻止事件預設行為

  1. 無法使用事件物件裡的preventDefault( )
  2. 可以更改returnValue的屬性值為false,同樣可以阻止事件預設行為
//相容瀏覽器

元素.onclick = function(e){
        e = e || window.event;
        e.preventDefault = e.preventDefault || function () {
            e.returnValue=false;
        }
        console.log(e);
複製程式碼

IE8沒法阻止事件冒泡傳播

無法使用e.stopPropagation( )

  1. 阻止事件的冒泡傳播: e.stopPropagation()

解決方法:

//IE8及以下就沒有這個e

元素.onclick = function (e) {
        e = e || window.event;
        e.stopPropagation = e.stopPropagation || function () {
            e.cancelBubble=true;
        }
        e.stopPropagation();
        console.log("center")
    }
複製程式碼

在火狐和IE下,使用setCapture( )可以讓滑鼠和盒子繫結在一起防止滑鼠丟失

注意:

  1. 要解綁(不然點上就出不來了)!

  2. 谷歌及其他瀏覽器不能使用!

function up() {
        if(this.setCapture){
            // releaseCapture : 解綁元素的事件和滑鼠的關係;
            this.releaseCapture();
            this.onmousemove=null;
            this.onmouseup=null;
        }else{
            document.body.onmousemove = null;
            document.body.onmouseup = null;
        }

    }
複製程式碼

Array.forEach()相容

forEach在ie8中不相容,重寫該方法

 if ( !Array.prototype.forEach ) {
        Array.prototype.forEach = function forEach( callback, thisArg ) {
            var T, k;
            if ( this == null ) {
                throw new TypeError( "this is null or not defined" );
            }
            var O = Object(this);
            var len = O.length >>> 0;
            if ( typeof callback !== "function" ) {
                throw new TypeError( callback + " is not a function" );
            }
            if ( arguments.length > 1 ) {
                T = thisArg;
            }
            k = 0;
            while( k < len ) {

                var kValue;
                if ( k in O ) {
                    kValue = O[ k ];
                    callback.call( T, kValue, k, O );
                }
                k++;
            }
        };
    }
複製程式碼

關於IE8中HTML5的一些相容問題

1. HTML5 新增的標籤在 IE8 裡是不受支援,例如:section / main / header / footer等

解決方法:指令碼實現IE8相容

2. background IE8不支援連寫

解決方法: IE8下需要分開寫

3.canvas 畫布在ie8以下不相容

瀏覽器相容問題處理總結

1.移動端中IOS10以上的版本不支援form表單

未完待更新!

相關文章