Javascript 从jQuery XML对象到字符串的转换引发安全错误
我有一个由jQuery根据REST Web服务的响应生成的XML对象:Javascript 从jQuery XML对象到字符串的转换引发安全错误,javascript,jquery,xml,dom,Javascript,Jquery,Xml,Dom,我有一个由jQuery根据REST Web服务的响应生成的XML对象: $.ajax({ type: "GET", url: "http://localhost:9299/foo", success:function(xml) { xmlDoc = $.parseXML(xml); $xml = $(xmlDoc); // The rest of the code manipulates the structure of t
$.ajax({
type: "GET",
url: "http://localhost:9299/foo",
success:function(xml) {
xmlDoc = $.parseXML(xml);
$xml = $(xmlDoc);
// The rest of the code manipulates the structure of the XML
}
});
现在我需要将修改后的XML对象作为字符串输出。我已经为Firefox和其他浏览器找到了这个解决方案:
out = new XMLSerializer().serializeToString($xml);
但我在这里得到的只是以下错误消息:
[Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "http://localhost/bar"]
我需要的所有文件都在localhost上(包括为我提供XML和jQuery库的webservice)
任何想法都将不胜感激
编辑:
我简化了问题并尝试了以下代码:
$xml = $('<?xml version="1.0"?><root><element>bla</element><element>blubb</element></root>');
$xml.find("element").each(function() {
alert($(this).text());
});
out = new XMLSerializer().serializeToString($xml);
最后一行不变:
out = new XMLSerializer().serializeToString($xml);
首先,我无法根据您的代码确认/拒绝这是否是跨域请求。跨域是指外部文件的端口号、域或协议与请求外部文件的端口号、域或协议不同 如果确实是跨域请求,则需要实现或使用服务器端代理为您请求 其次,您不需要使用
$.parseXML()
。试试这个:
$.ajax({
type: "GET",
url: "/foo",
dataType: "xml",
success:function(xml) {
var $xml = $(xml);
// The rest of the code manipulates the structure of the XML
}
});
XML还必须有效,才能在所有浏览器中工作
编辑:所以,这不是跨域问题,也不是jquery问题。这里还有一些调试:我在那里使用了一个非常简单的xml文档,您能用xml替换这个简单的xml文档吗?您不需要解析输出,因为jQuery可以推断它。在任何情况下,都可以指定数据类型
$.ajax({
type: "GET",
url: "http://localhost:9299/foo",
dataType: "xml",
success:function(xml) {
$xml = $(xmlDoc);
// The rest of the code manipulates the structure of the XML
}
});
您需要通过指定jQuery对象中的第一个元素来访问jQuery对象的XMLDOM属性
out = new XMLSerializer().serializeToString($xml[0]);
此外,XMLSerializer在IE<9中不可用。对于IE8,请使用以下命令
out = $xml[0].xml;
或者作为jquery扩展
$.fn.xml2string = function(){
if (window.XMLSerializer) {
return (new XMLSerializer()).serializeToString(this[0]);
} else if (typeof this[0].xml != "undefined") {
return this[0].xml;
}
return "";
};
谢谢,包含$.parseXML()的行实际上是不必要的。不幸的是,它仍然不起作用。正如您所提到的,我的Web服务的端口号实际上不同于使用接口的jquery。但这不重要,因为我将数据保存在局部变量xml中,然后才引用它,还是我错了?其余所需文件(如jquery库)在同一台服务器(和端口)上可用。如果如您所建议的那样是跨域的,则不可能使用javascript请求它,除非您实现CORS或使用服务器端代理脚本为您请求它。但是我已经能够加载webservice响应并更改/输出其DOM的不同部分(在相应的对象中)。为什么这样做是可行的,而从本地对象到普通字符串的转换是无效的?您可能已经实现了CORS,如果您没有实现,它早就失败了。现在我已经简化了这个问题,但没有成功。(见我文章中的编辑)关于你最近的编辑。您没有将其解析为XML。您的Edit2,如果您像我的回答中那样设置
数据类型:“xml”
,您不需要$.parseXML()
为什么IE8示例使用函数xml()
,而xml2string函数使用属性xml
。在这两种情况下,它不应该都是财产吗?(或者两种情况下都是函数?)你说得对。xml是IE8中xml节点的属性。它不应该有括号。答案已更新。
$.fn.xml2string = function(){
if (window.XMLSerializer) {
return (new XMLSerializer()).serializeToString(this[0]);
} else if (typeof this[0].xml != "undefined") {
return this[0].xml;
}
return "";
};