测试代码如下:
xml.xml 一个简单的xml文件
<?xml version="1.0" encoding="gb2312"?>
<data>abc</data>
test.htm: 一个简单的使用xmlhttprequest获取xml资源的页面:
<html>
<head>
<script type="text/JavaScript">
<!--
document.domain="emu.emu.com"
var newsXML;
function init(){
newsXML = window.XMLHttpRequest?(new XMLHttpRequest()):(new ActiveXObject("Microsoft.XMLHTTP"));//选择合适的xmlhttprequest控件
newsXML.onreadystatechange= handleXML;
newsXML.open("GET","xml.xml",true);
newsXML.send(null);
}
function handleXML(){
if(newsXML.readyState==4){
alert(newsXML.responseText)
try{
alert(newsXML.responseXML.getElementsByTagName("data").length)
}catch(e){
alert(e)
}
}
}
//-->
</script>
</head>
<body onload="init()">
测试firefox的bug
</body>
</html>
注意这一行:
document.domain="emu.emu.com"
配置WINDOWS\system32\drivers\etc\hosts:
127.0.0.1 localhost
127.0.0.1 emu.emu.com
好了,开启apache把上面的xml和htm文件发布出去,通过emu.emu.com域名来访问test.htm文件,结果报错:
调用方法 XMLDocument.getElementsByTagName 时权限不足
只要设置了domain,不管domain怎么设,getElementsByTagName 都肯定报权限不足错误。其实根本就没有任何跨域操作,而且连responseText都可以获得了,访问getElementsByTagName 还有什么权限限制的必要?莫名其妙!
在IE下运行就很正常。在firefox下把document.domain="emu.emu.com"这一行删除后也运行正常,因此确定是firefox的bug。
按照http://www.mozilla.org/projects/security/components/jssec.html 中的说明设置netscape.security.PrivilegeManager.enablePrivilege 来提升页面访问权限也无法解决此问题。
这个bug造成了合法的跨域xml请求(同一个父域)无法正确解析返回的xml数据(但是能访问文本信息)。这不是逼我用AjaH嘛?