
二、 JavaScript兼容
1. children与childNodes
IE提供的children、childNodes和firefox下的childNodes的行为是有差异的,firefox下childNodes会把换行和空白符号都算作父结点的子结点,而IE的childNodes和children不会。比如:
<div>
<div>yizhu2000</div>
</div>
id为dd的div在IE下用childNodes查看,其子节点数为1,而ff下为三,我们可以从firefox的dom查看器里面见到他的childNodes为["\n ", div, "\n"]。
要在firefox下模拟children的特性我们可以这样做:
if (typeof(HTMLElement) != "undefined" && !window.opera) {
HTMLElement.prototype.__defineGetter__("children", function() {
for (var a = [], j = , n, i = ; i < this.childNodes.length; i++) {
n = this.childNodes[i];
if (n.nodeType == 1) {
a[j++] = n;
if (n.name) {
if (!a[n.name])
a[n.name] = [];
a[n.name][a[n.name].length] = n;
}
if (n.id)
a[n.id] = n;
}
}
return a;
});
}
2. firefox和ie的风波
window.event只能在IE下使用,而不能用在Firefox下,这是因为Firefox的event只能在风波发生的现场使用。 Firefox必须从源处加入event作参数传递。IE忽略该参数,用window.event来调用该event。
比方说下面这个在ie下获得鼠标位置的方式:
<button >获得鼠标点击横坐标</button>
<script type="text/javascript">
function onclick(){
alert(event.clientX);
}
</script>
需要改成
<button>获得OuterHTML</button>
<script type="text/javascript">
function onclick(event){
event = event || window.event;
alert(event.clientX);
}
</script>
才能在两种浏览器下使用
3. HTML对象获取问题
FireFox获取方法document.getElementById("idName")
ie使用document.idname或者document.getElementById("idName")
解决方法:统一使用document.getElementById("idName");
4. const问题
在Firefox下,可以使用const关键字或var关键字来定义常量;
IE下,没法使用var关键字来定义常量;
解决办法:统一使用var关键字来定义常量。
5. frame问题
以上面的frame为例:
<frame src="xxx.html" />
a) 访问frame对象
IE:使用window.frameId或者window.frameName来访问这个frame对象,frameId和frameName可以同名;
Firefox:没法使用window.frameName来访问这个frame对象;
如果,在IE和Firefox中都可以使用window.document.getElementById("frameId")来访问这个frame对象;
b) 切换frame内容
在 IE和Firefox中都可以使用window.document.getElementById("testFrame").src = "xxx.html"或window.frameName.location = "xxx.html"来切换frame的内容;
因为需要将frame中的取值传回父窗口(切记不是opener,而是parent),可以在frame中使用parent来访问父窗口。例如:

parent.document.form1.filename.value="Aqing";
6. body问题
Firefox的body在body标签没有被浏览器完全读入之前就存在;而IE的body则必须在body标签被浏览器完全读入之后才存在;
7. firefox与IE的父元素(parentElement)的差异
IE:obj.parentElement
firefox:obj.parentNode
解决办法:因为firefox与IE都支持DOM,所以全部使用obj.parentNode
8. innerText的难题
innerText在IE中能正常工作,所以innerText在FireFox中却不行,可用textContent;
解决办法:
if (navigator.appName.indexOf("Explorer") > -1) {
document.getElementById('element').innerText = "my text";
} else {
document.getElementById('element').textContent = "my text";
}
9. AJAX获取XMLHTTP的差异
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} elseif (window.ActiveXObject) { // IE的获取方法
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
注意:在IE中,xmlhttp.send(content)方式的content可以为空,而firefox则不能为null,也是用send(""),如果会出现411错误。
附录1:跨浏览器兼容的CSS编码准则和技巧
1. 理解 CSS 盒子模型
因为你想实现不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码,通透地理解 CSS 盒子模型是首要大事,CSS 盒子模型并不难,且基本支持一切浏览器,除了这些特殊条件下的 IE 浏览器。
CSS 盒子模型负责处理以上事情:
l 一个 blcok (区块)级对象占据很大的空间
l 该对象的界限,留白
l 盒子的尺寸
l 盒子与网页其它元素的相对位置

CSS 盒子模型有以上原则:
l Block (区块)对象都是矩形 (事实上所有对象都这么)
l 其尺寸由 width, height, padding, borders, 以及 margins 决定
l 如果不设置高度,该箱子的高度将自动适应其包括的内容,加上留白等(如果使用了 float)
l 如果不设置长度,一个非 float 型箱子水平上将充满其父容器(计入父容器的留白)
处理 block 级对象时,必须留意以上事项:
l 如果一个盒子的长度设置为 100%各种浏览器兼容问题,它就不能再增设 margins, padding, 和 borders,如果会撑破其父容器
l 垂直毗邻的 margin 会引起复杂的坍塌问题,使得布局问题(譬如两个垂直毗邻的 Block 对象,下面的对象的 bottom-margin 为 40,上面的对象的 top-margin 为 20,则两个对象的宽度将是 40,而不是 60 - 译者)
l 拥有相对位置和绝对位置的对象,拥有不同的行为
在 Firefox 的 Firebug 中表明的箱子模型
2. 理解 block 级和 inline 级 对象的差异
这个看似简单的难题事或者能通透地理解,会受益匪浅。
下图讲解了 block 级对象和 inline 级对象的差异:
上面是 block 级对象和 inline 级对象的完全差别:
l Block 级对象会自然地水平充满其父容器,所以没有必要为之设置 100% 宽度属性
l Block 级对象的起始摆放位置是其父容器的左上边界,并顺排在其后面的哥哥 Block 对象的下方(如果设置 float 或绝对位置)
l Inline 级对象会忽视其长度和高度设置
l Inline 级对象会随着文字排版,并受排版属性的影响(如 white-space, font-size, letter-spacing)
l Inline 级对象可以使用 vertical-align 属性控制其垂直对齐,block 级对象不可以
l Inline 级对象的下方会保存一些自然的空间,以适应字母 g 一类的会向下探出的字体
l 一个设置为 float 的 inline 对象将成为 block 对象
3. 理解 Floating 和 Clearing 属性
实现多栏排版的最好方法是应用 float 属性,float 也是一个将使你受益匪浅的特性。一个 float 对象可以居左或居右,一个设置为 float 的对象,将按照设置的方向,左移或右移到其父容器的界限,或其后面的 float 对象的界限,而紧跟其后的非 float 对象或内容,则包围在其相反的方向。
以上是应用 float 和 clear 属性的一些重要原则:
l 一个 float 对象,将从其置身的 block 级非 float 内容流中跳出,换句话说,所以你要将一个 box 向右边 float,它前面的 block 级非 float 对象会表明到下方,inline 级内容会在旁边包围
l 要让一段内容从左侧包围一个 float 对象,这段内容必须要么是 inline 级的,要么也增设为相似方向的 float
l 一个 float 对象,所以没有设置长度,则会自动缩成其包括的内容的长度,所以最好为 float 对象明确设置长度
l 如果一个 block 对象包括 float 子对象,会出现本文中阐述的难题。
l 一个设置了 clear 属性的对象,将不会包围其后面的 float 对象
l 一个既设置了 clear 又增设了 float 属性的对象,只有 clear:left 属性生效,clear:right 不起作用
4. 首先使用 IE 进行检测

但是我们都痛恨 IE6 和 IE7,但当你开始一个新项目的时候,最好还是其次针对这两种浏览器进行检测,如果,所以你在设计在前期才想到针对 IE6 和 IE7 进行检测,将出现以上问题:
l 你将不得不使用一些奇巧淫技,甚至使用独立的 IE6/7 CSS,使得 CSS 文件臃肿。
l 某些地方的布局将不得不重新设计
l 会降低测试的时间
l 你的布局在 IE/6/7 中和其他浏览器中不一样
在 IE6/7 仍有较多用户基础的海外(谢谢中行,建行,农行,工行,还有各级政府官网),忽略这两种浏览器是极不明智的,其次针对 IE6/7 进行设计是一种很好的方式,一般来说,在IE6/7 通过测试的线路,在 Firefox,Chrome,Safari,Opera 等标准浏览器面前基本不会出现难题各种浏览器兼容问题,前提是,你的 CSS 设计是基于 W3C 标准的。
5. IE 浏览器最常用的难题
l IE6 中不可滥用 float,如果会带给内容消失还有文字重复等稀奇古怪的难题
l IE6 中,float 对象,在 float 方向的那里,会出现双倍 margin,将 display 设置为 inline 会解决这个难题
l IE6/7 中,一个没有直接或间接设置 hasLayout 的对象,会发生这些稀奇古怪的难题(译者注:对这类问题,zoom 这个 css 属性可以帮多大的忙,将 zoom 设置为除了 normal 之外的其他值,可以被迫一个对象 hasLayout 同时不影响这个对象的任何视觉外观)
l IE6 不支持 min-width, max-width, min-height, max-height 一类的特性
l IE6 不支持固定位置背景图
l IE6/7 不支持众多 display 属性值(如 inline-table, table-cell, table-row)
l IE6 中,只有 a 这个对象才可以使用 :hover 这个伪类
l IE 的那些版本对这些 CSS 选择器支持很少(如属性选择器,子对象选择器)
l IE6~8 对 CSS3 的支持很有限 (不过有一些变通办法)
6. 永远不要指望在一切浏览器中都一模一样
在不同浏览器实现相同的感受个系统是应该的,实现近似像素级的一致外观作为应该的,但始终不要指望一模一样。
Form 控件在不同浏览器显示总是不同
以上是 Facebook 首页中的 select 控件,在5种不同浏览器的显示差异
这些 Form 控件,所以要求必须跨浏览器一致,可以寻找变通方法,如,可以使用网络 替代 submit 按钮,但有一些控件,譬如 radio,select, textarea,文档选择框,是始终都不应该一模一样的。
7. 字体的表现都有区别
先不谈有的笔画在有的功能中根本不存在,即时存在,这些在不同系统的渲染作用也不完全一样,譬如,Windows ClearType 支持 IE7,但不支持 IE6,使得同一个字体在 IE7 和 IE6 有不同的模样。
字体在 IE6 and IE7 中的差异
8. 使用 CSS 清零
使用 CSS 清零(CSS Reset)是实现跨浏览器兼容的灵丹妙药,CSS 清零可以去除不同浏览器对 margin,padding 这些特性的默认表现,你可以更容易控制诸如对齐,空隙等等问题。推荐使用 Eric Meyer’s CSS 清零代码。
9. 参考 SitePoint’s CSS 兼容表
SitePoint CSS Reference 是一个非常好的资源(下载离线版),可以用于检查这些 CSS 属性的跨浏览器兼容问题
10. 结语
跨浏览器兼容是个不朽的话题,本文介绍的跨浏览器兼容 CSS 准则只是帮助 Web 开发设计者尽可能实现这一目标,除了那些,基于 CSS3 的渐进式增强设计应该一种趋势,Web 开发与设计者可以针对这些浏览器提供提升系统,而在不支持各种提高系统的浏览器中降级使用完全系统。
附录2:浏览器CSS选择器兼容性
注:
l 绿色 / √ 表示当前支持。
l 橙色 / Δ 表示浏览器部分支持目前CSS选择器。
l 红色 / Χ 表示浏览器完全不支持。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-118630-1.html
赔一件就行
各路黑