【问题标题】:"Security Err: Dom Exception" thrown when nesting ajax calls嵌套 ajax 调用时抛出“Securityerror: Dom Exception”
【发布时间】:2012-10-30 22:18:53
【问题描述】:

这就是问题所在。我正在通过 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 服务作为我的项目(事实上,它是项目的一部分)。

我的网络服务 (GmailHelperService) 连接正确,因为我绝对可以在其他地方调用它(例如,在这个 ajax 调用之后)。但是,当我尝试在 ajax 调用的“成功”部分中调用它时,出现以下错误:

未捕获的错误:SECURITY_ERR:DOM 异常 18

我的理论是这与跨域问题有关,但我不明白为什么。我当然不知道如何解决这个问题。

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 您的dataType"jsonp",这意味着您的数据将在成功回调中成为有效的JavaScript 对象。为什么然后将其解析为 XML?这有什么意义呢?它是一个 JavaScript 对象,而不是一个 XMLString...
  • 嗨,凯文,感谢您的回复。我发现这段代码隐藏在谷歌文档中的某个地方,用于实现他们的联系人 API,所以我没想到要更改它。无论如何,它传回的数据(resp)与 jsonp 相差甚远。它只是一个 xml 文档的字符串表示形式。

标签: javascript jquery ajax cross-domain


【解决方案1】:

JSONP 是一种数据传输方法,涉及以这种格式发送数据:

callback({"foo":"bar"});

如您所见,这不是 xml。它是 JSON 封装在一个回调方法中,将在请求加载完成时执行,从而允许它是跨域的,因为它可以使用 <script> 标签来请求。

您不能简单地将数据类型更改为 JSONP 并返回 xml,期望它能够正常工作。 XML != JSONP。但是,您可以在 jsonp 中返回 XML,例如 callback({"xml","... xml string here "}),但请注意引号,所有 json 键和值必须用双引号括起来,内引号需要适当处理。

如果您的请求是相同的域请求(相同的协议、相同的子域、相同的域和相同的端口),那么您可以在返回 XML 时将 dataType 更改为“XML”。否则,您需要设置代理脚本来为您获取 xml,或者让您的网络服务返回 JSONP。

例如,以下 url 都被认为是跨域的。

http://example.com
http://www.example.com
https://example.com
https://www.example.com
http://example.com:8080

上述所有 url 都将被视为跨域,即使它们位于同一服务器上。

【讨论】:

  • 好的,很有趣,但有点混乱。基于这个答案,我不确定如何调整事情以使其发挥作用。我的意思是,在上面的代码中,我从来没有调用过“callGmailHelperWebService”,而是我只是将解析结果输入到一个对象数组中(就像我所做的那样),它可以工作。唯一不起作用的是调用“callGmailHelperWebService”的函数,它启动了我自己的 Web 服务。那么如何将你所说的应用到我的网络服务(它需要一个字符串作为参数,并得到一个)。
  • 你的网络服务是跨域的吗?
  • 没有。无论如何,我的 Web 服务肯定可以在我的代码中运行。毕竟,如果我在 $.ajax() 之外调用“callGmailHelperWebService”(但在同一个函数“getUserInfo”中,它可以工作。
  • 啊,好吧,所以这与网络服务无关。您能否进一步调试以查看究竟是哪一行引发了该错误?
  • 你说得对,虽然我很惭愧地承认这一点,但进一步调试确实发现了问题。事实证明,当我期待一个字符串时,我正在向我的 Web 服务传递解析的字符串(即 xml)。我不敢相信我没有看到。抱歉,但感谢您的帮助。
猜你喜欢
  • 2014-05-12
  • 2019-11-11
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2012-06-12
相关资源
最近更新 更多