【问题标题】:Cross-domain Ajax call gets no element found Location: moz-nullprincipal跨域 Ajax 调用未找到元素位置:moz-nullprincipal
【发布时间】:2011-08-13 23:41:47
【问题描述】:

我正在尝试通过jquery调用$.ajax()来调用一个跨域的web服务,服务返回

<?xml version="1.0" encoding="utf-8"?>
<double xmlns="http://www.webserviceX.NET/">1.4248</double>

如果我指定 dataType xml(或未指定任何内容 - jquery 猜测正确),我会收到 XML Parsing Error: no element found Location: moz-nullprincipal:{4030734c-b902-4251-9067-1d1b5b15fc72} Line Number 1, Column 1: 错误(看起来服务没有返回任何内容)。但是,如果我指定 dataType jsonp 或 script - 我可以在萤火虫中看到一切都恢复正常;然而 jquery 显然试图评估结果并给我相应的错误(缺少分号或类似的)。

jQuery 中有没有办法启用跨域调用而不求值?

注意事项:

  1. 我知道后备选项是调用我的服务器上的程序,该程序将调用 Web 服务并将结果返回给浏览器;
  2. 我确实指定了 crossDomain: true。好像没什么区别。
  3. “错误”函数确实被调用。但不是原始值“数据”包含“解析错误”。

【问题讨论】:

    标签: jquery cross-domain


    【解决方案1】:

    跨域 ajax 只允许用于 JSONP,不允许用于 XML

    在 JQuery 1.5 中,他们添加了 crossDomain:true 参数,该参数只是将 ?callback=&gt; 值附加到 url。如果设置该参数,则还必须设置dataType:'json'。跨域 URL 还必须支持 JSONP 并提供您预期的数据。

    【讨论】:

    • 哇!在 5 分钟内得到了一个已经得到支持的答案 :) 无论如何,“只允许 JSONP”由谁?通过浏览器或 JQuery。换句话说,是 浏览器 试图将结果解析为有效的 JSON 或脚本吗?我还以为是 JQuery!
    • 通过浏览器 - 它有一个same origin policy 以防止跨域脚本在用户不知情的情况下执行。 JSONP 通过将外部脚本包装在回调函数中,然后在客户端执行该函数来解决这个问题。您可以做的是将您的外部脚本设置为 JSONP,并让 JavaScript 将您的 XML 包装在回调中,然后在收到后将其解析出来。
    • 坦率地说,我不太明白你的最后评论。我知道什么是同源策略 (SOP) - 这就是我强调跨域的原因。在这种情况下,“外部脚本”是什么意思?网络服务?你是什​​么意思“JSONP绕过那个”......它是否指示浏览器绕过SOP?最后,“将外部脚本设置为 JSONP”是什么意思?更改 Web 服务以返回 JSON 结果,而不是 XML?它是公共的第三方 WS。我正在消费服务!看起来我将在服务器上设置一个“代理”(或说服服务提供商也以 JSON 格式返回结果)。
    • 谢谢。我不知道YQL。但是,我仍然有基本的问题。如果浏览器阻止下载XML,YQL如何克服它,为什么JQuery不能自己做呢?它是否适用于某些从真实来源获取 XML 然后将其包装在 JSON 中的 Yahoo 服务器?希望我能在 YQL 文档中得到答案……
    • 因为它不允许跨域插入可执行代码。 JSONP 欺骗浏览器 - 外部域将其代码包装在回调函数中,然后 ajax url 包含?callback=?,因此它由主脚本执行,而不是远程脚本。
    猜你喜欢
    • 2012-08-22
    • 2013-05-31
    • 2017-02-01
    • 2016-02-20
    • 1970-01-01
    • 2013-07-02
    • 2011-02-03
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多