在开发的过程中遇到一个问题,js代码是 [code] <script type="text/javascript"> top.window.location.href('http://www.kedy.cn'); </script> [/code] 这在IE6下是可以用的,但在firefox 下是不能用的。 经测试,发现以上代码改为如下即可在两个浏览器下通用: [code] <script type="text/javascript"> top.window.location = 'http://www.kedy.cn'; </script> [/code] 以前曾经收集过一点关于在IE和Firefox下可能出现不兼容的情况,地址如下:[url=http: //www.kedy.cn/archives/2006/04/05/68.html]Javascript的IE和Firefox兼容性汇编 [/url]。看来以后还得一步步自己发现,并收集。
|
以下以 IE 代替 Internet Explorer,以 Fx 代替 Mozilla Firefox
1. document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 Fx 下运行
(2)解决方法:
改用 document.formName.elements["elementName"]
(3)其它
参见 2
2. 集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,Fx 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms("formName") 改为 document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]
(3)其它
3. window.event
(1)现有问题:
使用 window.event 无法在 Fx 上运行
(2)解决方法:
Fx 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
原代码(可在IE中运行):
代码:
<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>
新代码(可在IE和Fx中运行):
代码:
<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 的下属对象变量名直接使用。在 Fx 中不能。
(2)解决方法
用 getElementById("idName") 代替 idName 作为对象变量使用。
5. 用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在Fx 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。
6. 变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 Fx 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
(3)其它
参见 问题4
7. event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,Fx中没有。
(2)解决方法
在Fx中,与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 与 Fx 中都有,具体意义有无差别尚未试验。
8. 关于frame
(1)现有问题
在 IE中 可以用window.testFrame取得该frame,Fx中不行
(2)解决方法
在frame的使用方面Fx和ie的最主要的区别是:
如果在frame标签中书写了以下属性:
<frame src="xx.htm" id="frameId" name="frameName" />
那么ie可以通过id或者name访问这个frame对应的window对象
而Fx只可以通过name来访问这个frame对应的window对象
例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
Fx: 只能这样window.top.frameName来访问这个window对象
另外,在Fx和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. 在Fx中,自己定义的属性必须getAttribute()取得
10.在Fx中没有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和Fx中不同,Fx使用DOM规范,childNodes中会插入空白文本节点。
一般可以通过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和Fx对parentNode的解释不同,例如
<form>
<table>
<input/>
</table>
</form>
Fx中input.parentNode的值为form, 而IE中input.parentNode的值为空节点
Fx中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)
11.const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。
12. body 对象
Fx的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在
13. url encoding
在js中如果书写url就直接写&不要写&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
一般会服务器报错参数没有找到
当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
一般Fx无法识别js中的&
14. nodeName 和 tagName 问题
(1)现有问题:
在Fx中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
有问题(具体情况没有测试,但我的IE已经死了好几次)。
(2)解决方法:
使用 tagName,但应检测其是否为空。
15. 元素属性
IE下 input.type属性为只读,但是Fx下可以修改
16. document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。
判断浏览器navigator.appName == "Microsoft Internet Explorer"
navigator.userAgent.indexOf("MSIE")>0
ff不支持
window.close()
innerText textContent
ff只有在window.open()的情况下支持window.close();但如果这个页是iframe也不行,建议用top.close.
children不支持,支持childNodes
ff读xml也要注意IE里面01234子节点,ff里面就变成13579了
IE
var opname=c.childNodes[0].text;
var opid=c.childNodes[1].text;
var opurl=c.childNodes[2].text;
var opuser=c.childNodes[3].text;
var opadress=c.childNodes[4].text
ff
var opname=c.childNodes[1].textContent;
var opid=c.childNodes[3].textContent;
var opurl=c.childNodes[5].textContent;
var opuser=c.childNodes[7].textContent;
var opadress=c.childNodes[9].textContent;
在mf中,自己定义的属性必须getAttribute()取得
但是千万注意,getAttribute()取得的值是不会变的,比如
var a=b.getAttribute("属性")
b.属性=100
var c=b.getAttribute("属性")
不管b.属性改成多少,a和c是相等的。
建议操作方式
全局变量 fag=0;
if(fag==0)
fag=b.属性=b.getAttribute("属性");
ff不能写function a.b()
{}
要写成a.b=function(){}
ff不支持src="file:///c:a.gif";
xmlHttp.setRequestHeader ff里面一定要大写
ff的ajax,IE里面可以有很多写法,但ff里面有时就会出错,下面写一种不会出错的写法
function GetDataFromServer( url, id )
{
if(window.XMLHttpRequest)
{ request = new XMLHttpRequest();}
else
if(window.ActiveXObject)
{ request = new ActiveXObject("MSXML2.XMLHTTP.5.0");}
var serverUrl = url ;
if( request )
{
window.status = "数据更新中...." ;
request.open("get",serverUrl,true) ;
request.setRequestHeader("content-type","application/x-www-form-urlencoded") ;
request.onreadystatechange = function(){onResponse(id);};
request.send(null) ;
}
}
function onResponse(id)
{
var xmlHttp=request;
if(xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
var result = xmlHttp.responseText ;
if(document.getElementById("load_"+id))
{
逻辑;
}
window.status = "数据更新完成" ;
}
}
}
同时支持IE和Firefox的日期控件---DatePicker
ie parentElement
ff parentNode
IE支持insertAdjacentElement,insertAdjacentHTML,insertAdjacentText
FF要实现
//--- 支持moz -------------------------------------------------------
if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement)
{
HTMLElement.prototype.insertAdjacentElement = function(where,parsedNode)
{
switch (where)
{
case 'beforeBegin':
this.parentNode.insertBefore(parsedNode,this);
break;
case 'afterBegin':
this.insertBefore(parsedNode,this.firstChild);
break;
case 'beforeEnd':
this.appendChild(parsedNode);
break;
case 'afterEnd':
if(this.nextSibling)
{
this.parentNode.insertBefore(parsedNode,this.nextSibling);
}
else
{
this.parentNode.appendChild(parsedNode);
}
break;
}
}
HTMLElement.prototype.insertAdjacentHTML = function(where,htmlStr)
{
var r = this.ownerDocument.createRange();
r.setStartBefore(this);
var parsedHTML = r.createContextualFragment(htmlStr);
this.insertAdjacentElement(where,parsedHTML);
}
HTMLElement.prototype.insertAdjacentText = function(where,txtStr)
{
var parsedText = document.createTextNode(txtStr);
this.insertAdjacentElement(where,parsedText);
}
}
attachEvent方法,为某一事件附加其它的处理事件。(不支持Mozilla系列)
addEventListener方法 用于 Mozilla系列
举例:
document.getElementById("btn").onclick = method1;
document.getElementById("btn").onclick = method2;
document.getElementById("btn").onclick = method3;
如果这样写,那么将会只有medhot3被执行
写成这样:
var btn1Obj = document.getElementById("btn1");
//object.attachEvent(event,function);
btn1Obj.attachEvent("onclick",method1);
btn1Obj.attachEvent("onclick",method2);
btn1Obj.attachEvent("onclick",method3);
执行顺序为method3->method2->method1
如果是Mozilla系列,并不支持该方法,需要用到addEventListener
var btn1Obj = document.getElementById("btn1");
//element.addEventListener(type,listener,useCapture);
btn1Obj.addEventListener("click",method1,false);
btn1Obj.addEventListener("click",method2,false);
btn1Obj.addEventListener("click",method3,false);
执行顺序为method1->method2->method3
◆Firefox 不支持 document.all
可以用如下函数:
getElementsByTagName("*") 可以得到得到所有元素的集合
getElemntById 可以按id得到某一元素
getElementsByName 可以得到按name属性得到某一元素
◆document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item(”itemName”) 这样的语句,不能在 MF 下运行
(2)解决方法:
改用 document.formName.elements[“elementName”]
◆集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms(”formName”) 改为 document.forms[”formName”]。
又如:document.getElementsByName(”inputName”)(1) 改为 document.getElementsByName(”inputName”)[1]
新代码(可在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 部分仍与老代码兼容。