`
AngelAndAngel
  • 浏览: 230764 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

火狐ie种js ,css 兼容问题

阅读更多
   以下是转的javaeye的帖子 我感觉很好,所以放在这儿,具体地址是
[url]   http://www.iteye.com/topic/1113840[/url]

   写了一个多月JS,感觉如今可不比几年前只有IE6的年代,而且过去只是用JS写个Ajax或者是简单的表单验证,可如今写一个稍微复杂点的小应用,要兼容所有浏览器,才发现真是太难了,难怪FE是一个独立的工种,有别于我们这些Java工程师了。
  如果你也不是专业FE,那么估计也会跟我一样在这些地方翻船,或许你所遇到的情况比我这些还多,那么欢迎补充。
1 首先是最简单的select标签,就有诸多不兼容:
  A、 cloneNode方法,对于非IE浏览器没有问题,对于IE浏览器,我遇到的问题包括:
  1)option selected的会clone不过去,然后会将第一个option作为selected值
  2)事件clone也会有问题
  B、Readonly:对于IE6,可以通过以下方法将select设为readonly:
  obj.onbeforeactive=function(){return false}
  obj.onfocus=function(){obj.blur();}
  obj.onmouseover=function(){obj.setCapture();}
  obj.onmouseout=function(){obj.releaseCapture();}
  对于其他浏览器,我采用的是元素替代法,动态创建一个input标签,把值赋给它,然后将select隐藏。
  C、select的z-index对于IE6无效,网上有很多关于这个讨论,JQuery采用一个iframe搞定
  D、动态添加option的方法不同,这个网上一搜一大堆
  E、对于onclick和onchange的响应不同,在FF下可以在onclick select时动态读取option值然后构建option,然后选中一个值后执行onchange事件,但是IE下不能这样做。
2 css对offsetWidth之类的理解不同
  http://newleague.iteye.com/blog/765535
3 对于vertical-align baseline的理解不同:
  http://w3help.org/zh-cn/causes/RD1016
4 设置背景色
  element.style.backgroundColor
  在firefox下想改变颜色,必须先设为null,再设为其他颜色才行,即先取消原来的颜色。
  在IE下,想取消颜色,必须设为''才行,而换其他颜色,无需先去掉之前的颜色,而如果你设成了null,反倒不行了。
5 不同浏览器去padding的理解不同
6 不同浏览器对强制换行和强制不换行的理解不同:
  http://www.cftea.com/c/2009/01/QPDZU40MNW8FYYG3.asp
  最恶心的是对于IE6,如果是<td><span>我是蚊子</span></td>,那么在td上写了word-break:keep-all依然无效,必须在span上也写。
7 获得head节点的方式不同
  在Firefox下可以用window.head,而所有浏览器都兼容的方式是document.getElementsByTagName('head')[0]
8 往head上添加css code的方法不同,也就是动态添加<style>标签。
  IE下可以用var style=document.createStyleSheet();style.cssText=cssCode;
  而有文章说,在Windows上的IE,用createStyleSheet返回的是styleElement的styleSheet,而在Mac上返回的是styleElement自己。
   在其他浏览器下需要document.createElement('style');
   然后还有区分是否具有styleSheet属性。
   这个很容易搜到。
9 对于onchange事件,firefox浏览器可以注册在table,div等组件上,然后通过冒泡,拦截input,select等发出的事件,而IE不行,必须绑定到相应的组件上
10 将input设为readonly=true,其依然会响应keypress,keyup,keydown,onblur事件
11 IE和非IE对于停止冒泡和取消默认行为的方法不同
12 大家都知道IE和非IE在动态添加事件时使用的方法不同,IE是attachEvent,其他是addListener,然后参数也不同。更重要的是如果一个控件绑定了多个function,他们绑定和执行的顺序是不同的,IE是跟绑定顺序相反,其他是跟绑定顺序相同
13 获得当前事件不同,一个是window.event一个是直接接受event
14 FF下执行offset系列非常慢,但是IE下比较快,而IE的改变CSS的执行非常慢。
   Firefox6比Firefox3.6速度快的多,相差好几百倍(针对一个400行*50列的表格的JS处理)
15 如果大量动态改变css,那么使用document.createDocumentFragment,然后将需要修改样式的Dom获取出来appendChild到这个临时的fragment上,修改完css后再append回去即可,这样性能能差好几百倍。
16 浏览器加载网页时,顺序读取html,遇到外部js链接会读进来,然后按顺序执行,边解释边执行,而对于外部css,图片等则是启动另外的线程连接服务器去获取。
   IE对于CSS引入有限制,我没试过,但有篇文章讨论:http://blog.csdn.net/ydshang/article/details/4158211
17 表格定位某一行,可以通过改变scrollTop来实现,当然如果出现了滚动条的话
18 IE的Dom用完要记得释放,可以在unload方法中,否则会出现内存泄露
19 unload方法在各个浏览器里各不相同,我之前的文章里有介绍。http://sslaowan.iteye.com/blog/1128209
20 我知道了为什么FE最喜欢的浏览器是FF,最讨厌的是IE6,恨不得IE6去死,其他IE也不怎么样。但是Chrome,Opera也各有各的bug
21 Ajax当使用同步模式时,如果访问的链接是错误的,那么FF会在控制台报错,而IE会直接弹出个对话框,然后就崩溃了。
22 FF支持document.getElementsByClass等方法,IE不支持,可以自己写一个。
23 trim方法在IE和FF下不同,需要自己写一个,可以用正则表达式
24 动态设置元素的css class在IE和非IE浏览器下也不同
25 有时本地字体库会影响你的字体,大小等显示,但是有时甚至会影响你的布局
26 字符串也可以使用><等符号比较大小,但是是字符串比较,不要被骗了。
27 JS中this问题非常让人困惑
28 判断浏览器可以有很多方法,主流是两大类,agent判断法和特性法,后者好像更推荐
29 JS是面向对象语言,对象.属性=值 只影响当前对象,而对象.prototype.属性则影响整个类。非IE浏览器可以覆盖DOM对象的类方法,但是IE不行。
30 getComputedStyle,获得外部添加的css,FF支持,IE不支持,具体看这篇文章http://www.jb51.net/article/16128.htm
31 IE和Chrome支持outerHTML方法,其他浏览器没有。相关讨论:http://walsh.iteye.com/blog/261966,http://stackoverflow.com/questions/1700870/how-do-i-do-outerhtml-in-firefox

32 还有一个特悲剧的,IE下会把document.[formname.]控件Id当成那个控件,如果把一个控件比如input的id设为了submit,那么form.submit()就会报错。
2011-8-25Add

33 如果利用全角空格进行布局时,Firefox支持,而IE会去除只剩一个,但是是在某些情况下的,具体看这篇文章:http://w3help.org/zh-cn/causes/BT1025

34 透明度:

filter:alpha(opacity=0); /* IE */

-moz-opacity:0.3; /* Moz + FF */
opacity: 0.3;

  
    至于用不用var的区别,undefined和null的区别,Ajax构建的不同方式,这些一般的Java程序员都了解了。

    很多Java程序员也会使用JS框架,比如JQuery,Extjs和Dojo,她们都帮我们屏蔽了很多兼容性问题。
    Dojo提供了Java一样的面向对象机制。

    抛砖引玉,你还遇到过什么陷阱,那些FE都知道,而我们Java工程师不知道?



    有同学要求例子,有些只是小知识,有了链接,那么给一个我做的过程中写的实验程序吧,主要是验证select,还有readonly之后的input对于keypress等事件的响应:

<head>
<script>
    function addListener(element,e,fn){
     if(element.addEventListener){
          element.addEventListener(e,fn,false);
     } else {
          element.attachEvent("on" + e,fn);
     }
   }
   
   function getEventSource(event){
  	    event = window.event?window.event:event; 
        var source = event.target || event.srcElement;   
        return source;
  }

  
  function init(e){
    var provChoice= document.getElementById('prov');
	 fillPro(provChoice);	  
     addListener(provChoice,'change',fillCity);
	var coChoice= document.getElementById('country');
	 addListener(coChoice,'change',function(){alert('a');});
	var selects=document.getElementsByTagName('select');	
    for(var i=0;i<selects.length;i++){
       selects[i].cloneNode=function(deep){
	    var temp=document.createElement('div');
        temp.innerHTML=this.outerHTML;
        return temp.childNodes[0];		
	  }
	  
	  
   }	
   
	document.getElementById('cloneCo').appendChild(coChoice.cloneNode(true));
	var coTD= document.getElementById('co');
	document.getElementById('r1').appendChild(coTD.cloneNode(true));
	
	document.getElementById('abc').readOnly=true;
	document.getElementById('abc').onkeydown=function(e){
	     e.preventDefault();
		 e.stopPropagation();
	}
	
	document.getElementById('abc').onkeypress=function(e){
	    alert('b');
	}
	
	document.getElementById('abc').onchange=function(e){
	    alert('c');
	}
	
	document.getElementById('abc').onblur=function(e){
	    alert('d');
		document.getElementById('abc').value='add';
	}
  }
 
  function fillPro(pro){
      pro.options[0]=new Option('BJ','北京');
	  pro.options[1]=new Option('TJ','天津');
	  pro.options[2]=new Option('HLJ','黑龙江');
	  pro.options[3]=new Option('SH','上海');
  }
  
  function fillCity(e){
       var c= document.getElementById('city');
	   if( document.getElementById('prov').value=='黑龙江'){
	     c.options[0]=new Option('HRB','哈尔滨');
	     c.options[1]=new Option('MDJ','牡丹江');
	     c.options[2]=new Option('QQHR','齐齐哈尔');
	     c.options[3]=new Option('JMS','佳木斯');
	   }
	 
	 
  }
   
</script>
</head>
<body onload='init(event)'>
 <table>
   <tr id='r1'>
     <td id='co'>
	   <select id='country' name='country'>
	    <option value='UK'>UK</option>
		<option value='USA'>USA</option>
	    <option value='CHINA' selected>China</option>
	   </select>
	 </td>
     <td>
	   <select id='prov' name='prov'></select>
	 </td>
	 <td>
	   <select id='city' name='city'></select>
	 </td>
	 <td id='cloneCo'></td>
	 <td>
	   <input id='abc' value='0'  onkeypress='return alert("a1"); '/>
     </td>	   
   <tr>
 <table>

</body>
</html>

  其他有用的帖子:

   1 Javascript在IE和FireFox中的不同表现http://www.iteye.com/topic/920575(即将被隐藏,说是DW上的文章,但是没找到原文,而且此文下有补充回复)

   2 Javascript与CSS在IE和Firefox中的误区及区别Javascript与CSS在IE和Firefox中的误区及区别(此贴即将成为精华帖)

   3 JavaScript在IE和Firefox下的兼容性问题JavaScript在IE和Firefox下的兼容性问题(此贴即将成为新手帖)


http://w3help.org/zh-cn/causes/index.html
分享到:
评论
2 楼 hongdou1120 2011-11-23  
谢谢分享
1 楼 albertwxh 2011-09-26  
谢谢分享!

相关推荐

    IE与FF的兼容问题

    IE与FF的兼容问题 IE浏览器和火狐浏览器兼容问题——CSS篇 IE浏览器和Firefox(火狐)浏览器兼容性——Javascript篇

    ie和火狐的兼容问题总结

    ie和火狐的兼容问题总结了火狐(FF)浏览器与IE在css和js中的不同之处,完美的解决各位在工作中遇到的技术困难

    IE6/IE7/IE8/Firefox/Chrome/Safari的CSS hack兼容一览表

    不同的浏览器对CSS的解释都有一点出入,特别是padding, line-height这些要细微控制的地方,下面的hack基本可以解决这个问题: • 在属性前加下划线(_),那么此属性只会被IE6解释 • 在属性前加星号(*),此属性只会被...

    46种常见的浏览器兼容性问题大汇总

    7. firefox与IE的父元素(parentElement)的区别 3 8. document.formName.item(”itemName”) 问题 3 9. 集合类对象问题 3 10. 自定义属性问题 3 11. input.type属性问题 3 12. event.srcElement问题 3 13. body...

    IE和Firefox浏览器CSS网页布局不同点

    我们讨论的主题CSS网页布局,最令大家头疼的问题就是浏览器兼容性,虽然jb51.net介绍过很多这方向的知识,但依然让很多开发人员晕头转向,今天的这篇文章,将列出css和javascript在IE和Firefox中二十三个不同点,...

    javascript css在IE和Firefox中区别分析

    我们讨论的主题CSS网页布局,最令大家头疼的问题就是浏览器兼容性,虽然52CSS.com介绍过很多这方向的知识,但依然让很多开发人员晕头转向,今天的这篇文章,将列出css和javascript在IE和Firefox中二十三个不同点,...

    CSS expression控制图片自动缩放效果代码[兼容 IE,Firefox]

    一直以来有个很头疼的问题困扰着我,那就是图片缩放的问题,写到 JS 里面吧,不太容易修改。写到 CSS 里面吧,IE 6 又不支持 max-width

    jQuery星级评分功能插件(兼容IE6,IE7, IE8, Firefox, Opera, Chrome, Safari)

    发现兼容性不好,有的在firefox下有问题,有的在IE6,7,8下有问题,大家可以自己测试一下。只好自己修改了一下一个简单的评分功能插件,终于兼容IE6,IE7, IE8, Firefox, Opera, Chrome, Safari。效果参考: 用法:...

    css与javascript跨浏览器兼容性总结

    主要介绍了css与javascript跨浏览器兼容性,包括常见的css兼容性问题与javascript兼容性问题,以及IE与Firefox等常用浏览器的兼容性分析,需要的朋友可以参考下

    兼容firefox,chrome的网页灰度效果

    JavaScript能做到,早就有人用js模拟了ie的gray滤镜,如果你感兴趣并且愿意看英文,可以去看看《“GRAYSCALING” IN NON-IE BROWSERS》。如果你不愿意看,我可以直接告诉你怎么用。 1. 下载grayscale.js文

    firefox 14 和网页开发的插件

    Firefox 是一个快速、安全且灵活的网页浏览器,这是我们的使命。 网站优化必备的9个Firefox插件 在网页设计制作中经常使用到的火狐浏览器插件工具: 1. Firebug Firebug是开发人员们钟爱火狐浏览器的一个重要...

    多浏览器测试工具 spoon

    做web前端工作的人员,需要测试页面在各个浏览器不同版本上的CSS或JS效果,如IE下要测试:IE6、IE7、IE8中的效果;但是各个浏览器只能在一台机器上面安装一个版本或升级到更高版本,这就给测试工作带来了很大的麻烦...

    css FF与IE兼容性总结

    1. 超链接访问过后hover样式就不出现的问题 ... FireFox下如何使连续长字段自动换行 众所周知IE中直接使用 word-wrap:break-word 就可以了, FF中我们使用JS插入的方法来解决 Code: &lt;style type="text/css"&gt; &lt;

    类似amazon.com的,兼容目前所有浏览器的左侧弹出菜单(css+js)

    采用css+div布局,兼容目前所有浏览器,ie6 sp1 sp2 sp3,ie7 google浏览器,firefox,解决网上很多弹出菜单无法同时多种浏览器的问题,附件为一个简单的html +css 文件,大家可以根据需要加入如asp php .net 等脚本

    JS固定表头和左边列V2.0(源码)

    1.1 修正了对IE6、IE7的兼容问题 1.2 修正了固定行、列的样式问题 1.3 IE6/IE7浏览器 不启用该功能 1.4 增加了拆分线, 修正了重复生成锁定行列的问题以及生成错位的问题, 修正了行、列事件无法复制的问题, ...

Global site tag (gtag.js) - Google Analytics