网页设计-[ie与firefox的css兼容问题整理!]
2008-11-17 12:04
639 查看
以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox
1.doctype 影响 css 处理
2.ff: div 设置 margin-left, margin-right 为 auto 时已经居中, ie 不行
3.ff: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中
4.ff: 设置 padding 后, div 会增加 height 和 width, 但 ie 不会, 故需要用 !important 多设一个 height 和 width
5.ff: 支持 !important, ie 则忽略, 可用 !important 为 ff 特别设置样式,值得注意的是,一定要将xxxx !important 这句放置在另一句之上
6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个div一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行
7.cursor: pointer 可以同时在 ie ff 中显示游标手指状, hand 仅 ie 可以
8.ff: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。
9.在firefox和ie中的box模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;}
注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性ie不能识别,但别的浏览器可以识别。所以在ie下其实解释成这样:div{maring:30px;margin:28px}
重复定义的话按照最后一个来执行,所以不可以只写margin:xxpx!important;
10.ie5 和ie6的box解释不一致
ie5下div{width:300px;margin:0 10px 0 10px;}
div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在ie6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}
关于这个/**/是什么我也不太明白,只知道ie5和firefox都支持但ie6不支持,如果有人理解的话,请告诉我一声,谢了!:)
11.ul标签在mozilla中默认是有padding值的,而在ie中只有margin有值所以先定义ul{margin:0;padding:0;}就能解决大部分问题。
常见兼容问题2:
ie box-model这个臭名昭著的bug存在于ie6/win以前的每一只版本,这个虫子直到tantak发布了流传最为广泛的那个hack才开始被驯服
http://www.tantek.com/css/examples/boxmodelhack.html
ie5.x/win对box-model的解析是一样的,他们认为width包括了边框(border)和补白(padding),幸运的是这个情况在ie6中有了好转,但是ie6在向后兼容的同时也包容了以前的错误,ie6其实有两个核心,在旧的页面前他仍旧表现出对错误的宽容,只有在文档中严格地加上文档类型(doctype)声明,ie6才能够接受正确的box-model
所以,tantak的hack必须和正确的doctype同时包含在文档中才能够正常工作
div.content {
width:400px; //这个是错误的width,所有浏览器都读到了
voice-family: “\”}\””; //ie5.x/win忽略了”\”}\””后的内容
voice-family:inherit;
width:300px; //包括ie6/win在内的部分浏览器读到这句,新的数值(300px)覆盖掉了旧的
}
html>body .content { //html>body是css2的写法
width:300px; //支持css2该写法的浏览器有幸读到了这一句
}
现在回到主题,我们经常看到!important和(空格)/**/:组合在一起使用,这个写法有什么奥妙呢?
看刚才那个写法,我这里可以提供另一种写法也能达到这样的效果
div.content {
width:300px !important; //这个是正确的width,大部分支持!important标记的浏览器使用这里的数值
width(空格)/**/:400px; //ie6/win不解析这句,所以ie6/win仍然认为width的值是300px;而ie5.x/win读到这句,新的数值(400px)覆盖掉了旧的,因为!important标记对他们不起作用
}
html>body .content { //html>body是css2的写法
width:300px; //支持css2该写法的浏览器有幸读到了这一句
}
同样,这个方法仍必须依靠正确的文档类型声明才能够正常工作,原因在前面已经说过。
文档类型声明就像一个开关,打开向后兼容的未来,而错误使用的话,就是一个pandora box
注意事项:
1、float的div一定要闭合。
例如:(其中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;}
2、margin加倍的问题。
设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
解决方案是在这个div里面加上display:inline;
例如:
< #div id=”imfloat”>
相应的css为
#iamfloat{
float:left;
margin:5px;/*ie下理解为10px*/
display:inline;/*ie下再理解为5px*/}
3、关于容器的包涵关系
很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在ie中,外层的宽度会被内层更宽的div挤破。一定要用photoshop或者firework量取像素级的精度。
4、关于高度的问题
如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)
5、最狠的手段 - !important;
如果实在没有办法解决一些细节问题,可以用这个方法.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 这句放置在另一句之上,上面已经提过。
其他:
注:ie都能识别*;标准浏览器(如firefox,opera,netscape)不能识别*;ie6能识别*,但不能识别 !important,ie7能识别*,也能识别!important;ff不能识别*,但能识别!important;
写两句代码来控制一个属性,区别firefox与ie6:
background:orange;*background:blue;
//这一句代码写出来时,你用firefox或其它非ie浏览时,会发现,写了该代码的区域背景是橙色的,如果用ie浏览,却是蓝色的,这是因为ie都能识别*;标准浏览器(如firefox,opera,netscape)不能识别*;
写两句代码来控制一个属性,区别ie7与ie6:
background:green !important;background:blue;
//这一句代码写出来时,你用ie7浏览,会发现,写了该代码的区域背景是绿色的,如果用ie6浏览,却是蓝色的,这是因为ie7能识别!important*,一但识别了,就执行,忽略了后面的那一句,但ie6却不能识别!important,所以前面部分跳过,直接执行了后半部份。
写两句代码来控制一个属性,区别firefox与ie:
background:orange; *background:green;
//这一句代码写出来时,你用firefox浏览,会发现背景是橙色的,而ie里却是绿色的,很简单,因为firefox不能识别*,而ie6,ie7都可以识*
写三句代码来控制一个属性,区别firefox,ie7,ie6:
background:orange;*background:green !important;*background:blue;
//这一句会使在firefox在,背景呈橙色,ie7中为绿色,ie6中为蓝色,道理和前面一样,firefox不能识别*,所以后面两句都不执行,直接执行第一句,ie7当然也能执行第一行代码,但是因为第二句,他也能识别,所以就执行了第二句代码,把前面的效果给过滤了,而最后一句,ie7是不能识别的。ie6不能识别!imprtant,本来运行了第一句代码了,第二句不能识别,那就理所当然的执行了最后一句。
以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox
1. document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 MF 下运行
(2)解决方法:
改用 document.formName.elements["elementName"]
(3)其它
参见 2
2. 集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms("formName") 改为 document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]
(3)其它
3. window.event
(1)现有问题:
使用 window.event 无法在 MF 上运行
(2)解决方法:
MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
原代码(可在IE中运行):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>
新代码(可在IE和MF中运行):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
...
<script language="javascript">
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);
...
alert(evt); // use evt
...
}
</script>
此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。
4. HTML 对象的 id 作为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
(2)解决方法
用 getElementById("idName") 代替 idName 作为对象变量使用。
5. 用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。
6. 变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
(3)其它
参见 问题4
7. event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,MF中没有。
(2)解决方法
在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。
如果要完全一样,可以稍麻烦些:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
(3)其它
event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。
8. 关于frame
(1)现有问题
在 IE中 可以用window.testFrame取得该frame,mf中不行
(2)解决方法
在frame的使用方面mf和ie的最主要的区别是:
如果在frame标签中书写了以下属性:
<frame src="xx.htm" id="frameId" name="frameName" />
那么ie可以通过id或者name访问这个frame对应的window对象
而mf只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
mf: 只能这样window.top.frameName来访问这个window对象
另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签
并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容
关于frame和window的描述可以参见bbs的‘window与frame’文章
以及/test/js/test_frame/目录下面的测试
9. 在mf中,自己定义的属性必须getAttribute()取得
10.在mf中没有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和MF对parentNode的解释不同,例如
<form>
<table>
<input/>
</table>
</form>
MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点
MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)
11.const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。
12. body 对象
MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在
13. url encoding
在js中如果书写url就直接写&不要写&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般MF无法识别js中的&
14. nodeName 和 tagName 问题
(1)现有问题:
在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
有问题(具体情况没有测试,但我的IE已经死了好几次)。
(2)解决方法:
使用 tagName,但应检测其是否为空。
15. 元素属性
IE下 input.type属性为只读,但是MF下可以修改
16. document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。
1.doctype 影响 css 处理
2.ff: div 设置 margin-left, margin-right 为 auto 时已经居中, ie 不行
3.ff: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中
4.ff: 设置 padding 后, div 会增加 height 和 width, 但 ie 不会, 故需要用 !important 多设一个 height 和 width
5.ff: 支持 !important, ie 则忽略, 可用 !important 为 ff 特别设置样式,值得注意的是,一定要将xxxx !important 这句放置在另一句之上
6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个div一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行
7.cursor: pointer 可以同时在 ie ff 中显示游标手指状, hand 仅 ie 可以
8.ff: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。
9.在firefox和ie中的box模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;}
注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性ie不能识别,但别的浏览器可以识别。所以在ie下其实解释成这样:div{maring:30px;margin:28px}
重复定义的话按照最后一个来执行,所以不可以只写margin:xxpx!important;
10.ie5 和ie6的box解释不一致
ie5下div{width:300px;margin:0 10px 0 10px;}
div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在ie6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}
关于这个/**/是什么我也不太明白,只知道ie5和firefox都支持但ie6不支持,如果有人理解的话,请告诉我一声,谢了!:)
11.ul标签在mozilla中默认是有padding值的,而在ie中只有margin有值所以先定义ul{margin:0;padding:0;}就能解决大部分问题。
常见兼容问题2:
ie box-model这个臭名昭著的bug存在于ie6/win以前的每一只版本,这个虫子直到tantak发布了流传最为广泛的那个hack才开始被驯服
http://www.tantek.com/css/examples/boxmodelhack.html
ie5.x/win对box-model的解析是一样的,他们认为width包括了边框(border)和补白(padding),幸运的是这个情况在ie6中有了好转,但是ie6在向后兼容的同时也包容了以前的错误,ie6其实有两个核心,在旧的页面前他仍旧表现出对错误的宽容,只有在文档中严格地加上文档类型(doctype)声明,ie6才能够接受正确的box-model
所以,tantak的hack必须和正确的doctype同时包含在文档中才能够正常工作
div.content {
width:400px; //这个是错误的width,所有浏览器都读到了
voice-family: “\”}\””; //ie5.x/win忽略了”\”}\””后的内容
voice-family:inherit;
width:300px; //包括ie6/win在内的部分浏览器读到这句,新的数值(300px)覆盖掉了旧的
}
html>body .content { //html>body是css2的写法
width:300px; //支持css2该写法的浏览器有幸读到了这一句
}
现在回到主题,我们经常看到!important和(空格)/**/:组合在一起使用,这个写法有什么奥妙呢?
看刚才那个写法,我这里可以提供另一种写法也能达到这样的效果
div.content {
width:300px !important; //这个是正确的width,大部分支持!important标记的浏览器使用这里的数值
width(空格)/**/:400px; //ie6/win不解析这句,所以ie6/win仍然认为width的值是300px;而ie5.x/win读到这句,新的数值(400px)覆盖掉了旧的,因为!important标记对他们不起作用
}
html>body .content { //html>body是css2的写法
width:300px; //支持css2该写法的浏览器有幸读到了这一句
}
同样,这个方法仍必须依靠正确的文档类型声明才能够正常工作,原因在前面已经说过。
文档类型声明就像一个开关,打开向后兼容的未来,而错误使用的话,就是一个pandora box
注意事项:
1、float的div一定要闭合。
例如:(其中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;}
2、margin加倍的问题。
设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
解决方案是在这个div里面加上display:inline;
例如:
< #div id=”imfloat”>
相应的css为
#iamfloat{
float:left;
margin:5px;/*ie下理解为10px*/
display:inline;/*ie下再理解为5px*/}
3、关于容器的包涵关系
很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在ie中,外层的宽度会被内层更宽的div挤破。一定要用photoshop或者firework量取像素级的精度。
4、关于高度的问题
如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)
5、最狠的手段 - !important;
如果实在没有办法解决一些细节问题,可以用这个方法.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 这句放置在另一句之上,上面已经提过。
其他:
注:ie都能识别*;标准浏览器(如firefox,opera,netscape)不能识别*;ie6能识别*,但不能识别 !important,ie7能识别*,也能识别!important;ff不能识别*,但能识别!important;
写两句代码来控制一个属性,区别firefox与ie6:
background:orange;*background:blue;
//这一句代码写出来时,你用firefox或其它非ie浏览时,会发现,写了该代码的区域背景是橙色的,如果用ie浏览,却是蓝色的,这是因为ie都能识别*;标准浏览器(如firefox,opera,netscape)不能识别*;
写两句代码来控制一个属性,区别ie7与ie6:
background:green !important;background:blue;
//这一句代码写出来时,你用ie7浏览,会发现,写了该代码的区域背景是绿色的,如果用ie6浏览,却是蓝色的,这是因为ie7能识别!important*,一但识别了,就执行,忽略了后面的那一句,但ie6却不能识别!important,所以前面部分跳过,直接执行了后半部份。
写两句代码来控制一个属性,区别firefox与ie:
background:orange; *background:green;
//这一句代码写出来时,你用firefox浏览,会发现背景是橙色的,而ie里却是绿色的,很简单,因为firefox不能识别*,而ie6,ie7都可以识*
写三句代码来控制一个属性,区别firefox,ie7,ie6:
background:orange;*background:green !important;*background:blue;
//这一句会使在firefox在,背景呈橙色,ie7中为绿色,ie6中为蓝色,道理和前面一样,firefox不能识别*,所以后面两句都不执行,直接执行第一句,ie7当然也能执行第一行代码,但是因为第二句,他也能识别,所以就执行了第二句代码,把前面的效果给过滤了,而最后一句,ie7是不能识别的。ie6不能识别!imprtant,本来运行了第一句代码了,第二句不能识别,那就理所当然的执行了最后一句。
以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox
1. document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 MF 下运行
(2)解决方法:
改用 document.formName.elements["elementName"]
(3)其它
参见 2
2. 集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms("formName") 改为 document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]
(3)其它
3. window.event
(1)现有问题:
使用 window.event 无法在 MF 上运行
(2)解决方法:
MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
原代码(可在IE中运行):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>
新代码(可在IE和MF中运行):
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
...
<script language="javascript">
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);
...
alert(evt); // use evt
...
}
</script>
此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。
4. HTML 对象的 id 作为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
(2)解决方法
用 getElementById("idName") 代替 idName 作为对象变量使用。
5. 用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。
6. 变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
(3)其它
参见 问题4
7. event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,MF中没有。
(2)解决方法
在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。
如果要完全一样,可以稍麻烦些:
mX = event.x ? event.x : event.pageX;
然后用 mX 代替 event.x
(3)其它
event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。
8. 关于frame
(1)现有问题
在 IE中 可以用window.testFrame取得该frame,mf中不行
(2)解决方法
在frame的使用方面mf和ie的最主要的区别是:
如果在frame标签中书写了以下属性:
<frame src="xx.htm" id="frameId" name="frameName" />
那么ie可以通过id或者name访问这个frame对应的window对象
而mf只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
mf: 只能这样window.top.frameName来访问这个window对象
另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签
并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容
也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容
关于frame和window的描述可以参见bbs的‘window与frame’文章
以及/test/js/test_frame/目录下面的测试
9. 在mf中,自己定义的属性必须getAttribute()取得
10.在mf中没有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和MF对parentNode的解释不同,例如
<form>
<table>
<input/>
</table>
</form>
MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点
MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)
11.const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。
12. body 对象
MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在
13. url encoding
在js中如果书写url就直接写&不要写&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般MF无法识别js中的&
14. nodeName 和 tagName 问题
(1)现有问题:
在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
有问题(具体情况没有测试,但我的IE已经死了好几次)。
(2)解决方法:
使用 tagName,但应检测其是否为空。
15. 元素属性
IE下 input.type属性为只读,但是MF下可以修改
16. document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。
相关文章推荐
- IE与Firefox的CSS兼容问题整理
- CSS浏览器兼容问题整理(IE6.0、IE7.0+ 与 FireFox)(一)
- IE与Firefox的CSS兼容问题整理
- DIV+CSS网页中IE和火狐兼容问题的整理
- 如何在网页设计IE与Firefox的CSS兼容?
- CSS浏览器兼容问题整理(IE6.0、IE7.0+ 与 FireFox)(二)
- CSS 设计中firefox IE Chrome兼容问题
- CSS浏览器兼容问题整理(IE6.0、IE7.0+ 与 FireFox)(三)
- IE与Firefox的CSS兼容问题整理
- IE与Firefox的CSS兼容问题整理(转)
- CSS浏览器兼容问题整理(IE6.0、IE7.0+ 与 FireFox)(四)
- DIV+CSS网页中IE和火狐兼容问题的整理
- IE与Firefox的CSS兼容问题整理
- IE与Firefox的CSS兼容问题整理
- IE与Firefox的CSS兼容问题整理
- IE与Firefox的CSS兼容问题整理
- IE bug,IE与Firefox的CSS兼容问题.....整理
- IE、Firefox对CSS处理或兼容问题整理
- IE与Firefox的CSS兼容问题整理
- CSS浏览器兼容问题整理(IE6.0、IE7.0+ 与 FireFox)