梦游前端,JavaScript兼容性
前端兼容问题出现的原因
何为操作系统?操作系统(Operating System)是管理和控制计算机硬件与软件资源的计算机程序。是的,任何的应用软件必须在操作系统的支持下运行。
大家会疑问?为什么我要讲操作系统?你猜!
其实,我只想表述我自己的一个观点,“Web浏览器是Web应用的操作系统”。这句话来源于JavaScript权威指南。
正因为Web浏览器(IE、Mozilla、Apple、Google、360浏览器、QQ浏览器)的多样性,才出现了所谓的兼容性问题。
编写一个JavaScript程序并能正确运行在这么多平台之上,的确是一种挑战。
前端兼容性主要有哪些问题
软件更新;在web平台的发展中,一个标准规范会倡导一个新的特性或API。是的,浏览器开发商觉得某个特性很不错,那他可能在浏览器中实现它。如果某个特性有非常多的开发商实现,那么这个特性或API就会广泛使用,但是某个特性的实现会有一个先后的过程,导致一个结果“旧的浏览器不支持这个特性”。
设计差异;浏览器开发商们同样实现一个特性或API,但他们的观点和编码风格差异,同样的一个功能在同的浏览器中也会有很大的差别。
软件BUG;任何的软件都存在BUG,Web浏览器也是一个软件。并且没有按照规范准确实现客户端的JavaScriptAPI
如何处理兼容性问题
如果你去面试一个前端工程师,面试官最常问的一个问题:如何解决浏览器的兼容性问题?
- 功能测试(capability testing)是解决不兼容问题的一种强大技术。
if(element.addEventListener){
//W3C方法
element.addEventListener("keydown",handler,false);
element.addEventListener("keypress",handler,false);
}else if(element.attachEvent){
//IE方法
element.attachEvent("onkeydown",handler);
element.attachEvent("onkeypress",handler);
}else{
//选择广泛使用方式
element.onkeydown = element.onkeypress = handler;
}
- 处理兼容性问题其中最简单的方法就是使用类库(JQuery、Zepto、Excanvas),前两者定义了新的客户端API并兼容所有浏览器。例如,JQuery处理事件程序注册通过Bind进行完成。
但是,有时候为了实现一个非常简单的功能,透明地实现整个标准并非真正可行。
例如,我的一个应用:只在页面实现一个Ajax请求!
使用兼容性类库:
<script src="./core/zepto.min.js"></script> 24k
<script>
$.ajax({
type: 'GET',
url: './index.html',
data: {}, //参数
dataType: 'html', //返回类型
success: function(data){
//成功回调
},
error: function(xhr, type){
alert('Ajax error!')
}
});
</script>
使用原生JavaScript:
var xml_http;
if (window.ActiveXObject) {
xml_http = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
xml_http = new XMLHttpRequest();
}
xml_http.open("GET", "./index");
xml_http.send(null);
xml_http.onreadystatechange = function () {
if ((xml_http.readyState == 4) && (xml_http.status == 200)) {
alert('success');
} else {
alert('fail');
}
}
考虑兼容性问题时,要考虑适中的方法引用。
- 分级浏览器支持(graded browser support)是由Yahoo率先提出的一种测试技术。
从某种维度将浏览器版本/操作系统变体进行分级,使用不同的测试用例,从而解决兼容性问题。
- Internet Explorer是的条件注释
其实我们不难发现,客户端JavaScript编程中的很多不兼容性问题都是针对IE的,也就是说必须按照某种方式为IE编写代码,而按照另一种方式为其他浏览器编写代码。IE支持条件注释。
<!–[if lt IE 8]>
<script src=”http://ie7-js.googlecode.com/svn/version/2.0(beta)/IE8.js” type=”text/javascript”></script>
<![endif]–>
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="__STATIC__/bootstrap/js/html5shiv.js?v={:SITE_VERSION}"></script>
<![endif]-->
<block name="style"></block>
<!--[if lt IE 9]>
<script type="text/javascript" src="__STATIC__/jquery-1.10.2.min.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
<script type="text/javascript" src="__STATIC__/jquery-2.0.3.min.js"></script>
<!--<![endif]-->
本文只是简单讲解了前端JavaScript脚本的兼容性问题原因及解决办法,当然,这些都只是一个基础的篇章。
要想完全解决前端兼容性问题,路还很长......
梦游前端,JavaScript兼容性的更多相关文章
- IE和Firefox的Javascript兼容性总结
长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...
- 【总结】IE和Firefox的Javascript兼容性总结(转)
文章转自:http://www.cnblogs.com/wiky/archive/2010/01/09/IE-and-Firefox-Javascript-compatibility.html 长久以 ...
- [ 兼容 ] IE和Firefox的Javascript兼容性总结
长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...
- 【总结】IE和Firefox的Javascript兼容性总结
长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javas ...
- Web前端浏览器兼容性个人经验总结
前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: 我最开始都是使用IE6,IE6上没问题,其它浏览器坑爹(多出现与前端后 ...
- 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
前言 作为一名资深搬砖工,你要问我用得最熟练的技能是什么,那我敢肯定且自豪的告诉你:是 Ctrl+C !是 Ctrl+V! 不信?你来看看我键盘上的 Ctrl.C 和 V 键,那油光发亮的包浆程度,不 ...
- 前端JavaScript规范
前端JavaScript规范 http://www.imooc.com/article/1402 http://greengerong.com/blog/2015/05/09/qian-duan-ja ...
- 实例演示 kino.razor (前端 Javascript 模板工具,Razor 风格)的使用
前言 对于习惯了 ASP.NET MVC Razor 模板引擎的人来说,比如我,一直在寻找前端 Javascript 端的 Razor 模板工具.这之前,我也了解到很多Javascript 端的模板工 ...
- 在C#后端处理一些结果然传给前端Javascript或是jQuery
在C#后端处理一些结果然传给前端Javascript或是jQuery,以前Insus.NET有做过一个例子<把CS值传给JS使用 >http://www.cnblogs.com/insus ...
随机推荐
- Python打印格式化与字符串
关于Python打印格式化与字符串,比较全面的总结,希望对大家有帮助~ # -*- coding: cp936 -*- ''' 打印格式 ''' print "a" print & ...
- tk资料
Hello World: 让我们开始,作为其他教程的开始, 以"Hello World"程序创建一个文件 叫做Hello.pl 键入下面的内容到它这里: #!/usr/local ...
- mvc和三层架构到底有什么区别
原文地址:http://zhidao.baidu.com/question/82001542.html?qbl=relate_question_3&word=MVC%20%CA%FD%BE%D ...
- RabbitMQ中文入门教程
原文地址:http://adamlu.net/dev/2011/09/rabbitmq-get-started/ 这系列教程是翻译官方入门教程. 第一部分:Hello World第二部分:工作队列(W ...
- cloudstack4.4新增功能前瞻
cloudstack4.4.0新功能前瞻 转载请注明地址:http://blog.csdn.net/zt689/article/details/37698989 1. cloudstack4.4. ...
- wpf实现IE菜单栏自动隐藏效果
IE菜单栏默认为隐藏状态,按下键盘Alt键后显示,菜单失去焦点则自动隐藏.下面说说WPF中如何实现这样的效果. 第一步:Menu默认设置为隐藏(Visibility="Collapsed&q ...
- 【剑指offer】Q40:数组中出现一次的数
书里面关于分类的推断有些麻烦,通过某一位为0为1来对数组元素进行分类.假如第3位为1.那么也就是元素x & 8 等于或不等于0,所以不是必需非的用第几位去推断. def once(array) ...
- UGUI实现的虚拟摇杆,可改变摇杆位置
实现方式主要参考这篇文章:http://www.cnblogs.com/plateFace/p/4687896.html. 主要代码如下: using UnityEngine; using Syste ...
- 解决 jsp:include 引用文件时出现乱码的问题
阐述问题前,先来看一下下面这张图片左侧iframe中的乱码页面: 这个就是让我纠结好一阵子的乱码截图: 这个乱码页面中是使用了<jsp:include>引用标签后出现了这个问题: 源码截图 ...
- Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent
修改pom.xml文件,添加以下属性 <project> ... <properties> <project.build.sourceEncoding>UTF-8& ...