`
wangleide414
  • 浏览: 606701 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

IE 和 FireFox 兼容问题

 
阅读更多

 

兼容问题很多,目前收集了16个,供您参考!

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的内容

关于frame和window的描述可以参见bbs的‘window与frame’文章

以及/test/js/test_frame/目录下面的测试

----adun 2004.12.09修改

 

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就直接写&不要写&amp;例如var url = ''xx.jsp?objectName=xx&amp;objectEvent=xxx'';

frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器

一般会服务器报错参数没有找到

当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&amp;

一般MF无法识别js中的&amp;

 

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 元素(是否还有其它不能取的元素还不知道)。

 

17. DOM 数据岛的问题

 

现有问题:

在IE中, <xml>标签具有特殊意义, 可以内含XML DOM,并能实现与HTML组件的数据绑定. 在FF中,<xml>则仅仅是一个未知的标记而已.另外, 对IE 来说, <xml>实际意味着这里是一个ActiveX对象, 但它却挂在HTML本身的DOM树下作为一个节点,因而会对DOM树的遍历造成严重影响.

 

解决方法:

IE 的数据绑定机制是可以用JS来模拟的, 但是太麻烦, 建议不使用数据绑定机制或者 寻找实现这种模拟的库来做. 我们只讨论如何实现DOM的兼容.在FF中无论已知的HTML标记还是其它符合XML规范的标记,都是用统一的DOM树来处理的, 因此, FF事实上完全可以使用DOM数据岛, 但与IE小小的不同在于: 在IE中<xml> 是个 DOM document, 而在FF只是 DOM node. 这个差别通常不足为患. 但是有一个小小的细节, 为了兼容HTML相当随意的语法, FF无法识别简写的空标记.

如: <xml id="xx"><book><title>xxxx</title><content/><index/></book></xml>,

这其中<content/>和<index/>是简写形式的, 会使FF无法识别, 应当写成:

<content></content><index></index>

不过, 我怀疑如果用XHTML,可能就没有这种问题. 但我还没有试过.对于IE中<xml>干扰HTML的DOM结构问题, 我现在的方法是处理完毕后把它从HTML的DOM中删除. 不知道还有没有更好的解.

 

****************************

 

1. childNodes在ff中和ie的区别。

ff中的node(nodeType = 1)都是用textNode(nodeType = 3)分开的,而ie/op不是这样的。

 

content

 

在ff下,box1的childNodes为3个,ie下为1个。

 

2. 设置某个node对象的style class名称。

ie中要设置某个node的class用”className”作为attr来set或者get。

ff等其它的浏览器用”class”作为attr来set或者get。

代码:

 

if(typeof node1.getAttribute(”className”) == “string”) {

….

}

 

3. 设置某个node对象的style content。

直接举例把

代码:

 

var oStyle = oNode.getAttribute(”style”);

// ie

if(oStyle == “[object]”) {

oStyle.setAttribute(”cssText”, strStyle);

oNode.setAttribute(”style”, oStyle);

} else {

oNode.setAttribute(”style”, strStyle);

}

 

4. 事件对象。

ie用event

ff用evnt

 

5. 事件作用对象

ie用objEvent.srcElement

ff用objEvent.target

 

这个跟 xml 文件写作有关,将 IE 的 preserveWhiteSpace 设为 true 看看,底下是取自微软的说明文件

代码:

var xmlDoc = new ActiveXObject(”Msxml2.DOMDocument.4.0″);

xmlDoc.async = false;

xmlDoc.preserveWhiteSpace = true;

xmlDoc.load(”books.xml”);

alert(xmlDoc.xml);

xmlDoc.async = false;

xmlDoc.preserveWhiteSpace = false;

xmlDoc.load(”books.xml”);

alert(xmlDoc.xml);

 

 

*****************************************

 

1,document.getElementById替代document.all(ie适用)

2,集合[]替代()(ie适用)

3,target替代srcElement;parentNode替代parentElement(parentNode ie适用)

4,node.parentNode.removeChild(node)替代removeNode(this)(ie适用)

5,有空白文本节点

6,无outerHTML属性

7,事件局部变量e替代事件全局变量event

8,e.button键值有别于event.button,只有3个键值而无组合键值

9,无ondrag事件

10,DOMMouseScroll替代onmousewheel;-e.detail替代event.wheelDelta

11,addEventListener替代attachEvent;removeEventListener替代detachEvent

12,e.preventDefault()替代event.returnValue=false;e.stopPropagation()替代event.cancelBubble=true

13,style.top、style.left等严格检查"px"单位(加"px" ie适用)

14,style="-moz-opacity:0.9"替代style="filter:alpha(opacity=90)";无其它filter

15,style.cursor="pointer"替代style.cursor="hand"(ie适用)

16,title替代alt(ie适用)

17,状态栏默认不可修改,需调整ff设置

18,内置绘图功能以canvas或者SVG替代vml

19,代码出错时经常不报错(想来也是ff的无奈之举吧,如果每个ie独有的表达方式换在它里面都报错的话,怕是报都报不过来吧)

20,对缓存的清理非常不好

注:标明“ie适用”者为通用性建议写法,未标明者在ie里不适用。

 

以下所有IE指IE6.0

 

验证是否是IE浏览器(来之于google js)

var agt=navigator.userAgent.toLowerCase();

var is_ie=(agt.indexOf("msie")!=-1 && document.all);

 

正式开始

 

事件委托方法

 

IE

 

document.body.onload = inject; //Function inject()在这之前已被实现

 

firefox

 

document.body.onload = inject();

 

有人说标准是:

 

document.body.onload=new Function('inject()');

 

在firefox无法取得event.srcElement

 

通过其他方式传递对象

 

if(isIE)

thistable.attachEvent("onmousedown",OnClickChangeTdBackColor);

//thistable.onmousedown=OnClickChangeTdBackColor;

else//deal firefox

{

 

 

for(var i=0;i<thistable.rows.length;i++)

{

var rowObj = thistable.rows[i];

for( var j=0;j<rowObj.cells.length;j++)

{

var cellObj = rowObj.cells[j];

cellObj.setAttribute("onmousedown","OnClickChangeTdBackColor(this)");

}

//alert(rowObj.cells[0].tagName);

}

}

 

这是来之 http://blog.joycode.com/lostinet/archive/2005/02/27/44999.aspx

 

在FireFox下编写事件处理函数是很麻烦的事.

因为FireFox并没有 window.event . 如果要得到 event 对象,就必须要声明时间处理函数的第一个参数为event.

 

所以为了兼容IE与FireFox,一般的事件处理方法为:

btn.onclick=handle_btn_click;

function handle_btn_click(evt)

{

if(evt==null)evt=window.event;//IE

//处理事件.

}

对于简单的程序,这不算麻烦.

 

但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.

 

下面介绍一个解决这个麻烦事的方法,与原理.

 

JScript中,函数的调用是有一个 func.caller 这个属性的.

例如

function A()

{

B();

}

function B()

{

alert(B.caller);

}

如果B被A调用,那么B.caller就是A

 

另外,函数有一个arguments属性. 这个属性可以遍历函数当前执行的参数:

function myalert()

{

var arr=[];

for(var i=0;i

arr[i]=myalert.arguments[i];

alert(arr.join("-"));

}

alert("hello","world",1,2,3)

就能显示 hello-world-1-2-3

(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)

 

根据这两个属性,我们可以得到第一个函数的event对象:

btn.onclick=handle_click;

function handle_click()

{

showcontent();

}

function showcontent()

{

var evt=SearchEvent();

if(evt&&evt.shiftKey)//如果是基于事件的调用,并且shift被按下

window.open(global_helpurl);

else

location.href=global_helpurl;

}

function SearchEvent()

{

func=SearchEvent.caller;

while(func!=null)

{

var arg0=func.arguments[0];

if(arg0)

{

if(arg0.constructor==Event) // 如果就是event 对象

return arg0;

}

func=func.caller;

}

return null;

}

这个例子使用了SearchEvent来搜索event对象. 其中 'Event' 是 FireFox 的 event.constructor .

在该例子运行时,

SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以 func=func.caller 时,func变为handle_click .

handle_click 被 FireFox 调用, 虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event !

 

针对上面的知识,我们可以结合 prototype.__defineGetter__ 来实现 window.event 在 FireFox 下的实现:

 

下面给出一个简单的代码.. 有兴趣的可以补充

 

if(window.addEventListener)

{

FixPrototypeForGecko();

}

function FixPrototypeForGecko()

{

HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);

window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);

Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);

}

function element_prototype_get_runtimeStyle()

{

//return style instead...

return this.style;

}

function window_prototype_get_event()

{

return SearchEvent();

}

function event_prototype_get_srcElement()

{

return this.target;

}

 

function SearchEvent()

{

//IE

if(document.all)

return window.event;

 

func=SearchEvent.caller;

while(func!=null)

{

var arg0=func.arguments[0];

if(arg0)

{

if(arg0.constructor==Event)

return arg0;

}

func=func.caller;

}

return null;

}

</body></html>

 

firefox与IE(parentElement)的父元素的区别

 

因为firefox与IE都支持DOM,因此使用obj.parentNode是不错选择.

 

IE

obj.parentElement

firefox

obj.parentNode

 

asp.net中UniqueID和clientID的区别

 

要使用document.getElementById 方法,则使用控件的时候要这样来作

 

"javascript:OnSelectSubCatalog(\""+subCatalog_drp.ClientID+"\","+catalogIDX+","+catID.ToString()+")";

 

调用Select元素的区别

 

移出一个选择项

 

 

IE :sel.options.remove(sel.selectedIndex);

firefox :

 

增加选择项:

 

IE: subCatalog.add(new Option(text,value));

 

firefox:

var opnObj = document.createElement("OPTION");

//opnObj.id = optionID;

opnObj.value = value;

opnObj.text = text;

subCatalog.appendChild(opnObj);

 

cursor:hand VS cursor:pointer

firefox不支持hand,但ie支持pointer,所以建议统一使用pointer。

分享到:
评论

相关推荐

    DIV+CSS网页中IE和火狐兼容问题的整理

    然而,在实际应用中,由于不同浏览器的解析和渲染机制存在差异,尤其是在IE(Internet Explorer)和Firefox之间,这种差异可能导致兼容性问题。以下是对这些兼容性问题的详细梳理和解决策略。 1. **盒模型差异** -...

    ie firefox 兼容问题大全

    ### IE与Firefox兼容性问题详解 #### 一、概述 在网页开发过程中,浏览器兼容性问题一直是前端开发者面临的重要挑战之一。尤其是对于早期版本的Internet Explorer(简称IE)与Mozilla Firefox(简称Firefox)来说...

    JavaScript在IE和Firefox(火狐)的不兼容问题解决

    标题与描述均聚焦于“JavaScript在IE和Firefox(火狐)的不兼容问题解决”,这表明文章旨在探讨并提供解决方案来处理在不同浏览器环境下的JavaScript兼容性问题,尤其是在Internet Explorer(IE)和Mozilla Firefox...

    javascript在IE和Firefox中兼容性问题

    本篇将主要探讨JavaScript在Internet Explorer (IE) 和Firefox之间的兼容性挑战,并通过给出的文件名列表解析这些测试用例所涉及的知识点。 1. **createDocument测试.html** 在IE和Firefox中,创建XML文档的方法...

    让IE和火狐同时兼容

    特别是在早期的Web时代,Internet Explorer(简称IE)与Mozilla Firefox(简称火狐)这两款浏览器之间存在着显著的差异,这使得页面设计师不得不花费大量时间去解决它们之间的兼容性问题。本文将详细介绍如何使网站...

    IE FireFox 兼容问题

    ### IE FireFox 兼容问题 #### 背景与概述 在Web开发过程中,确保网页能在各种浏览器中正常显示是非常重要的。随着浏览器技术的发展,虽然现代浏览器在标准支持方面越来越一致,但在早期,不同浏览器对某些HTML、...

    Javascript的IE和Firefox兼容性参考

    以下是一些常见的JavaScript在IE和Firefox中的兼容性问题及解决方案: 1. **document.form.item问题** - 在IE中,可以通过`document.formName.item("itemName")`来访问表单元素,但在Firefox中不支持。推荐使用...

    java版 jquery uploadify 通过Flash实现多文件上传 IE 和FireFox 兼容

    经过反复研究学习,最终实现了IE 和FireFox 兼容问题。之所以在有后台鉴权时firefox和360浏览器无法正常运行,是因为FireFox、chrome、360浏览器等支持HTML5的浏览器不会再文件上传时自动带入session信息和cookie,...

    Javascript的IE和Firefox兼容性问题集合

    然而,由于不同的浏览器对JavaScript的支持程度和实现方式存在差异,尤其是Internet Explorer(IE)和Firefox这两款流行浏览器,开发者经常需要面对兼容性问题。以下是一些常见的JavaScript在IE和Firefox上的兼容性...

    IE FIREFOX兼容性测试

    本文将深入探讨“IE FIREFOX兼容性测试”这一主题,旨在帮助开发者更好地理解和解决不同浏览器间存在的兼容性问题。 首先,我们来理解标题“IE FIREFOX兼容性测试”的含义。这指的是针对Internet Explorer(IE)和...

    ie chrome firefox 兼容

    浏览器兼容性处理是 Web 开发中一个非常重要的问题,因为不同的浏览器可能会有不同的行为和特性。通过使用 userAgent 属性和正则表达式,我们可以实现浏览器兼容性处理,确保我们的 Web 应用程序可以在不同的浏览器...

    Javascript的IE和Firefox(火狐)兼容性

    ### Javascript的IE与Firefox(火狐)兼容性解决方案 在Web开发过程中,浏览器兼容性问题一直是开发者们关注的重点之一。由于不同的浏览器对于Web标准的支持程度存在差异,这导致了同样的代码在不同浏览器中的表现...

    ie与firefox兼容文档

    通过理解和运用这些知识点,开发者可以更好地处理IE与Firefox之间的兼容性问题,确保网站在不同浏览器上提供一致的用户体验。同时,随着Edge浏览器的普及和IE的逐渐淘汰,关注现代浏览器的兼容性也将变得更为重要。

    mxGraph破解包含ie和firefox

    然而,由于浏览器之间的兼容性问题,mxGraph在某些老旧版本的Internet Explorer(IE)和Firefox上可能会遇到挑战。"mxGraph破解包含ie和firefox"的描述暗示了我们正在处理如何让mxGraph在这些特定浏览器上正常运行的...

    Mozzila Firefox与IE的兼容问题

    以下是IE和Firefox之间的一些常见的兼容问题: 1. Document.Form.Item 问题 在IE中,document.formName.item("itemName")这样的语句可以正确执行,但是在Firefox中却不能运行。解决方法是使用document.formName....

    ie 和 firefox 的javascript 兼容问题(网上下载的).doc

    ### IE和Firefox的JavaScript兼容性问题详解 #### 1. `document.formName.item("itemName")` 问题 在处理表单元素时,IE 和 Firefox 对 `document.formName.item("itemName")` 的支持存在差异。 **说明:** - **...

    JS的IE和Firefox兼容性

    JavaScript在不同浏览器之间的兼容性问题一直是开发者面临的重要挑战,尤其是早期的Internet Explorer(IE)和Mozilla Firefox(MF)之间存在显著差异。以下是一些关键的兼容性问题及其解决方案: 1. **document....

    IE和Firefox对JavaScript的兼容

    然而,由于不同的浏览器对其解析和执行的方式存在差异,尤其是IE(Internet Explorer)和Firefox,这导致了JavaScript在不同浏览器间的兼容性问题。这份文档“IE火狐的JavaScript兼容.doc”深入探讨了这些差异,并...

Global site tag (gtag.js) - Google Analytics