您的位置:首页 > Web前端 > JavaScript

IE和FIREFOX在解析JS方面的区别

2010-07-05 16:24 585 查看
1. 对象问题

1.1 Form对象

现有问题:

现有代码这获得form对象通过forms("formName"),这样使用在IE 能接受,MF 不能。

解决方法:

改用 作为下标运算。改为forms["formName"]

备注

上述的改用 作为下标运算中的formName是id而name

1.2 HTML对象

现有问题:

在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。

all("itemName")或者all("itemId")

解决方法:

使用对象ID作为对象变量名

getElementById("itemId")

备注

all是IE自定义的方法,所以请大家尽量不使用。

还有一种方式,在IE和MF都可以使用

var f = forms["formName "];

var o = f. itemId;

1.3 DIV对象

现有问题:

在 IE 中,DIV对象可以使用ID作为对象变量名直接使用。在 MF 中不能。

DivId.style.display = "none"

解决方法:

getElementById("DivId").style.display = "none"

备注

获得对象的方法不管是不是DIV对象,都使用getElementById方法。

1.4
IE和firefox都是支持onscroll(当元素滚动条被滚动时执行脚本)事件的, 

但是firefox中textarea对此事件不支持。

1.5
firefox支持innerHTML但却不支持innerText,它支持textContent来实现innerText,

不过默认把多余的空格也保留了。如果不用textContent,如果字符串里面不包含HTML代码也可以用innerHTML代替。

1.6.禁止选取网页内容:

在IE中一般用js:obj.onselectstart=function(){return false;}

而firefox用CSS:-moz-user-select:none

 

1.7.捕获事件:

IE:obj.setCapture() 、obj.releaseCapture()

Firefox:
document.addEventListener("mousemove",mousemovefunction,true);

document.removeEventListener("mousemove",mousemovefunction,true);

2. 总结

2.1 在JS中定义各种对象变量名时,尽量使用id,避免使用name。

在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF
中不能,所以在平常使用时请尽量使用id,避免只使用name,而不使用id。

2.2 变量名与某 HTML 对象 id 相同的问题

现有问题

在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE
中不能。

解决方法

在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。

此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。

1. all

 
Firefox可以兼容all, 但会生成一条警告。可以用getElementById("*")
或者 getElementByTagName("*)来代替

 
不过对于all.length等属性,则完全不兼容。

2. parentElement

 
这个也不兼容。比方说, obj.parentElement.name 则应改成
obj.parentNode.attributes.getNamedItem("name").node
(不知道如何写得更简洁些)

3. event

 
W3C不支持windows.event

 
比方说:

 
 
 
在IE里面

 
 
 
 
 
 
 
 
 

<div class="menu" id="menu" ="onMenuClick();
">.....</div>

 
 
 
 
 
 

onMenuClick()

 
 
 
 
 

{

 
 
 
 
 
 
 

collapseMenu(event.srcElement);

 
 
 
 
 

}

 
 
 

工作正常。不过在Firefox中,则改成:

 
 
 
 
 
 
 

<div class="menu" id="menu" ="onMenuClick(event);
">

 
 
 
 
 
 
 
 

onMenuClick(evt)

 
 
 
 
 

{

 
 
 
 
 
 
 

if(evt == null)

 
 
 
 
 
 
 
 
 
 
 
 
 

evt = event; // For IE

 
 
 
 
 
 
 
 
 

var srcElement = evt.srcElement? evt.srcElement : evt.target; //
IE使用srcElement, 而Firefox使用target

 
 
 
 
 
 
 

collapseMenu(srcElement);

}

 

IE和FIREFOX在解析CSS方面的区别

-----------------------------------------------------------------

1.对高度的解析

IE:将根据内容的高度变化,包括未定义高度的图片内容,即使定义了高度,当内容超过高度时,将使用实际高度

Firefox:没有定义高度时,如果内容中包括了图片内容,MF的高度解析是根据印刷标准,这样就会造成和实际内容高度不符合的情况;

当定义了高度,但是内容超过高度时,内容会超出定义的高度,但是区域使用的样式不会变化,造成样式错位。

解决方案:css中定义display:table; 可以自适应

 

2.宽度的区别

IE:内容宽度=您定义的容器宽度(Internet Explorer
’width’)-padding宽度-border宽度。

IE中定义 width:100px;padding:5px 的话,所显示的宽度就是100px。

FF:容器占的宽度=内容宽度+padding宽度+border宽度。

Firefox中定义 width:100px;padding:5px 的话,所显示的宽度就是105px。

建议:使用 !important;但是,!important一定要在前面。

如:width:95px !important;width:100px;padding:5px;。

解决:

可以使用在CSS样式中定义 margin:0px auto;

 
 
*margin:0px auto;

 
 
_margin:0px auto;

以此类推:其他的属性也是可以这样使用的.

3.浮动(float)的区别

(1)空格处理

IE:对于DIV并排时候使用float关键字时候,IE对块与块之间的空格是处理的。

FF:对于DIV并排时候使用float关键字时候,Firefox对块与块之间的空格是不处理的。

建议:经常发现使用float关键字时候在Firefox显示正常,但是在IE中会出现空格,就是这个原因;

避免在div连div时候添加空格或者回车,也即是一个div紧接这一个div写;

或者,将div放入li中进行处理,这样就不会有空格的问题。

(2)Margin加倍

IE:在使用float的情况下,IE的margin加倍。

FF:正常显示。

建议:针对IE,添加display:inline;

相应的css为

#float{

float:left;

margin:5px;

display:inline;

}

4.鼠标位置处理

IE:获取事件鼠标位置时,IE用的是event.x和event.y,并且值在不加单位的情况下可以直接使用,IE提供默认单位;

div.style.left = event.x

来源:(http://blog.sina.com.cn/s/blog_4fa035580100gq1a.html
)
- IE和FIREFOX在解析JS方面的区别_edwin_新浪博客

div.style.top = event.y

此时,div显示的位置为鼠标的位置。

FF:获取事件鼠标位置时,Firefox用的是MouseEvent.pageX和MouseEvent.pageY,并且在不加单位的情况下直接赋值
后,无效;必须添加单位。

div.style.left = MouseEvent.pageX

div.style.top = MouseEvent.pageY

此时,div显示的位置为0,0.

建议:都添加单位,无论针对IE或者Firefox都有效。

IE:div.style.left = event.x+'px'

div.style.top = event.y+'px'

FF:div.style.left = MouseEvent.pageX+'px'

div.style.top = MouseEvent.pageY+'px'

4.img对象alt和title的解析

alt:当照片不存在或者load错误时的提示;

title:照片的tip说明。

在IE中如果没有定义title,alt也可以作为img的tip使用,但是在MF中,两者完全按照标准中的定义使用

结论:大家在定义img对象时,最后将alt和title对象都写全,保证在各种浏览器中都能正常使用

大家看一下这个img标签。<img 
onerror =
"this.src='xxx.jpg'" 
title=''

alt="诺基亚(NOKIA)5320 GSM手机(蓝色)200万像素 支持8G存储卡
卓越的XpressMusic音乐体验"

src="xxx.jpg" name="qq"/> 

再src请求不到的时候触发onerror

5.IE6中的select有永远处在最上的bug,而且css对select不起作用。

解决办法就是在浮动层的下面,加个透明的IFRAME,代码如下:

 
 
 
 
 
 

<div
style="position:absolute;z-index:-1;left:-8px;top:0;width:232px;">

 
 
 
 
 
 
 

<iframe
style="width:100%;filter:alpha(opacity=0);-moz-opacity:0"></iframe>

 
 
 
 
 
 

</div>

类似于刚刚好把<select>的展现信息挡住(只是觉得是个办法。所以贴出来)

在form中,IE支持label,包括文字和图片;但是firefox不支持图片的label,

点击图片不能让label for的radio或者checkbox产生效果。

(label 向控件定义标注(标记)。如果您在 label 元素内点击文本,就会触发此控件。

就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上)

eg:标记通常以下面两种方式中的一种来和表单控件相联系:将表单控件作为标记标签的内容,这样的就是隐式形式,

或者为 <label> 标签下的 for 属性命名一个目标表单
id,这样就是显式形式。

例如,在 XHTML 中:

<label for="SSN">Social Security
Number:</label>

<input type="text" name="SocSecNum" id="SSn"
/>

<label>Date of Birth:
<input type="text" name="DofB"
/></label>

第一个标记是以显式形式将文本 "Social Security Number:" 和表单的社会安全号码的文本输入控件
("SocSecNum") 联系起来,

它的 for 属性的值和控件的 id 一样,都是 SSN。第二个标记 ("Date of Birth:") 不需要 for
属性,

它的相关控件也不需要 id 属性,它们是通过在 <label> 标签中放入
<input> 标签来隐式地连接起来的。

6.CSS方面,IE中支持在CSS中嵌入expresion,而Firefox不支持

firefox支择相邻子选择符“>”,而IE6不支持(IE7支持)

7.firefox 对display的inline-block不支持,而IE均支持。

8.cusor:hand:竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。

pointer:(IE6.0)和hand 一样。竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。

可是 pointer 才是css2 的标准属性,压根就没有hand 这个东西。

9 滤镜的支持(例:透明滤镜):

IE:filter:alpha(opacity=10);

firefox:-moz-opacity:.10;

 

另外在模版的JS设计的时候也需要考虑两者对代码的兼容,以下是对IE与FIREFOX中JS的一些测试:

以下以 IE 代替 Internet Explorer,以 MF 代替 Mozilla Firefox

1. form.item 问题

 
 
 

(1)现有问题:

 
 
 
 
 
 
 

现有代码中存在许多 formName.item("itemName") 这样的语句,不能

 
 
 
 
 
 
 

在 MF 下运行

 
 
 

(2)解决方法:

 
 
 
 
 
 
 

改用 formName.elements["elementName"]

 
 
 
(3)其它

 
 
 
 
 
 
 

参见 2

2. 集合类对象问题

 
 
 

(1)现有问题:

 
 
 
 
 
 
 

现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。

 
 
 

(2)解决方法:

 
 
 
 
 
 
 

改用 [] 作为下标运算。如:forms("formName") 改为

 
 
 
 
 
 
 

forms["formName"]。

 
 
 
 
 
 
 

又如:getElementsByName("inputName")(1) 改为

 
 
 
 
 
 
 

getElementsByName("inputName")[1]

 
 
 
(3)其它

3. event

 
 
 

(1)现有问题:

 
 
 
 
 
 
 

使用 event 无法在 MF 上运行

 
 
 

(2)解决方法:

 
 
 
 
 
 
 

MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:

 
 
 
 
 
 
 

原代码(可在IE中运行):

 
 
 
 
 
 
 
 
 
 
 

<input type="button" name="someButton" ="提交"

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

="java:gotoSubmit()"/>

 
 
 
 
 
 
 
 
 
 
 

...

 
 
 
 
 
 
 
 
 
 
 

< language="java">

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

gotoSubmit() {

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

...

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

alert(event); 
 
 

// use event

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

...

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

}

 
 
 
 
 
 
 
 
 
 
 

</>

 
 
 
 
 
 
 

新代码(可在IE和MF中运行):

 
 
 
 
 
 
 
 
 
 
 

<input type="button" name="someButton" ="提交"

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

="java:gotoSubmit(event)"/>

 
 
 
 
 
 
 
 
 
 
 

...

 
 
 
 
 
 
 
 
 
 
 

< language="java">

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

gotoSubmit(evt) {

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

evt = evt ? evt : (event ? event : null);

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

...

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

alert(evt); 
 
 
 
 
 
 
 
 
 
 
 

// use evt

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

...

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

}

 
 
 
 
 
 
 
 
 
 
 

</>

 
 
 
 
 
 
 

此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给

 
 
 
 
 
 
 

参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老

 
 

 
 
 
 
 
 
 
 
 
 
 

//事件处理函数

 
 
 
 
 
 
 
 
 
 
 
 

a(evt) { //FireFox

 
 
 
 
 
 
 
 
 
 
 

evt = evt? evt: event; //IE

 
 
 
 
 
 
 
 
 
 
 

var srcElem = (evt.target)? evt.target: evt.srcElement;

 
 
 
 
 
 
 
 
 
 
 

//事件处理...

 
 
 
 
 
 
 
 
 
 
 

}

在连接事件处理函数的时候,可以用Inline HTML方式,也可以用Event

 
 
 
 
 
 
 
 
 
 
 

property方式定义。

 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

1、使用Inline HTML方式,如:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

<input type="radio" name="radio" ="1"

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

="java:a(event)">

 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

注意:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

(1)java不能省;

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

(2)实参要使用event,形参使用什么都可以(如evt、event等);

 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

2、使用Event property方式绑定事件处理函数,如:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

form2.radio[0]. = a;

 

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. 关于

 
 
(1)现有问题

 
 
 
 
 
 
 
 

在 IE中 可以用test取得该,mf中不行

 
 
(2)解决方法

 
 
 
 
 
 
 
 

在的使用方面mf和ie的最主要的区别是:

 
 
 
 
 
 
 
 

如果在标签中书写了以下属性:

 
 
 
 
 
 
 
 

< src="/xx.htm" id="Id" name="Name"
/>

 
 
 
 
 
 
 
 

那么ie可以通过id或者name访问这个对应的window对象

 
 
 
 
 
 
 
 

而mf只可以通过name来访问这个对应的window对象

 
 
 
 
 
 
 
 

例如如果上述标签写在最上层的window里面的htm里面,那么可以这样访问

 
 
 
 
 
 
 
 

ie: top.Id或者top.Name来访问这个window对象

 
 
 
 
 
 
 
 

mf: 只能这样top.Name来访问这个window对象

 
 
 
 
 
 
 
 

另外,在mf和ie中都可以使用

 
 
 
 
 
 
 
 
 
 
 
 

top.getElementById("Id")

 
 
 
 
 
 
 
 

来访问

 
 
 
 
 
 
 
 

标签

 
 
 
 
 
 
 
 

并且可以通过

 
 
 
 
 
 
 
 
 
 
 
 

top.getElementById("test").src = 'xx.htm'

 
 
 
 
 
 
 
 

来切换的内容

 
 
 
 
 
 
 
 

也都可以通过top.Name.location = 'xx.htm'来切换的内容

 
 
 
 
 
 
 
 

关于和window的描述可以参见bbs的‘window与’文章

 
 
 
 
 
 
 
 

以及/test/js/test_/目录下面的测试

 
 
 
 
 
 
 
 

----adun 2004.12.09修改

9. 在mf中,自己定义的属性必须getAttribute()取得

10.在mf中没有 
parentElement
parement.children 
而用

 
 
 
 
 
 
 
 
 
 
 
 
 
 

parentNode parentNode.childNodes

 
 

childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白

 
 
文本节点。

 
一般可以通过node.getElementsByTagName_r()来回避这个问题。

 
 

当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. getElementsByName() 和 all[name] 的问题

 
(1)现有问题:

 
 
 
 

在 IE 中,getElementsByName()、all[name] 均不能用来取得 div 元素

 
 
 
 

(是否还有其它不能取的元素还不知道)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  firefox ie html forms div float