前端兼容问题出现的原因

何为操作系统?操作系统(Operating System)管理控制计算机硬件与软件资源的计算机程序。是的,任何的应用软件必须在操作系统的支持下运行。

大家会疑问?为什么我要讲操作系统?你猜!

其实,我只想表述我自己的一个观点,“Web浏览器是Web应用的操作系统”。这句话来源于JavaScript权威指南。

正因为Web浏览器(IE、Mozilla、Apple、Google、360浏览器、QQ浏览器)的多样性,才出现了所谓的兼容性问题。

编写一个JavaScript程序并能正确运行在这么多平台之上,的确是一种挑战。

前端兼容性主要有哪些问题

软件更新;在web平台的发展中,一个标准规范会倡导一个新的特性或API。是的,浏览器开发商觉得某个特性很不错,那他可能在浏览器中实现它。如果某个特性有非常多的开发商实现,那么这个特性或API就会广泛使用,但是某个特性的实现会有一个先后的过程,导致一个结果“旧的浏览器不支持这个特性”。

设计差异;浏览器开发商们同样实现一个特性或API,但他们的观点和编码风格差异,同样的一个功能在同的浏览器中也会有很大的差别。

软件BUG;任何的软件都存在BUG,Web浏览器也是一个软件。并且没有按照规范准确实现客户端的JavaScriptAPI

如何处理兼容性问题

如果你去面试一个前端工程师,面试官最常问的一个问题:如何解决浏览器的兼容性问题?

  • 功能测试(capability testing)是解决不兼容问题的一种强大技术。
  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. }
  • 处理兼容性问题其中最简单的方法就是使用类库(JQuery、Zepto、Excanvas),前两者定义了新的客户端API并兼容所有浏览器。例如,JQuery处理事件程序注册通过Bind进行完成。

但是,有时候为了实现一个非常简单的功能,透明地实现整个标准并非真正可行。

例如,我的一个应用:只在页面实现一个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. }

  考虑兼容性问题时,要考虑适中的方法引用。

  • 分级浏览器支持(graded browser support)是由Yahoo率先提出的一种测试技术。

  从某种维度将浏览器版本/操作系统变体进行分级,使用不同的测试用例,从而解决兼容性问题。

  • Internet Explorer是的条件注释

其实我们不难发现,客户端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脚本的兼容性问题原因及解决办法,当然,这些都只是一个基础的篇章。

  要想完全解决前端兼容性问题,路还很长......

  

梦游前端,JavaScript兼容性的更多相关文章

  1. IE和Firefox的Javascript兼容性总结

    长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...

  2. 【总结】IE和Firefox的Javascript兼容性总结(转)

    文章转自:http://www.cnblogs.com/wiky/archive/2010/01/09/IE-and-Firefox-Javascript-compatibility.html 长久以 ...

  3. [ 兼容 ] IE和Firefox的Javascript兼容性总结

    长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...

  4. 【总结】IE和Firefox的Javascript兼容性总结

    长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...

  5. Web前端浏览器兼容性个人经验总结

    前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: 我最开始都是使用IE6,IE6上没问题,其它浏览器坑爹(多出现与前端后 ...

  6. 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述

    前言 作为一名资深搬砖工,你要问我用得最熟练的技能是什么,那我敢肯定且自豪的告诉你:是 Ctrl+C !是 Ctrl+V! 不信?你来看看我键盘上的 Ctrl.C 和 V 键,那油光发亮的包浆程度,不 ...

  7. 前端JavaScript规范

    前端JavaScript规范 http://www.imooc.com/article/1402 http://greengerong.com/blog/2015/05/09/qian-duan-ja ...

  8. 实例演示 kino.razor (前端 Javascript 模板工具,Razor 风格)的使用

    前言 对于习惯了 ASP.NET MVC Razor 模板引擎的人来说,比如我,一直在寻找前端 Javascript 端的 Razor 模板工具.这之前,我也了解到很多Javascript 端的模板工 ...

  9. 在C#后端处理一些结果然传给前端Javascript或是jQuery

    在C#后端处理一些结果然传给前端Javascript或是jQuery,以前Insus.NET有做过一个例子<把CS值传给JS使用 >http://www.cnblogs.com/insus ...

随机推荐

  1. Qt编程之QtScript

    需求是这样的: 需要给一个硬件接口测试些东西,用js来调用,js做成不同的独立模块分别测试不同的硬件接口,包括DMD内存,PCIE带宽等等.需要用一个exe来载入这些js文件分别调用测试模块.exe用 ...

  2. ubuntu下配置安装conky

    由于默认的conky配置不好看,于是下载了一些配置,网上一抓一大把. 首先  sudo apt-get install conky-all 然后下载想要的配置文件,下载下来的是压缩文件,解压就行了,解 ...

  3. poj 1020 Anniversary Cake(切正方形蛋糕+搜索)

                                                                                                         ...

  4. POJ3026(BFS + prim)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10554   Accepted: 3501 Descri ...

  5. spring管理hibernate4 transaction getCurrentSession为什么报错?

    hibernate4不支持你用hibernate3的 getcurrentSession,建议你用openSession

  6. One Way Roads(搜索)

    One Way Roads Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  7. MVC4 jquery 样式 主题 用法(案例)

    MVC4已经自带了jquery,新建的项目,基本上什么都不用添加就可以运行,跑项目.(集成了那么多东西,jquery,modernizr,自带的默认权限,生成的模板,但是缺没有一个统一的文档或者什么去 ...

  8. 【转载】Xcode6中添加pch文件

    //原文地址:http://www.cnblogs.com/YouXianMing/p/3989155.html 1. 新建工程: 2. 创建pch文件:cmd+n->other->PCH ...

  9. 实现两个select list box间item的移动和过滤

    <head> <title> </title> <!--Standard jQuery --> <script type="text/j ...

  10. 重写QSqlTableModel的flags函数实现tableview中某些列不可编辑,某些可以编辑

    Qt中使用QsqlTableModel和QTableView来显示数据库的查询结果是非常方便的,但是为了使QTableView中某些了列不可用,就需要重写 Qt::ItemFlags flags(co ...