问题来了。我通过 javascript/jquery 中的 ajax 调用提取 Gmail 联系人,如下所示:
function getUserInfo() {
var xml_parse = "";
$.ajax({
url: SCOPE + '?max-results=9999&access_token=' + acToken
data: null,
success: function (resp) {
xml_parse = $.parseXML(resp);
callGmailHelperWebService(xml_parse);
},
dataType: "jsonp"
});
}
function callGmailHelperWebService(xml_parse) {
GmailHelperService.ConvertXMLToList(xml_parse, onSuccess, onFailed, null);
}
因此,如您所见,如果初始 ajax 调用成功,我将调用一个函数,该函数调用位于保存服务器上的 Web 服务作为我的项目(事实上,它是项目的一部分)。
我的 Web 服务 (GmailHelperService) 已正确连接,因为我绝对可以在其他地方调用它(例如,在这个 ajax 调用之后)。但是,当我尝试在 ajax 调用的“成功”部分中调用它时,出现以下错误:
Uncaught Error: SECURITY_ERR: DOM Exception 18
我的理论是这与跨域问题有关,但我不明白为什么。我当然不知道如何解决这个问题。
如果有任何帮助,我将不胜感激。
最佳答案
JSONP 是一种数据传输方法,涉及以以下格式发送数据:
callback({"foo":"bar"});
如您所见,这不是 xml。它是封装在回调方法中的 JSON,该回调方法将在请求加载完成时执行,从而允许它跨域,因为可以使用 <script>
来请求它。标签。
您不能简单地将数据类型更改为 JSONP 并返回 xml,并期望它能够正常工作。 XML!= JSONP。但是,您可以在 jsonp 中返回 XML,例如 callback({"xml","... xml string here "})
但请注意引号,所有 json 键和值都必须用双引号括起来,内引号需要适当处理。
如果您的请求是相同域请求(相同协议(protocol)、相同子域、相同域和相同端口),那么如果您返回 XML,则可以将数据类型更改为“XML”。否则,您需要设置一个代理脚本来为您获取 xml,或者让您的 Web 服务返回 JSONP。
例如,以下网址均被视为跨域。
http://example.com
http://www.example.com
https://example.com
https://www.example.com
http://example.com:8080
以上所有网址都将被视为跨域,即使它们位于同一服务器上。
关于javascript - "Security Err: Dom Exception"嵌套ajax调用时抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13139673/