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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值