js的兼容性处理

在一开始学习js的时候,从基础语法到动画的学习过程中,不得不提的一点就是兼容性处理

为什么会有兼容性处理???一开始的时候微软一家独大,认为他自己就是标准,然而后来各种浏览器百花争放,不同浏览器支持的属性有所不同.如果我们做一个基本的网页,那用户装各种浏览器的都有.那我们 可爱的程序员可就多写点能力检测的代码了.

 

在这里再说一点,现在浏览器升级很快,连微软也变得很乖,跟同谷歌火狐,也支持了99%标准的属性或者方法.所以在做产品开发的时候,针对产品的用户群,可以少些点兼容性代码哟.因为毕竟你在做一个游戏网站的时候,不会有一个老太拿着一款ie6的浏览器来上你的网站打游戏.哈哈~~~

 

其实不要看兼容性处理这个词吧,那样的高大上,甚至一开始小编我都是晕晕哒.可是一看别人的代码,不就是个if....else么.简而言之,就是做判断,如果浏览器不支持这种属性那就else一下,换另外一个属性呗.

第一点说下事件的兼容性,写这种兼容性代码,一般用一个函数封装起来,或者一个对象,我们去调用这个函数,或者调用对象里面的方法.

 1 /**
 2  * 获取滚动出去的距离
 3  * 在ie和谷歌中有差别,有的是根据body,有的是根据html元素
 4  * 返回的是滚动出去的距离
 5  * @returns {{scrollLeft: number, scrollTop: number}}
 6  */
 7 
 8 function scroll() {
 9     return {
10         scrollLeft: document.body.scrollLeft || document.documentElement.scrollLeft,
11         scrollTop: document.body.scrollTop || document.documentElement.scrollTop,
12     }
13 }
14 /**
15  * 获取事件参数在页面中的位置,ie8中不兼容pageX pageY 老版本也不支持e这个事件参数,所以e要进行e=e||window.event的处理
16  * 返回的是页面距离
17  * @param e
18  * @returns {{pageX: (*|Number), pageY: (*|Number)}}
19  */
20 function getPage(e) {
21     return {
22         pageX: e.pageX || (e.clientX + scroll().scrollLeft),
23         pageY: e.pageY || (e.clientY + scroll().scrollTop)
24     }
25 
26 }
27 /**
28  *
29  * @param element
30  * @param type
31  * @param listen
32  */
33 function addEventListener(element,type,listener){
34     if(element.addEventListener){
35         element.addEventListener(type,listener,false);
36     }else if(element.attachEvent){
37         element.attachEvent("on"+type,listener);
38     }else{
39 //最后一步,就使用大家都行的简单事件注册吧
40         element["on"+type]=listener;
41     }
42 }
43 function removeEventListener(element,type,listener){
44     if(element.addEventListener){
45         element.addEventListener(type,listener,false);
46     }else if(element.attachEvent){
47         element.detachEvent("on"+type,listener);
48     }else{
49         element["on"+type]=listener;
50     }
51 }

再说一个 关于找节点的兼容性处理,

/**
 * 获得当前对象的上一个标签元素
 * @param obj
 * @returns {*}
 */
function getPreviousSibling(obj){
    if(obj.previousElementSibling){
        return obj.previousElementSibling;
    }else {
        var node = obj.previousSibling;//是所有的浏览器都支持的,但是得判断节点类型
        while(node&&node.nodeType!=1){
            node = node.previousSibling;
        }
        return node;  //将找到的标签节点返回
    }
}

/**
 * 获取当前元素的兄弟标签节点的函数
 * @param obj
 * @returns {*}
 */
function getNextSibling(obj){
    if(obj.nextElementSibling){ // 火狐谷歌都支持的,只会获得标签兄弟节点,IE8不支持
        return  obj.nextElementSibling;
    }else {
        var node = obj.nextSibling;// nextSibling是所有的浏览器都会支持的,但是会获得文本节点,IE8及之前的浏览器会忽略空白文本节点
        while(node&&node.nodeType!=1){
            node = node.nextSibling;
        }
        return node;
    }
}

/**
 * 获得兼容性的当前对象的第一个子标签节点
 * @param obj
 * @returns {*}
 */
function getFirstChild(obj){
    if(obj.firstElementChild){
        return obj.firstElementChild;//将获取到的第一个子节点元素返回
    }else {
        var node = obj.firstChild;//获得当前对象的第一个子节点,但是这个节点有可能是文本节点
        while(node&&node.nodeType!=1){
            node = node.nextSibling;
        }
        return node;
    }
}

/**
 * 获得当前对象的最后一个子标签节点
 * @param obj
 * @returns {*}
 */
function getLastChild(obj){
    if(obj.lastElementChild){
        return obj.lastElementChild;
    }else {
        var node = obj.lastChild;
        while(node&&node.nodeType!=1){
            node = node.previousSibling;//当前对象的上一个兄弟姊妹节点
        }
        return node;
    }
}

代码就是这样写的,此路不通,再换一路.再不通,再换一路.再再不通,不好意思,我这个产品不适合你这个老太~~~~~

posted @ 2016-09-03 10:24  爱编程的小妹儿  阅读(802)  评论(0编辑  收藏  举报