梦游前端,JavaScript兼容性

前端兼容问题出现的原因

何为操作系统?操作系统(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脚本的兼容性问题原因及解决办法,当然,这些都只是一个基础的篇章。

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

  

时间: 2024-10-12 22:43:17

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

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

前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: 我最开始都是使用IE6,IE6上没问题,其它浏览器坑爹(多出现与前端后端一起搞的同学,小生2年前就这种状态,鼓励人家用ie6....) 我要遵循标准,我只要ff就好,IE就是坑爹的玩意,我不必去理他(小生一年前的心态...) 现在看来,之前的想法都是不对的,我们诚然应该追求最新的浏览器使用最新的技术,但是渐进增强,向后兼容的思想一定要有, 因为就现在IE6在中国的份额

IE和Firefox的Javascript兼容性总结

长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javascript兼容性: 一.函数和方法差异: 二.样式访问和设置: 三.DOM方法及对象引用: 四.事件处理: 五.其他差异的兼容处理. 一.函数和方法差异 1. getYear()方法 [分析说明]先看一下以下代码: var year= new Date().getYear();document.wr

nodejs 和web前端JavaScript什么区别

web前端javascript组成: ECMAScript,(是js的标准,js是它的具体实现和扩展,它描述语言的语法和基本对象,如:语法,运算符,语句,继承机制,数据结构以及一些内置对象) DOM(文档对象模型),描述处理网页内容的方法和接口,将整个文档document解析成dom树供用户使用js对文档进行处理. BOM(浏览器对象模型),描述可以和浏览器窗口交互的方法和接口(对象结构),如:window对象,history.location.navigator等. nodejs除了语言基础E

基于七牛API开发的前端JavaScript SDK

这是我们工程实践的内容,由于时间原因,具体不赘述,啊~主要还是因为懒o(╯□╰)o工程实践的题目为openedx后端管理系统的功能拓展与优化,我们要优化的一个主要功能便是实现视频本地化上传,我们采用的视频云服务商为七牛云存储,以下链接是基于它的API开发的前端JavaScript SDK,http://developer.qiniu.com/docs/v6/sdk/javascript-sdk.html我的任务是看完,找到需要改的参数,刚刚大概看了一下,很多东西不是很明白,先把我觉得需要改的参数

前端javascript模板

doT.js——前端javascript模板引擎问题备忘录 我手里维护的一个项目,遇到一个问题:原项目的开发人员在Javascript中,大量的拼接HTML,导致代码极丑,极难维护.他们怎么能够忍受的了这么丑陋.拙劣的代码呢,也许是他们的忍受力极强,压根就没想去寻找解决方法. 可是,我,是万难不能接受这种丑陋的解决方式的.有没有优雅的解决方法呢,于是在网上搜索到了doT.js. 主页很简洁,就一个页面,研究了一下,就顺利的上手了,相当的简单易用.主要分两步走. 1.写模板 写模板,就用官方文档里

原生javascript兼容性问题

1.获取样式表里面的width,border color 之类的css(不是行间) 主要是IE6-7支持currentStyle,标准浏览器支持getComputedStyle; 实例:封装函数 复制代码代码如下: function getStyle(obj,name){ if(obj.currentStyle){ return obj.currentStyle[name]; } else{ return getComputedStyle(obj,false)[name]; } } 调用:get

菜鸟学前端--javascript基础

在学习过css相关的知识,有了前端工程师的一些基础知识.但要较好的掌握前端,必须要学习好javascript的知识. 下面将从基本语法.变量.关键字.保留字.语句.函数.BOM等角度阐释. 一.基本语法 javacript作为一种面向对象的.脚本级的轻量语言,与java一脉相承. 命名:区分大小写,弱类型定义(一般采用var,不限制类型). 行末分号可有可无(从经验上来看,推荐写,可以提高代码阅读质量). 括号用于代码段. 注释与C.java类型,单行用"//",段注释用"/

JAVA后台与前端JAVASCRIPT之间AES加密解密互通

调试了一天终于把java后台与javascript之间的AES加密解密成功了,记录一下过程. 后台java解密代码:解码算法及模式为 AES/CBC/PKCS5Padding key与iv要为16位 得到16的字符数组按照16进制编码转化为字符串 public static String encrypt(String content, String key) throws Exception { try { Key keySpec = new SecretKeySpec(key.getBytes

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

在C#后端处理一些结果然传给前端Javascript或是jQuery,以前Insus.NET有做过一个例子<把CS值传给JS使用 >http://www.cnblogs.com/insus/archive/2011/05/04/2036271.html 是使用Literal控件来实现. 不过还是有些复杂. 本次Insus.NET再简化一些,把值传给前端的jQuery. 用户请求一个网页,送至服务器之后,然后传给客户端.因此服务端传值给jQuery或是javascript是件很容易的事.反之的话