您的位置:首页 > 其它

IE与FireFox的兼容问题

2008-10-16 11:15 204 查看
第一部分:[/b]JavaScript[/b]的异同[/b][/b]
1. [/b]document.formName.item(“itemName”)[/b]问题[/b][/b]
问题说明:IE下,可以使用 document.formName.item("itemName") 或 document.formName.elements ["elementName"];Firefox下,只能使用document.formName.elements["elementName"]。
解决方法:统一使用document.formName.elements["elementName"]。
2. [/b]集合类对象问题[/b][/b]
问题说明:IE下,可以使用 () 或 [] 获取集合类对象;Firefox下,只能使用 [ ]获取集合类对象。
解决方法:统一使用 [] 获取集合类对象。
3. [/b]自定义属性问题[/b][/b]
问题说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用 getAttribute() 获取自定义属性;Firefox下,只能使用 getAttribute() 获取自定义属性。
解决方法:统一通过 getAttribute() 获取自定义属性。
4. [/b]eval("idName")[/b]问题[/b][/b]
问题说明:IE下,可以使用 eval("idName") 或 getElementById("idName") 来取得 id 为 idName 的HTML对象;Firefox下,只能使用 getElementById("idName") 来取得 id 为 idName 的HTML对象。
解决方法:统一用 getElementById("idName") 来取得 id 为 idName 的HTML对象。[/b]
5. [/b]变量名与某[/b]HTML[/b]对象[/b]ID[/b]相同的问题[/b][/b]
问题说明:IE下,HTML对象的ID可以作为 document 的下属对象变量名直接使用,Firefox下则不能;Firefox下,可以使用与HTML对象ID相同的变量名,IE下则不能。
解决方法:使用 document.getElementById("idName") 代替 document.idName。最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var关键字,以避免歧义。[/b]
6. [/b]const[/b]问题[/b][/b]
问题说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量。
解决方法:统一使用var关键字来定义常量。[/b]
7. [/b]input.type[/b]属性问题[/b][/b]
问题说明:IE下 input.type 属性为只读;但是Firefox下 input.type 属性为读写。
解决办法:不修改 input.type 属性。如果必须要修改,可以先隐藏原来的input,然后在同样的位置再插入一个新的input元素。[/b]
8. [/b]window.event[/b]问题[/b][/b]
问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用。
解决方法:在事件发生的函数上加上event参数,在函数体内(假设形参为evt)使用 var myEvent = evt?evt:(window.event?window.event:null)
示例:<input type="button" onclick="doSomething(event)"/>
  <script language="javascript">
  function doSomething(evt) {
  var myEvent = evt?evt:(window.event?window.event:null)
  ...
  }[/b]
9. [/b]event.x[/b]与[/b]event.y[/b]问题[/b][/b]
问题说明:IE下,even对象有x、y属性,但是没有pageX、pageY属性;Firefox下,even对象有pageX、pageY属性,但是没有x、y属性。
解决方法:var myX = event.x ? event.x : event.pageX; var myY = event.y ? event.y:event.pageY; 如果考虑第8条问题,就改用myEvent代替event即可。[/b]
10. [/b]event.srcElement[/b]问题[/b][/b]
问题说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性。
解决方法:使用srcObj = event.srcElement ? event.srcElement : event.target;如果考虑第8条问题,就改用myEvent代替event即可。
11. [/b]window.location.href[/b]问题[/b][/b]
问题说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location。
解决方法:使用 window.location 来代替 window.location.href。当然也可以考虑使用 location.replace()方法。
12. [/b]模态和非模态窗口问题[/b][/b]
问题说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能。
解决方法:直接使用 window.open(pageURL,name,parameters) 方式打开新窗口。如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口。如果需要父窗口控制子窗口的话,使用var subWindow = window.open(pageURL,name,parameters); 来获得新开的窗口对象。[/b]
13. [/b]frame[/b]和[/b]iframe[/b]问题[/b][/b]
以下面的frame为例:
  <frame src="xxx.html" id="frameId" name="frameName" />
(1)访问frame对象
IE:使用window.frameId或者window.frameName来访问这个frame对象;
Firefox:使用window.frameName来访问这个frame对象;
解决方法:统一使用 window.document.getElementById("frameId") 来访问这个frame对象;
(2)切换frame内容
在IE和Firefox中都可以使用window.document.getElementById("frameId").src = "xxx.html"或window.frameName.location = "xxx.html"来切换frame的内容;如果需要将frame中的参数传回父窗口,可以在frame中使用parent关键字来访问父窗口。
14. [/b]body[/b]载入问题[/b][/b]
问题说明:Firefox的body对象在body标签没有被浏览器完全读入之前就存在;而IE的body对象则必须在body标签被浏览器完全读入之后才存在。
[注] 这个问题尚未实际验证,待验证后再来修改。
[注] 经验证,IE6、Opera9以及FireFox2中不存在上述问题,单纯的JS脚本可以访问在脚本之前已经载入的所有对象和元素,即使这个元素还没有载入完成。[/b]
15. [/b]事件委托方法[/b][/b]
问题说明:IE下,使用 document.body.onload = inject; 其中function inject()在这之前已被实现;在Firefox下,使用 document.body.onload = inject();
解决方法:统一使用 document.body.onload=new Function('inject()'); 或者 document.body.onload = function(){/* 这里是代码 */}
[注意] Function和function的区别[/b]
16. [/b]访问的父元素的区别[/b][/b]
问题说明:在IE下,使用 obj.parentElement 或 obj.parentNode 访问obj的父结点;在firefox下,使用 obj.parentNode 访问obj的父结点。
解决方法:因为firefox与IE都支持DOM,因此统一使用obj.parentNode 来访问obj的父结点。[/b]
17. [/b]innerText[/b]的问题[/b].[/b]
问题说明:innerText在IE中能正常工作,但是innerText在FireFox中却不行。
解决方法:在非IE浏览器中使用textContent代替innerText。
示例:
  if(navigator.appName.indexOf("Explorer") >-1){
  document.getElementById('element').innerText = "my text";
  } else{
  document.getElementById('element').textContent = "my text";
  }
[注] innerHTML 同时被ie、firefox等浏览器支持,其他的,如outerHTML等只被ie支持,最好不用。 [/b]
18. [/b]对象宽高赋值问题[/b][/b]
问题说明:FireFox中类似 obj.style.height = imgObj.height 的语句无效。
解决方法:统一使用 obj.style.height = imgObj.height + 'px';[/b]
19. [/b]Table[/b]操作问题[/b][/b]
问题说明:ie、firefox以及其它浏览器对于 table 标签的操作都各不相同,在ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChild方法也不管用。
  解决方法:
  //向table追加一个空行:
  var row = otable.insertRow(-1);
  var cell = document.createElement("td");
  cell.innerHTML = "";
  cell.className = "XXXX";
  row.appendChild(cell);
[注] 由于俺很少使用JS直接操作表格,这个问题没有遇见过。建议使用JS框架集来操作table,如JQuery。

第二部分:[/b]CSS[/b]的异同[/b][/b]
1. [/b]cursor:hand VS cursor:pointer[/b][/b]
问题说明:firefox不支持hand,但ie支持pointer ,两者都是手形指示。
解决方法:统一使用pointer。[/b]
2. [/b]ul[/b]和[/b]ol[/b]列表缩进问题[/b][/b]
消除ul、ol等列表的缩进时,样式应写成:list-style:none;margin:0px;padding:0px; 其中margin属性对IE有效,padding属性对FireFox有效。
[注] 这个问题尚未实际验证,待验证后再来修改。
[注] 经验证,在IE中,设置margin:0px可以去除列表的上下左右缩进、空白以及列表编号或圆点,设置padding对样式没有影响;在Firefox中,设置margin:0px仅仅可以去除上下的空白,设置padding:0px后仅仅可以去掉左右缩进,还必须设置list-style:none才能去除列表编号或圆点。也就是说,在IE中仅仅设置margin:0px即可达到最终效果,而在Firefox中必须同时设置margin:0px、padding:0px以及list-style:none三项才能达到最终效果。[/b]
3. [/b]CSS[/b]透明问题[/b][/b]
IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。
FF:opacity:0.6。
[注] 最好两个都写,并将opacity属性放在下面。[/b]
4. [/b]CSS[/b]圆角问题[/b][/b]
IE:ie7以下版本不支持圆角。
FF:-moz-border-radius:4px,或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius- bottomright:4px;。
[注] 圆角问题是CSS中的经典问题,建议使用JQuery框架集来设置圆角,让这些复杂的问题留给别人去想吧。
5. [/b]DOCTYPE [/b]影响[/b] CSS [/b]处理[/b][/b]
6. [/b]FF: div [/b]设置[/b] margin-left, margin-right [/b]为[/b] auto [/b]时已经居中[/b], IE [/b]不行[/b][/b]
7. [/b]FF: [/b]设置[/b] padding [/b]后[/b], div [/b]会增加[/b] height [/b]和[/b] width, [/b]但[/b] IE [/b]不会[/b], [/b]故需要用[/b] !important [/b]多设一个[/b] height [/b]和[/b] width[/b]
8. [/b]FF: [/b]支持[/b] !important, IE [/b]则忽略[/b], [/b]可用[/b] !important [/b]为[/b] FF [/b]特别设置样式,值得注意的是,一定要将[/b]xxxx !important [/b]这句放置在另一句之上[/b][/b]
9. [/b]div [/b]的垂直居中问题[/b]: vertical-align:middle; [/b]将行距增加到和整个[/b]DIV[/b]一样高[/b] line-height:200px; [/b]然后插入文字,就垂直居中了。缺点是要控制内容不要换行[/b][/b]
10. [/b]FF: [/b]链接加边框和背景色,需设置[/b] display: block, [/b]同时设置[/b] float: left [/b]保证不换行。参照[/b] menubar, [/b]给[/b] a [/b]和[/b] menubar [/b]设置高度是为了避免底边显示错位[/b], [/b]若不设[/b] height, [/b]可以在[/b] menubar [/b]中插入一个空格。[/b][/b]
11. [/b]在[/b]mozilla firefox[/b]和[/b]IE[/b]中的[/b]BOX[/b]模型解释不一致导致相差[/b]2px[/b]解决方法:[/b]div{margin:30px!important;margin:28px;}[/b]
12. [/b]  注意这两个[/b]margin[/b]的顺序一定不能写反,据阿捷的说法[/b]!important[/b]这个属性[/b]IE[/b]不能识别,但别的浏览器可以识别。所以在[/b]IE[/b]下其实解释成这样:[/b]div{maring:30px;margin:28px} [/b]重复定义的话按照最后一个来执行,所以不可以只写[/b]margin:XXpx!important;[/b]
13. [/b]IE5 [/b]和[/b]IE6[/b]的[/b]BOX[/b]解释不一致[/b] IE5[/b]下[/b]div{width:300px;margin:0 10px 0 10px;}div[/b]的宽度会被解释为[/b]300px-10px([/b]右填充[/b])-10px([/b]左填充[/b])[/b]最终[/b]div[/b]的宽度为[/b]280px[/b],而在[/b]IE6[/b]和其他浏览器上宽度则是以[/b]300px+10px([/b]右填充[/b])+10px([/b]左填充[/b])=320px[/b]来计算的。这时我们可以做如下修改[/b]div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}[/b] 关于这个[/b]/**/[/b]是什么我也不太明白,只知道[/b]IE5[/b]和[/b]firefox[/b]都支持但[/b]IE6[/b]不支持[/b][/b]
14. [/b]ul[/b]标签在[/b]Mozilla[/b]中默认是有[/b]padding[/b]值的[/b],[/b]而在[/b]IE[/b]中只有[/b]margin[/b]有值所以先定义[/b]ul{margin:0;padding:0;}[/b]
[/b]
[/b]
CSS[/b]中的注意事项[/b][/b]
1. [/b]float[/b]的[/b]div[/b]一定要闭合。[/b][/b]
例如:(其中floatA、floatB的属性已经设置为float:left;)<#div id=/"floatA/" >
<#div id=/"floatB/" >
<#div id=/"NOTfloatC/" >
  这里的NOTfloatC并不希望继续平移,而是希望往下排。
  这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
  在<#div class=/"floatB/">
<#div class=/"NOTfloatC/">
  之间加上<#div class=/"clear/">
  这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
  并且将clear这种样式定义为为如下即可:.clear{
clear:both;}
  此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
  当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
  例如某一个wrapper如下定义:.colwrapper{
overflow:hidden;
zoom:1;
margin:5px auto;}[/b]
2. [/b]margin[/b]加倍的问题。[/b][/b]
设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
  解决方案是在这个div里面加上display:inline;
例如:
<#div id=/"imfloat/">
  相应的css为
#IamFloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/} [/b]
3. [/b]关于容器的包涵关系[/b][/b]
很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。
4. [/b]关于高度的问题[/b][/b]
如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)
5. [/b]最狠的手段[/b] - !important;[/b]
如果实在没有办法解决一些细节问题,可以用这个方法.FF对于"!important"会自动优先解析,然而IE则会忽略.如下.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}
值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过

CSS IE7 IE6 Firefox[/b]多浏览器兼容著名的星号[/b][/b]
对于[/b]CSS[/b]当中让[/b]IE7[/b]、[/b]IE6[/b]、[/b]Firefox[/b]兼容最著名且最有用的[/b]CSS[/b]过滤器之一是星号[/b] * Html HACK[/b]。这个过滤器非常容易记住,它可以制定[/b]IE6[/b]和更低版本。正如你知道的,[/b]Html [/b]元素被认为是网页上的第一个元素,即根元素。但是,[/b]IE [/b]的所有当前版本有一个匿名的根元素,它包围着[/b]Html [/b]元素。那么这个匿名的元素或者说隐藏的元素到底是什么元素呢?其实它就是鼎鼎大名的[/b]* [/b]号,所以我们可以用星号来指定的规则应用于那些被星号包围的[/b] HTML[/b]。[/b][/b]
IE6[/b]以及更老的[/b]IE5.5[/b]
* html {[/b]
font-size:small;[/b]
}[/b]
在任何非[/b]ie[/b]的浏览器因为没有这个规则([/b]Html[/b]元素被[/b]*[/b]号包围),所以其他的浏览器就会当作看不见,所以当你指定这个规则的时候,你可以放心的应用在[/b]IE6[/b]以及前一版本的[/b]IE5.5[/b]要展示效果中。[/b]IE 7 [/b]并没有完全去掉这个[/b] Hack[/b]。而是用这样的办法来让过滤,那就是用[/b] *+[/b]
IE7[/b]
*+html {[/b]
font-size:small[/b]
}[/b]
这样的表达,就是说除了[/b]IE7[/b]能认识这个[/b]font-size:small[/b]以外,其他的浏览器都不会看到这一条的,可以说这是[/b]IE7[/b]的专属[/b]Hack[/b]。[/b][/b]
这样的方式可以写在同一个[/b]CSS[/b]文件,并且同时都会针对不同的浏览器产生独特的效果。所以在设计页面或者样式的时候,你不妨用[/b]FireFox [/b]来做第一浏览器,对照[/b]Firefox[/b]样式写好后,再把页面放到[/b]IE7[/b]下看看,进行适当的调整,再放到[/b]IE6[/b]下面看看,进行适当的调整。基本上按照[/b]<div><ul><li></li></ul></ul>[/b]的顺序嵌套的话,[/b]IE6[/b]根[/b]IE7[/b]的规则是差不多的。调好了[/b]IE6[/b]的样式就等于调好了[/b]IE7[/b]的样式,反之亦然。再者,用[/b]Firefox[/b]来写样式还是更符合[/b]W3C[/b]一些,因为[/b]IE6[/b]和[/b]IE7[/b]要考虑到以前的兼容性,不得不在规范上做些让步,达到兼容的目的。虽然大家都很憎恶为什么多一个[/b]Firefox[/b],但是这是没办法的[/b]:([/b]。你要掌控它而不是被它掌控了[/b]^_^[/b]。[/b][/b]
基本上用星号搭配搞定[/b]IE6[/b],[/b]IE7[/b],[/b]Firefox[/b]以后,像[/b]Opera[/b]之类的浏览器也会正常显示的。就不用单独考虑他们的兼容问题了。[/b][/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: