何为操做系统?操做系统(Operating System)是管理和控制计算机硬件与软件资源的计算机程序。是的,任何的应用软件必须在操做系统的支持下运行。javascript
你们会疑问?为何我要讲操做系统?你猜!html
其实,我只想表述我本身的一个观点,“Web浏览器是Web应用的操做系统”。这句话来源于JavaScript权威指南。前端
正由于Web浏览器(IE、Mozilla、Apple、Google、360浏览器、QQ浏览器)的多样性,才出现了所谓的兼容性问题。html5
编写一个JavaScript程序并能正确运行在这么多平台之上,的确是一种挑战。java
软件更新;在web平台的发展中,一个标准规范会倡导一个新的特性或API。是的,浏览器开发商以为某个特性很不错,那他可能在浏览器中实现它。若是某个特性有很是多的开发商实现,那么这个特性或API就会普遍使用,可是某个特性的实现会有一个前后的过程,致使一个结果“旧的浏览器不支持这个特性”。jquery
设计差别;浏览器开发商们一样实现一个特性或API,但他们的观点和编码风格差别,一样的一个功能在同的浏览器中也会有很大的差异。web
软件BUG;任何的软件都存在BUG,Web浏览器也是一个软件。而且没有按照规范准确实现客户端的JavaScriptAPI面试
若是你去面试一个前端工程师,面试官最常问的一个问题:如何解决浏览器的兼容性问题?ajax
1 if(element.addEventListener){ 2 //W3C方法 3 element.addEventListener("keydown",handler,false); 4 element.addEventListener("keypress",handler,false); 5 }else if(element.attachEvent){ 6 //IE方法 7 element.attachEvent("onkeydown",handler); 8 element.attachEvent("onkeypress",handler); 9 }else{ 10 //选择普遍使用方式 11 element.onkeydown = element.onkeypress = handler; 12 }
可是,有时候为了实现一个很是简单的功能,透明地实现整个标准并不是真正可行。编程
例如,个人一个应用:只在页面实现一个Ajax请求!
使用兼容性类库:
1 <script src="./core/zepto.min.js"></script> 24k 2 <script> 3 $.ajax({ 4 type: 'GET', 5 url: './index.html', 6 data: {}, //参数 7 dataType: 'html', //返回类型 8 success: function(data){ 9 //成功回调 10 }, 11 error: function(xhr, type){ 12 alert('Ajax error!') 13 } 14 }); 15 </script>
使用原生JavaScript:
1 var xml_http; 2 if (window.ActiveXObject) { 3 xml_http = new ActiveXObject("Microsoft.XMLHTTP"); 4 } else if (window.XMLHttpRequest) { 5 xml_http = new XMLHttpRequest(); 6 } 7 xml_http.open("GET", "./index"); 8 xml_http.send(null); 9 xml_http.onreadystatechange = function () { 10 if ((xml_http.readyState == 4) && (xml_http.status == 200)) { 11 alert('success'); 12 } else { 13 alert('fail'); 14 } 15 }
考虑兼容性问题时,要考虑适中的方法引用。
从某种维度将浏览器版本/操做系统变体进行分级,使用不一样的测试用例,从而解决兼容性问题。
其实咱们不难发现,客户端JavaScript编程中的不少不兼容性问题都是针对IE的,也就是说必须按照某种方式为IE编写代码,而按照另外一种方式为其余浏览器编写代码。IE支持条件注释。
1 <!–[if lt IE 8]> 2 <script src=”http://ie7-js.googlecode.com/svn/version/2.0(beta)/IE8.js” type=”text/javascript”></script> 3 <![endif]–> 4 <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> 5 <!--[if lt IE 9]> 6 <script src="__STATIC__/bootstrap/js/html5shiv.js?v={:SITE_VERSION}"></script> 7 <![endif]--> 8 <block name="style"></block> 9 <!--[if lt IE 9]> 10 <script type="text/javascript" src="__STATIC__/jquery-1.10.2.min.js"></script> 11 <![endif]--> 12 <!--[if gte IE 9]><!--> 13 <script type="text/javascript" src="__STATIC__/jquery-2.0.3.min.js"></script> 14 <!--<![endif]-->
本文只是简单讲解了前端JavaScript脚本的兼容性问题缘由及解决办法,固然,这些都只是一个基础的篇章。
要想彻底解决前端兼容性问题,路还很长......