1

这就是问题所在。我正在通过 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 调用的“成功”部分调用它时,出现以下错误:

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

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

我会很感激任何帮助。

4

1 回答 1

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,或者让您的网络服务返回 JSONP。

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

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

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

于 2012-10-30T14:18:53.957 回答