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 元素
(是否还有其它不能取的元素还不知道)。