Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从jQuery XML对象到字符串的转换引发安全错误_Javascript_Jquery_Xml_Dom - Fatal编程技术网

Javascript 从jQuery 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

我有一个由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 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 "";
};