firefox与IE兼容2008-12-0518:26bodySCRIPTLANGUAGE=JavaScriptvars=;s+=\r\n网页可见区域宽:+document.body.clientWidth;s+=\r\n网页可见区域高:+document.body.clientHeight;s+=\r\n网页可见区域宽:+document.body.offsetWidth+(包括边线的宽);s+=\r\n网页可见区域高:+document.body.offsetHeight+(包括边线的宽);s+=\r\n网页正文全文宽:+document.body.scrollWidth;s+=\r\n网页正文全文高:+document.body.scrollHeight;s+=\r\n网页被卷去的高:+document.body.scrollTop;s+=\r\n网页被卷去的左:+document.body.scrollLeft;s+=\r\n网页正文部分上:+window.screenTop;s+=\r\n网页正文部分左:+window.screenLeft;s+=\r\n屏幕分辨率的高:+window.screen.height;s+=\r\n屏幕分辨率的宽:+window.screen.width;s+=\r\n屏幕可用工作区高度:+window.screen.availHeight;s+=\r\n屏幕可用工作区宽度:+window.screen.availWidth;alert(s);/SCRIPT以下以IE代替InternetExplorer,以MF代替MozzilaFirefox1.document.form.item问题(1)现有问题:现有代码中存在许多document.formName.item(itemName)这样的语句,不能在MF下运行(2)解决方法:改用document.formName.elements[elementName](3)其它参见22.集合类对象问题(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中运行):inputtype=buttonname=someButtonvalue=提交onclick=/...scriptlanguage=javascriptfunctiongotoSubmit(){...alert(window.event);//usewindow.event...}/script新代码(可在IE和MF中运行):inputtype=buttonname=someButtonvalue=提交onclick=/...scriptlanguage=javascriptfunctiongotoSubmit(evt){evt=evt?evt:(window.event?window.event:null);...alert(evt);//useevt...}/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)其它参见问题47.event.x与event.y问题(1)现有问题在IE中,event对象有x,y属性,MF中没有。(2)解决方法在MF中,与event.x等效的是event.pageX。但event.pageXIE中没有。故采用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标签中书写了以下属性:framesrc=xx.htmid=frameIdname=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的内容关于frame和window的描述可以参见bbs的‘window与frame’文章以及/test/js/test_frame/目录下面的测试----adun2004.12.09修改9.在mf中,自己定义的属性必须getAttribute()取得10.在mf中没有parentElementparement.children而用parentNodeparentNode.childNodeschildNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。一般可以通过node.getElementsByTagName()来回避这个问题。当html中节点缺失时,IE和MF对parentNode的解释不同,例如formtableinput//table/formMF中input.parentNode的值为form,而IE中input.parentNode的值为空节点MF中节点没有removeNode方法,必须使用如下方法node.parentNode.removeChild(node)11.const问题(1)现有问题:在IE中不能使用const关键字。如constconstVar=32;在IE中这是语法错误。(2)解决方法:不使用const,以var代替。12.body对象MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在13.urlencoding在js中如果书写url就直接写&不要写&例如varurl='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元素(是否还有其它不能取的元素还不知道)。1,document.getElementById替代document.all(ie适用)2,集合[]替代()(ie适用)3,target替代srcElement;parentNode替代parentElement(parentNodeie适用)4,node.parentNode.removeChild(node)替代removeNode(this)(ie适用)5,有空白文本节点6,无outerHTML属性7,事件局部变量e替代事件全局变量event8,e.button键值有别于event.button,只有3个键值而无组合键值9,无ondrag事件10,DOMMouseScroll替代onmousewheel;-e.detail替代event.wheelDelta11,addEventListener替代attachEvent;removeEventListener替代detachEvent12,e.preventDefault()替代event.returnValue=false;e.stopPropagation()替代event.cancelBubble=true13,style.top、style.left等严格检查px单位(加pxie适用)14,style=-moz-opacity:0.9替代style=filter:alpha(opacity=90);无其它filter15,style.cursor=pointer替代style.cursor=hand(ie适用)16,title替代alt(ie适用)17,状态栏默认不可修改,需调整ff设置18,内置绘图功能以canvas或者SVG替代vml19,代码出错时经常不报错(想来也是ff的无奈之举吧,如果每个ie独有的表达方式换在它里面都报错的话,怕是报都报不过来吧)20,对缓存的清理非常不好注:标明“ie适用”者为通用性建议写法,未标明者在ie里不适用。以下所有IE指IE6.0验证是否是IE浏览器(来之于googlejs)varagt=navigator.userAgent.toLowerCase();varis_ie=(agt.indexOf(msie)!=-1&&document.all);正式开始事件委托方法IEdocument.body.onload=inject;//Functioninject()在这之前已被实现firefoxdocument.bo