失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > html 引入js 兼容 JS跨浏览器兼容性解决思路及方案汇总 常见JS兼容性知识点汇总...

html 引入js 兼容 JS跨浏览器兼容性解决思路及方案汇总 常见JS兼容性知识点汇总...

时间:2023-04-10 15:13:00

相关推荐

html 引入js 兼容 JS跨浏览器兼容性解决思路及方案汇总 常见JS兼容性知识点汇总...

上篇文章我们介绍了,处理CSS浏览器兼容性的4个解决方案:浏览器CSS样式初始化、浏览器私有属性,CSS hack语法和自动化插件,有兴趣的可以看看,链接放到本文结尾

本文主要介绍JS的跨浏览器兼容性主要解决思路和方案,主要包括这几个方面浏览器兼容性问题查询途径

JS兼容性处理常用插件及类库

JS兼容性知识点汇总(兼容性处理的原生js写法)

浏览器兼容性问题查询途径

有时候我们想知道,针对某个CSS新特性或者JS新特性,各个浏览器的支持情况,这时我们去哪查询呢?给大家推荐一个神奇的网站Can I Use(网址:/)。

在Can I Use网站中,我们可以搜索某个CSS/JS特性的浏览器支持情况,如CSS的disp:flex,查询结果如下

鼠标移入某个浏览器版本上面,会有一些兼容性的描述,比如告诉你怎么进行兼容

我们再搜索一下JS的添加事件监听方法addEventListener,结果如下

同样的,鼠标移入浏览器版本上面,可以看到一些兼容性的解决方法提示,非常方便

通过这个网站,我们就可以做到对每个浏览器的支持情况,做到心中有数,是前端人员不可不知的一个网站。

兼容性处理常用插件及类库

有人说前端学起来比较简单,那是因为90%以上的脏活累活,都被各种类库作者干了,我们只不过是进行调用,面向api编程而已。兼容性处理也有很多类库,这里给大家介绍几个比较常用的。

Html5shiv.js

Html5shiv是解决IE6,IE7,IE8不识别html5新增html标签的问题,其实这个不应该算JS兼容性处理,应该是Html的兼容性处理,不过因为Html的兼容性问题毕竟少,不再单独介绍,特在此简单说明。

一般采用条件hack的方式引入Html5shiv.js

还有一点需要注意,在页面中调用Html5shiv.js文件,必须添加在页面的head元素内,因为IE浏览器必须在元素解析前知道这个元素,所以这个js文件不能在页面底部调用。

Respond.js

Respond.js 是一个快速、轻量的 polyfill,用于为 IE6-8 以及其它不支持 CSS3 Media Queries 的浏览器提供媒体查询的 min-width 和 max-width 特性,实现响应式网页设计,如:@mediascreenand(min-width:480px){

/**...stylesfor480pxandupgohere**/

}

在所有css后面引入该文件,但是越早引入越好,在ie下面看到页面闪屏的概率就越低,一般我们在head中,同时引入Html5shiv.js和Respond.js

jQuery/Zepto

jQuery大家肯定都非常熟悉了,在没有使用3大框架(React、Vue、Angular)的时候,简直是前端利器,而且jQuery帮我们做了一些兼容性的封装,让我们使用起来不用考虑那么多。

jQuery从2.x开始已经不兼容IE6、7、8了,如果要兼容IE9以下的浏览器,需要使用jQuery 1.x 版本

我们随便看几个jQuery中关于JS兼容性处理的代码//添加事件监听

...

if(elem.addEventListener){

elem.addEventListener(type,eventHandle,false);

}elseif(elem.attachEvent){

elem.attachEvent("on"+type,eventHandle);

}

...

//ajax兼容性处理

functioncreateStandardXHR(){

try{

returnnewwindow.XMLHttpRequest();

}catch(e){}

}

//IE8一下

functioncreateActiveXHR(){

try{

returnnewwindow.ActiveXObject("Microsoft.XMLHTTP");

}catch(e){}

}

});

Babel

虽然ES6标准已经通过很多年了,但是目前仍然有很多浏览器不支持,下图为ES6新语法Promise的浏览器支持情况,但是作为前端,我们现在必须要熟悉ES6语法并用其进行开发了,目前主要通过Babel将ES6语法转换为ES5代码。

babel是一个转译器,感觉相对于编译器compiler,叫转译器transpiler更准确,因为它只是把同种语言的高版本规则翻译成低版本规则,而不像编译器那样,输出的是另一种更低级的语言代码。

但是和编译器类似,babel的转译过程也分为三个阶段:parsing、transforming、generating,以ES6代码转译为ES5代码为例,babel转译的具体过程如下:

ES6代码输入 ==》 babylon进行解析 ==》 得到AST==》 plugin用babel-traverse对AST树进行遍历转译 ==》 得到新的AST树==》 用babel-generator通过AST树生成ES5代码

我们可以通过webpack结合babel-loader来实现,具体配置方式不展开了。

JS兼容性知识点汇总(兼容性处理的原生js写法)

获取滚动条位置//chrome中document.body.scrollTop始终为0,而safari中document.documentElement.scrollTop始终为0

letscrollTop=document.documentElement.scrollTop||document.body.scrollTop

事件绑定if(obj.addEventListener){

obj.addEventListener(event,fn,fase);

}else{

//兼容IE8以下

obj.attachEvent("on"+event,fn);

}

event事件对象document.onclick=function(e){

//IE8以下不会传入参数e,e为undefined

vare=e||window.event;

//获取target的兼容写法,后面的为IE

vartarget=e.target||e.srcElement;

}

阻止浏览器默认事件functionprevent(event){

if(event.preventDefault){

event.preventDefault();

}else{

//兼容IE

event.returnValue=false;

}

}

阻止事件冒泡functionstop(event){

if(event.stopPropagation){

event.stopPropagation()

}else{

//兼容IE

event.cancleBubble=true;

}

}

如果觉得《html 引入js 兼容 JS跨浏览器兼容性解决思路及方案汇总 常见JS兼容性知识点汇总...》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。