JavaScript兼容性


title: JavaScript兼容性
date: 2016-11-22 20:56:06
tags: JavaScript兼容性
categories: JS


常见JavaScript兼容性及解决方案:

1.选择器兼容性

getElementsByClassName (IE9以及以上支持);
document.querySelector和document.querySelectorAll (IE8以及以上支持)

2.获取计算后的样式

getComputedStyle (IE9以及以上支持);
currentStyle(所有IE都支持,它是一个属性)
兼容性处理:
<pre>function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj)[attr];
}
}</pre>

3. trim()(IE9以及以上支持)

<pre>var str=' wendaoliu '; //去除首尾空格
//console.log(str.trim()); 用正则兼容性写法如下
String.prototype.trim=function(){
return this.replace(/^\s+|\s+$/g,'');
};
console.log(str.trim()); //wendaoliu</pre>

4.获取DOM节点

firstChild/firstElementChild
lastChild /lastElementChild
nextSibling /nextElementSibling
previousSibling /previousElementSibling
以上方法都是兼容的,但是不同浏览器取到的结果不一样。IE8以下的非标准浏览器获取到的是标签节点,标准浏览器获取到的不一定是标签节点。
<pre>var box=document.getElementById("box");
alert(box.nextSibling.nodeName); //#text</pre>

5.滚动条距离

BOM属性:window.pageXOffset / window.pageYOffset (IE9以及以上支持);
DOM属性:document.body.scrollTop (chrome从body身上获取)
document.documentElement.scrollTop (其它的浏览器从document身上去获取)
<pre>document.onclick=function(){
var top=document.documentElement.scrollTop||document.body.scrollTop;
alert(top)
}</pre>

6. event对象

IE9以及以上支持,IE6,7,8的事件对象是window身上的一个属性。
<pre>var ev=ev||window.event;</pre>

7. addEventListener

addEventListener——IE9以及以上支持;
attachEvent——IE678支持,但是它的事件名字参数要加on。
兼容性处理:封装函数
<pre>//绑定事件
function addEvent(obj,type,fn){
if(obj.addEventListener){
obj.addEventListener(type,fn);
}else{
obj.attachEvent('on'+type,fn);
}
};
//取消绑定
function removeEvent(obj,type,fn){
if(obj.removeEventListener){
obj.removeEventListener(type,fn);
}else{
obj.detachEvent('on'+type,fn);
}
}
addEvent(box,'click',alertBox);
function alertBox(){
alert(1);
removeEvent(box,'click',alertBox);
}</pre>

8. 鼠标滚轮事件

mousewheel——IE/chrome支持
滚动的方向——event.wheelDelta
上:120(正数) 下:-120(负数)
DOMMouseScroll——FireFox支持(必须用addEventListener添加)
滚动的方向——event.detail
上:-3(负数) 下:3(正数)
兼容性处理:封装函数
<pre>function myScroll(obj,upFn,downFn){
obj.onmousewheel=fn;
obj.addEventListener('DOMMouseScroll',fn);

            function fn(ev){
                if(ev.wheelDelta>0 || ev.detail<0){
                //这个条件成立,说明现在都是往上边滚动
                    upFn.call(obj,ev);
                }else{
                    downFn.call(obj,ev);
                }
                ev.preventDefault();
                return false;
            };
        }</pre>     

9. Ajax

  1. XMLHttpRequest对象的兼容 (IE6以下不兼容) ;
    2.完成事件onreadystatechange、onload的兼容性
    onreadystatechange: readyState的值发生改变时触发的事件,只要这个值有变化就会触发;
    onload:所有请求成功完成后触发,此时readystate的值为4,IE678不支持
    新的XMLHttpRequest不推荐用onreadystatechange,使用onload。
    兼容方法:Ajax封装
    注意:因为JSON对象是不兼容的,所以在引入封装好的Ajax之前,需要引入json2.js文件,保证JSON对象在所有平台的兼容。
    <pre><script src="js/json2.js"></script>
    <script src="js/ajax.js"></script></pre><pre>
    function ajax(json){
    var settings={
    url:'',
    method:'get',
    data:{},
    dataType:'json',
    succ:function(){},
    fail:function(){}
    };

    //用户传的参数json[attr]覆盖默认参数settings[attr]
    for(var attr in json){
    settings[attr]=json[attr];
    }
    //把数据拼成正确的格式----需要传的数据格式
    var arr=[];
    for(var attr in settings.data){
    arr.push(attr+'='+settings.data[attr]);
    }
    settings.data=arr.join('&');

    //声明一个ajax对象并坐兼容性处理
    var ajax=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');

    //设置请求方式
    if(settings.method.toLocaleLowerCase()==='get'){
    ajax.open(settings.method,settings.url+'?'+settings.data+'&'+new Date().getTime(),true);
    ajax.send();
    }else{
    ajax.open(settings.method,settings.url,true);
    ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    ajax.send(settings.data);
    }

    //设置完成事件的兼容性
    if(typeof ajax.onload==='undefined'){
    ajax.onreadystatechange=ready;
    }else{
    ajax.onload=ready;
    }

    function ready(){
    if(ajax.readyState==4){
    if(ajax.status==200){
    switch(settings.dataType.toLocaleLowerCase()){
    case 'string':
    settings.succ(ajax.responseText);
    break;

                 case 'json':
                     settings.succ(JSON.parse(ajax.responseText));
                     break;
                 
                 case 'xml':
                     settings.succ(ajax.responseXML);
             }
         }else{
             settings.fail(ajax.status);
         }
     }
    

    };
    }
    </pre>

10. forEach()遍历数组( IE9及以上能支持)

<pre>var color=['red','green','blue','yellow'];
color.forEach(function(value,index,array){
console.log(value,index,array);
});</pre>
<pre>var color=['red','green','blue','yellow'];
for(var i=0; i<color.length;i++){
console.log(color[i],i,color)
}</pre>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容