存在不一樣瀏覽器間的JS兼容總結

2016年2月19日我的博客文章--遷移到segmentfaultjavascript

當咱們在編寫JS用於處理事件時,因爲考慮到不一樣瀏覽器間Js代碼兼容不一樣,代碼不易記憶,因而作出以下整理。(固然之後還會增長更新的。。。)html

示例代碼以下:java

(1)阻止默認事件node

obj.onclick=function(ev){
        var event=ev||window.event;
        if(event.preventDefault){
            event.preventDefault();  /*W3C標準*/
        }else{
            event.returnValue=false;   /*兼容IE*/
        }
     }

小提示:return false; 也能阻止默認事件 可是要注意位置。chrome

(2)獲取下(上)一個兄弟節點segmentfault

function nextnode(obj){  /*獲取下一個兄弟節點*/
        if (obj.nextElementSibling) {
            return obj.nextElementSibling;
        } else{
            return obj.nextSibling;
        }
    }
function prenode(obj){ /*獲取上一個兄弟節點*/
 
        if (obj.previousElementSibling) {
            return obj.previousElementSibling;
        } else{
            return obj.previousSibling;
        }
    }

(3)獲取第一個子(最後一個)節點瀏覽器

function firstnode(obj){/*獲取第一個子節點*/
        if (obj.firstElementChild) {
            return obj.firstElementChild;/*非IE678支持*/
        } else{
            return obj.firstChild;/*IE678支持*/
        }
    }
    function lastnode(obj){/*獲取最後一個子節點*/
        if (obj.lastElementChild) {
            return obj.lastElementChild;/*非IE678支持*/
        } else{
            return obj.lastChild;/*IE678支持*/
        }
    }

(4)添加(移除)事件監聽app

function addEvent(obj,type,fn){ /*添加事件*/
        if(obj.addEventListener){
            obj.addEventListener(type,fn,false); //非IE添加事件監聽
        }else{
            obj.attachEvent('on'+type,fn); //IE添加事件綁定
            stopEvent();
        }
    }
   function removeEvent(obj,type,fn){ //移除事件
        if(obj.removeEventListener){
            obj.removeEventListener(type,fn,false); //非IE移除事件,移除事件,第三個參數必須是函數名
        }else{
            obj.detachEvent('on'+type,fn); //IE移除事件
        }
    }

(5)舉例click事件阻止事件傳播異步

obj.onclick=function(ev){
            var event=ev||window.event;
            alert('aa');
            if(event.stopPropagation){
                event.stopPropagation(); //非IE阻止事件傳播
            }else{
                event.cancelBubble=true; //IE阻止事件傳播
            }
     }

(6)mouseover與mouseover的事件委託(常常用到,用於去除當 鼠標浮動到元素容器中不一樣子元素間出現閃動問題。只需在函數function(ev){} 頭部添加如下代碼便可)函數

// mouseover委託事件
    var event=ev||window.event;
    // var from=event.fromElement||event.relatedTarget;
    //在mouseover事件中from,表示鼠標來自哪一個元素,也是事件委託類型,和target與srcElement相反
    // alert(from);
    var from=event.fromElement||event.relatedTarget;
    while(from){
        if (this==from) {
            return false;
        };
        from=from.parentNode;
    }
    //mouseout委託事件
    var event=ev||window.event;
        var to=event.toElement||event.relatedTarget;
        //在mouseout事件中to,表示鼠標指向那個元素,也是事件委託類型,和target與srcElement相反
        // alert(to)
        while(to){
            if (this==to) {
                return false;
            };
            to=to.parentNode;
        }

(7)滾輪事件

box.onmousewheel=function (ev){
     var event=ev||window.event;
     // box.innerHTML='鼠標滾動'+event.wheelDelta;
     if (event.wheelDelta>0) {
     alert('鼠標前滾');//非火狐 前滾120
     } else{
     alert('鼠標後滾')//非火狐 後滾-120
     };
     }*/
    box.addEventListener('DOMMouseScroll',function (ev){
     var event=ev||window.event;
     alert(event.detail);//火狐前滾:-3 ,後滾:3
     },false)//IE678不支持

8.js按需加載 異步加載
demo.js以下

function test() {
    console.log('hello');
}

index.html以下

function loadScript(url,callback){
        var script=document.createElement('script');
        script.type='text/javascript';
        if(script.readyState){ //ie
            script.onreadystatechange=function(){
                if(script.readyState=='complete'||script.readyState=='loaded'){
                    callback()
                }
            }
        }else{
            script.onload=function(){ //Safari chrome firefox opera ----Ie script不具有onload方法
                callback();
            }
        }
        script.src=url;  //寫在這裏是爲了防止onreadystatechange狀態不改變
        document.head.appendChild(script)
    }
    loadScript('demo.js',function(){test()})
相關文章
相關標籤/搜索