




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、firefox 与IE兼容2008-12-05 18:26var s =; s += r n网页可见区域宽:+ docume nt.body.clie ntWidth;s += r n网页可见区域咼:+ docume nt.body.clie ntHeight;s += r n网页可见区域宽:+ docume nt.body.offsetWidth +(s += r n网页可见区域咼:+ docume nt.body.offsetHeight +(s += r n网页正文全文宽:+ docume nt.body.scrollWidth;s += r n网页正文全文咼:+ docume nt.b
2、ody.scrollHeight;s += r n网页被卷去的高:+ docume nt.body.scrollTop;s += r n网页被卷去的左:+ docume nt.body.scrollLeft;s += r n网页正文部分上:+ win dow.scree nTop;s += r n网页正文部分左:+ win dow.scree nLeft;s += r n屏幕分辨率的高:+ win dow.scree n. height;s += r n屏幕分辨率的宽:+ wi ndow.scree n. width;s += r n屏幕可用工作区咼度:+ win dow.scree n.av
3、ailHeight;s += r n屏幕可用工作区宽度:+ win dow.scree n.availWidth;包括边线的宽);包括边线的宽);alert(s);以下以 IE 代替 In ternet Explorer ,以 MF 代替 Mozzila Firefox1. docume nt.form.item问题现有问题:现有代码中存在许多 docume nt.formName.item(itemName)这样的语句,不能在MF下运行(2) 解决方法:改用 document.formName.elementselementName(3) 其它参见22. 集合类对象问题(1) 现有问题:现有
4、代码中许多集合类对象取用时使用(),IE能接受,MF不能。(2) 解决方法:改用作为下标运算。如:document.forms(formName)改为docume nt.formsformName。又如:docume nt.getEleme ntsByName(i nputName)(1)改为docume nt.getEleme ntsByName(i nputName)1(3) 其它3. win dow.eve nt(1) 现有问题:使用window.event 无法在MF上运行(2) 解决方法:MF的event只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:原代码(可在IE中运行
5、):on click=/ usefun cti on gotoSubmit() alert(wi ndow.eve nt);wi ndow.eve nt新代码(可在IE和MF中运行):提交”fun cti on gotoSubmit(evt) evt = evt ? evt : (win dow.eve ntwi ndow.eve ntnull);alert(evt);/ use evt此外,如果新代码中第一行不改,与老代码一样的话(即gotoSubmit调 用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案tpl部分仍与老代码兼容。4. HTML对象的id 作为对象名的问题(
6、1) 现有问题在IE 中, HTML对象的ID 可以作为document的下属对象变量名直接 使用。在MF中不能。(2) 解决方法用getElementByld(idName) 代替idName作为对象变量使用。5. 用idName字符串取得对象的问题(1) 现有问题在IE中,利用 eval(idName) 可以取得id 为idName的HTML对象, 在MF中不能。(2) 解决方法用 getEleme ntByld(idName) 代替 eval(idName)。6. 变量名与某HTML对象id相同的问题(1) 现有问题在MF中,因为对象id 不作为HTML对象的名称,所以可以使用与 HTM
7、L对象id 相同的变量名,IE中不能。(2) 解决方法在声明变量时,一律加上var ,以避免歧义,这样在IE中亦可正常运 行。此外,最好不要取与 HTML对象id相同的变量名,以减少错误。(3) 其它参见问题47. eve nt.x与 eve nt.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 有微妙的差别(当整个
8、页面有滚动条的时候),不过大多数时候是等效的。如果要完全一样,可以稍麻烦些:mX = even t.x ? even t.x : eve nt.pageX;然后用mX代替event.x(3) 其它event.layerX在IE与MF中都有,具体意义有无差别尚未试验。8. 关于 frame(1) 现有问题在IE中可以用 window.testFrame 取得该frame, mf中不行(2) 解决方法在frame的使用方面 mf和ie的最主要的区别是:如果在frame标签中书写了以下属性:vframe src=xx.htm id=frameId n ame=frameName /那么ie可以通过i
9、d或者name访问这个frame对应的window对象而mf只可以通过 name来访问这个frame对应的window对象例如如果上述frame标签写在最上层的 window里面的htm里面,那么可以这样访问mf: 只能这样 window.top.frameName 来访问这个 window对象另外,在 mf 和 ie 中都可以使用 window.top.document.getElementByld(frameld)来访问frame标签并且可以通过 window.top.document.getElementByld(testFrame).src = xx.htm来切换frame的内容也都可
10、以通过 window.top.frameName.location = xx.htm来切换 frame 的内容关于frame和window的描述可以参见 bbs的window与frame 文章以及/test/js/test_frame/目录下面的测试-adun 2004.12.09修改9. 在mf中,自己定义的属性必须getAttribute() 取得10. 在 mf 中没有parentElement parement.children而用pare ntNode pare ntNode.childNodeschildNodes 的下标的含义在 IE和MF中不同,MF使用DOM规范,childN
11、odes中会 插入空白文本节点。一般可以通过n ode.getEleme ntsByTagName()来回避这个问题。当html中节点缺失时,IE和MF对parentNode的解释不同,例如MF 中 input.parentNode 的值为 form, 而 IE 中 input.parentNode的值为空节点MF中节点没有removeNode方法,必须使用如下方法no de.pare ntNode.removeChild( no de)11. co nst 问题(1) 现有问题:在IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语 法错误。(2
12、) 解决方法:不使用const ,以var代替。12. body 对象MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在13. url en cod ing在js中如果书写url就直接写&不要写&例如var url =xx.jsp?objectName=xx&o bjectEve nt=xxx:frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器一般会服务器报错参数没有找到当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&一般MF无法识别js中的&14. nodeName 和 tag
13、Name 问题(1) 现有问题:在MF中,所有节点均有 nodeName值,但textNode 没有tagName 值。在IE 中,nodeName的使用好象有问题(具体情况没有测试,但我的IE已经死了好几次)。(2) 解决方法:使用tagName,但应检测其是否为空。15. 元素属性IE下input.type属性为只读,但是 MF下可以修改16. docume nt.getEleme ntsByName()禾口 docume nt.all name的问题(1)现有问题:div在 IE 中,getElementsByName()、document.allname均不能用来取得元素(是否还有其它
14、不能取的元素还不知道)。1, document.getElementByld替代 document.all( ie 适用)2, 集合替代()(ie适用)3, target 替代 srcElement;parentNode替代 parentElement ( parentNode ie 适用)4, no de.pare ntNode.removeChild( no de)替代 removeNode(this) ( ie 适用)5, 有空白文本节点6, 无 outerHTML 属性7, 事件局部变量e替代事件全局变量 event8, e.button 键值有别于event.button,只有3个键
15、值而无组合键值9, 无on drag事件10, DOMMouseScroll 替代 onmousewheel;-e.detail 替代 event.wheelDelta11, addEventListener替代 attachEvent;removeEventListener替代 detachEvent12,e.preve ntDefault()替代 event.returnValue=false;e.stopPropagation()替代even t.ca ncelBubble=true13,style.top 、style.left等严格检查px单位(加px ie 适用)14,style=
16、-moz-opacity:0.9替代 style=filter:alpha(opacity=90);无其它filter15,style.cursor=po in ter替代 style.cursor=hand( ie 适用)16, title替代 alt ( ie 适用)17, 状态栏默认不可修改,需调整ff设置18, 内置绘图功能以 canvas或者SVG替代vml19, 代码出错时经常不报错(想来也是ff的无奈之举吧,如果每个ie独有的表达方式换在它 里面都报错的话,怕是报都报不过来吧)20, 对缓存的清理非常不好注:标明“ie适用”者为通用性建议写法,未标明者在ie里不适用。以下所有IE
17、指IE6.0验证是否是IE浏览器(来之于google js)var agt =n avigator.userAge nt.toLowerCase();var is_ie=(agt. in dexOf(msie)!=-1 & docume nt.all);正式开始事件委托方法IEdocume nt.body .onl oad = inject; /Function inject()在这之前已被实现firefoxdocume nt.body .onl oad = inject();有人说标准是:docume nt.body .onl oad=new Fun cti on (inject。);在 f
18、irefox 无法取得 event.srcElement通过其他方式传递对象if(isIE)thistable.attachEve nt(o nm ousedow n,O nClickCha ngeTdBackColor);/thistable.o nm ousedow n=On ClickCha ngeTdBackColor;else/deal firefoxfor(var i=0;ithistable.rows.le ngth;i+) var rowObj = thistable.rowsi;for( var j=0;jrowObj.cells .len gth;j+)var cellOb
19、j = rowObj.cellsj;cellObj.setAttribute(o nm ousedow n ,O nClickCha ngeTdBackColor(this);alert(rowObj.cells0.tagName);这是来之在FireFox下编写事件处理函数是很麻烦的事因为FireFox并没有window.event.如果要得到event对象,就必须要声明时间处理函数的第一个参数为event.所以为了兼容IE与FireFox, 一般的事件处理方法为:bt n.o nclick=ha ndle_btn_click;fun ctio n han dle_btn_click(evt
20、)if(evt=nu ll)evt=w in dow.eve nt;/IE/处理事件.对于简单的程序,这不算麻烦但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去.这简直就是噩梦.下面介绍一个解决这个麻烦事的方法,与原理.JScript中,函数的调用是有一个func.caller这个属性的.例如fun ctio n A()B();fun ctio n B()alert(B.caller);如果B被A调用,那么B.caller 就是A另外,函数有一个arguments属性.这个属性可以遍历函数当前执行的参数:fun ct
21、io n myalert()var arr=;for(var i=0;iarri=myalert.argume ntsi;alert(arr.joi n(-);alert(hello,world,1,2,3)就能显示 hello-world-1-2-3(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)根据这两个属性,我们可以得到第一个函数的eve nt对象:btn.on click=ha ndle_click;fun ctio n han dle_click()showc onten t();fun ctio n showc onten t()var evt=Search
22、Eve nt();被按下if(evt&evt.shiftKey)/如果是基于事件的调用,并且shiftwin dow.ope n( global_helpurl);elselocati on .href=global_helpurl;function SearchEve nt()fun c=SearchEve nt.caller;while(fu nc!=n ull)var argO=fun c.argume nts0;if(arg0)如果就是 eve nt对象 if(arg0.c on structor=Eve nt) / return argO;fun c=fu nc.caller;ret
23、urn n ull;这个例子使用了SearchEve nt来搜索eve nt对象.其中Eve nt 是FireFox 的even t.c on structor .在该例子运行时,SearchEvent.caller就是 showcontent,但是 showcontent.arguments0是空.所以func=func.caller 时,func 变为 handle_click .handle_click被FireFox 调用,虽然没有定义参数,但是被调用时,第一个参数就是event,所以 handle_click.arguments0就是 event !针对上面的知识,我们可以结合pro
24、totype._defineGetter_来实现window.eventFireFox下的实现:下面给出一个简单的代码.有兴趣的可以补充if(wi ndow.addEve ntListe ner)FixPrototypeForGecko();function FixPrototypeForGecko()HTMLEtotype._defineGetter_(ru ntimeStyle,eleme nt_prototype_get_ru n timeStyle);totype._defineGetter_(eve nt,w in do
25、w_prototype_get_eve nt);Etotype._defineGetter_(srcEleme nt,eve nt_prototype_get_srcEleme nt);fun ctio n eleme nt_prototype_get_ru ntimeStyle()/return style in stead.return this.style;function win dow_prototype_get_eve nt()return SearchEve nt();function even t_prototype_get_srcEleme nt()return this.target;function SearchEve nt()/IEi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年个人汽车抵押贷款合同标准文本
- 冲压模具采购合同采购合同6篇
- 2025年公民二手住宅购买合同范本
- (完整)煤矿食堂承包合同6篇
- 2025婚纱摄影合作伙伴关系合同精要
- 2025年环保房屋装修材料供货合同
- 2025年个人博客网站主页制作合同样本
- 2025年债权转让人合同模板
- 2025年福建生物工程职业技术学院单招职业倾向性考试题库一套
- 2025年广州工程技术职业学院单招职业适应性考试题库含答案
- 2024年赣州职业技术学院单招职业适应性测试题库及答案解析
- DL∕T 5209-2020 高清版 混凝土坝安全监测资料整编规程
- 2024年山东省潍坊市中考数学真题试题(含答案及解析)
- 开票税点自动计算器
- 2024年湖南新课标卷高考生物真题试卷(无答案)
- 2024年江苏农牧科技职业学院单招职业适应性测试题库及参考答案
- 医疗器械质量安全风险会商管理制度
- 降低用药错误发生率
- 起重机维护保养记录表
- 焦虑自评量表(SAS)
- 《摄影构图》课件
评论
0/150
提交评论