嵌套ajax调用时抛出“安全错误:Dom异常”

时间:2012-10-30 13:06:42

标签: javascript jquery ajax cross-domain

这是问题所在。我正在通过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

我的理论是,这与跨域问题有关,但我无法理解为什么。我当然无法弄清楚如何解决这个问题。

我很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

例如,以下网址都被视为彼此跨域。

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

以上所有网址都会被视为跨域,即使它们位于同一台服务器上。