转载自我的网站:http://itrblog.info
最近改一个日程管理的代码,由于以前的系统定死要求在IE7 下运行,现在要求多浏览器兼容。所以改js 代码改的真叫痛苦,严重BS 以前的写这代码的人。
兼容问题主要包括 iframe body document.all event event.x event.y event.srcElemen showModelessDialog eval("idName") innerText,网上搜索兼容问题你会发现大多都是这些。他竟然每个都有,你难道是IE 专门培养的还是天生对W3C有仇啊,佩服能够写出兼容代码的人。能够写出针对性代码的人也不是“一般人”!
1、iframe 不兼容
IE:使用window.frameId或者window.frameName来访问这个frame对象.IE 下还有: document.frames["frameName"]等等许多变体。
Firefox:只能使用window.frameName来访问这个frame对象.
兼容的写法:window.document.getElementById("frameId"),如果更改frame 的地址,修改src属性。如果想调用js里的代码 window.document.getElementById("frameId").contentWindow.funName();firefox 下会对contentWindow报出警告但是仍然可用是正确的。
有人建议用window.frameName ,但不知道除iE和firefox其他的情况兼容么。另外在ie 下window.frameName.fun 如果fun 是在window下的竟然不错。这样难道不是跨越么!!!
2、 document.all 在IE 下可用,在ff下不可用。建议不要使用它,访问元素用 document.getElementById 和document.getElementsByName
3、event ,响应事件时可能用到事件信息。比如 οnclick="clickfun()"; 因为event 在IE 下是个全局变量 所以可以直接引用 ,但ff 不行。所以如果要用 这样写 οnclick="clickfun(event)";在clickfun(event)中获取event : event=(event)?event:window.event;可能还要获取 鼠标位置 此时用event.x event.y ff同样不认识,要这样:
if (document.all) // IE //用document.all 判别浏览器类型不好,最好用第3方库,因为他们一直更新
{
x = event.x ; // 取得滑鼠指標目前的 x 位置
y = event.y ; // 取得滑鼠指標目前的 y 位置
}
else // firefox
{
x = event.clientX; // 取得滑鼠指標目前的 x 位置
y = event.clientY; // 取得滑鼠指標目前的 y 位置
}
4、事件源获取 同样不同 ie 下是srcElement ,ff下srcTarget
5、showModelessDialog 这玩意ff下压根没有,改为模式窗口 ,弹出层 或open 吧
6、innerText ,ff下没有这玩意。
7 、eval("idName") 获取的IDff 不可直接用.
8、parentNode 等。ie 下可能很多是用parentElement 。处理dom 最好用parentNode node 兼容,element 不兼容。
9、dom 处理不同,《div》《a》《/a》《span》《/span》《/div》,获取a标签的兄弟节点,ie 下 ff下是不一样的,因为ie 认为文本是一个节点,ff认为空格也是。
10、element.innerHTML="html 代码";这样写会发现 有时html代码的内容添加到dom了,但样式没有了。ff这样添加不会去渲染的。这个和版本有关系。
11、document.body ff 下不行,改用 document.get...sByTagName[0];
12、document.formItemName, ff下会找不到的,改用document.getElementsByName ()[0],或者document.formName.formItemName