zoukankan      html  css  js  c++  java
  • js在火狐和IE浏览器的差异

    以下以 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的内容
    
    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 元素(是否还有其它不能取的元素还不知道)。
    
    W3C说是一个标准,不如说是一个麻烦,FireFox大家都说好用,但我宁愿它没有!! 苦了这些程序员,哎
    
    以下细节只针对IE和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 特别设置样式
    
    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.在mozilla 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{300px;margin:0 10px 0 10px;}
    div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改
    div{300px!important;width /**/:340px;margin:0 10px 0 10px}
    关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)
    
    11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义
    ul{margin:0;padding:0;}
    就能解决大部分问题
    
    12.对div设置水平居中对齐时,要给子div加上一句"margin:auto"以兼容FireFox浏览器
    
    13.当div的布局并没有如text-align设置的那样排列时,尝试用float来实现
    
    14.将<p>标签的样式改成:margin:0px;line-height:XXpx,避免在FireFox浏览器下发生一些意想不到的结果
    
    15.想要消除ul、ol等列表的缩进时,样式应写成:list-style:none;margin:0px;padding:0px;,其中margin属性对IE有效,padding属性对FireFox有效
    
    16.padding 5px 4px 3px 1px FireFox无法解释简写,必须改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;
    
    注意事项:
    
    1、float的div一定要闭合。
    
    例如:(其中floatA、floatB的属性已经设置为float:left;)
    <#div id="floatA" ></#div>
    <#div id="floatB" ></#div>
    <#div id="NOTfloatC" ></#div>
    这里的NOTfloatC并不希望继续平移,而是希望往下排。
    这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
    在
    <#div class="floatB"></#div>
    <#div class="NOTfloatC"></#div>
    之间加上
    <#div class="clear"></#div>
    这个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"></#div>
    
    相应的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 这句放置在另一句之上,上面已经提过
    
    1. firefox对注释的解析不是很好,他不会很好的解析下面的注释:
    <!---------------- 注释 ---------------------->
    这个在ie里面一点儿都不影响的东西会让你的页面在firefox里面丢掉很多内容。
    
    2. ie 对于<td>的align解析的有点奇怪,他不会让里面的文字居中,实际上,看起来像是靠右对齐的,CSS设在td上面的 text-align 也是一样的效果,所以,文字居中还是用<center>标记。这个firefox解析的没有问题。
    
    3. firefox严格按照尺寸解析表格。所以不要轻易在 td 上面定义 100%,除非确实需要,否则,你的表格会被撑得很大。比如说,table 的宽度是 100,如果在其中一个td里面定义了 width=100%,那么它的宽度就是 100,其他的宽度也不会缩小。
    
    4. 对于 textArea 的背景图片的解析两个浏览器存在较大的差别,主要体现在 BACKGROUND-ATTACHMENT 属性,其 scroll 值在 ie 里面是按照页面的滚动条算的,而在firefox里面是按照文本框本身的滚动条算的,也就是说,一个不重复的背景,在ie里面设 BACKGROUND-ATTACHMENT : scroll 是没有问题的,但是在firefox里面必须得设成 BACKGROUND-ATTACHMENT : fixed,这个问题很难解决,除非判断浏览器的不同,给出不同的css。
    
    5. 很多时候 firefox 的 padding 计算方式和 ie 不同,没有太多时间试验这个了。
  • 相关阅读:
    Nginx缓存[proxy cache、memcache]
    Nginx重写规则
    同步异步,阻塞非阻塞 和nginx的IO模型
    cookie & session
    HTTP状态码
    web简单的整体测试
    关于 如何用电脑的adb连接Mumu模拟器
    关于社保断交一个月的影响
    关于androidStudio的下载
    可以直接拿来用的android开源项目研究
  • 原文地址:https://www.cnblogs.com/xyzhuzhou/p/2547699.html
Copyright © 2011-2022 走看看