【问题标题】:jQuery cannot retrieve data from localhostjQuery 无法从 localhost 检索数据
【发布时间】:2011-01-31 01:25:18
【问题描述】:

我有一个非常简单的 jQuery 来检索我的最新推文

$.getJSON("http://twitter.com/statuses/user_timeline/username.json?count=1", 
           function(data) {
              $("#tweet_text").html(data[0].text);
           });

这适用于我桌面上的简单 HTML 文件。但是,一旦从我的本地主机(apache)访问该文件,就不会返回任何数据。我想知道Apache的任何部分是否以某种方式阻止了请求?还是有其他想法?

【问题讨论】:

  • 您的浏览器执行的是 JS,而不是 Apache,因此不怪 Apache。你真的需要比“它不起作用”更具体。 Twitter 会返回哪些标头?状态码?

标签: jquery ajax apache json


【解决方案1】:

这是一个shorthand Ajax函数,相当于:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: success
});

Ajax (Non-JSONP) 不允许跨域。

【讨论】:

  • Ajax 非常允许跨域。
  • 你倒退了!只有在使用访问控制并且并非所有浏览器都支持它并且很少有服务器可能启用它的情况下,XMLHttpRequest 才允许跨域。您当然可以加载和执行由其他域提供的脚本。例如,这就是谷歌分析的工作方式。我已经编写了数百个直接从 ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js 加载 jQuery 以及使用 code.google.com/apis/ajax/documentation/#GoogleLoad 的脚本
  • 几乎每个浏览器都允许您使用 JS 从任何外部域获取数据。 XSS 是指尝试与脚本或另一个域(窗口到窗口、帧到帧等)上的 DOM 交互的脚本。简单地从另一个域调用数据不应该调用 XSS 过滤器。工作示例:jsbin.com/okoko/3/edit(其中 jsbin.com 从 stackoverflow.com 加载 json 资源)
  • 您的脚本不是 ajax,即 XMLHttpRequest!它通过创建一个脚本标签来工作,该标签将 JSONP 作为 javascript 加载,并在加载到页面的那一刻执行。但是如果没有 JSONP,.getJSON 会失败,因为标准 ajax 不允许跨域访问!
  • 没错,它不是 XMLHttpRequest。我想这只是Aj。但对许多业余爱好者来说,这种区别并不直观。我会取消我的反对票,因为您的回答在技术上是正确的,尽管我认为它没有用。有用的是提及相同的原始策略,以及 jsonp 与 ajax 的不同之处。就目前而言,这无助于解决问题。
【解决方案2】:

尝试将 callback=? 附加到 URL。像这样

"http://twitter.com/statuses/user_timeline/username.json?count=1&callback=?"

【讨论】:

    【解决方案3】:

    可能由于某种原因,在 localhost 上加载 html 需要更长的时间,并且您还没有将脚本包装在准备好的 dom 中。所以它打了一个电话,当时没有#tweet_text可以填写

    【讨论】:

      【解决方案4】:

      由于Same-origin Policy,JavaScript 目前无法跨域直接请求。

      您最好的选择可能是为此查看JSONP

      您可以从jQuery 找到更多信息:

      如果 URL 包含字符串“callback=?”在 URL 中,请求被视为 JSONP。有关详细信息,请参阅 $.ajax() 中对 jsonp 数据类型的讨论。

      Twitter:

      参数:

      • 回调:可选。 仅适用于 JSON 格式。如果提供,响应将使用带有给定名称回调的 JSONP 格式。

        • 示例:http://search.twitter.com/search.json?callback=foo&q=twitter

      希望这会有所帮助。


      更正...

      如果status/user_timeline 支持 JSONP,则没有这样的记录。

      您可能需要考虑设置Cross-Domain Proxy 以获取您想要的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 2014-05-26
        • 1970-01-01
        相关资源
        最近更新 更多