jQuery $ .ajax作为本地HTML文件运行,避免SOP(相同的原始策略)

我创建了一个包含以下内容的HTML文件foo.html

    $.ajax({url:"http://foo.com/mdata", error: function (results) { alert("fail"); }, success: function (result) { alert("sucesses"); } });  

当我在Web浏览器中加载此HTML文件时,它始终显示一个失败的对话框。

  1. 知道为什么会这样吗?
  2. 另外,调试此方法的最佳方法是什么?

PS:

假设http://foo.com/mdata是有效的Web服务路径。

编辑#1

使用$ .getJson http://jsfiddle.net/dpant/EK3W8/,类似的代码与我完美配合

我也将内容保存为.html文件,并且从file://请求到Web服务似乎也有效。

    img{ height: 100px; float: left; }    
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", { tags: "mount rainier", tagmode: "any", format: "json" }, function(data) { $.each(data.items, function(i,item){ $("").attr("src", item.media.m).appendTo("#images"); if ( i == 3 ) return false; }); });

看起来大多数浏览器都支持CROS,所以你可以编写一个脚本保存为.html并在浏览器中打开它,它会成功执行Ajax请求* 只要你提出请求的服务器支持它* 。 在这种情况下,我的Web服务器(服务)不支持CROS(Apache的默认配置不支持它)。

许多网络服务已启用CROS,例如http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback= ? 因此请求成功通过。

几个链接:

http://enable-cors.org/

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

它总是失败有两个原因:

  • 您需要一个能够回答您的请求的网络服务器(200 =成功,404即错误),您可以轻松设置一个,在Windows和Mac上查看Bitnami
  • 您无法通过AJAX调用其他域。 如果您在www.example.com上运行脚本,则无法请求www.example.net 查看相同的原始策略 。

实际上,我们正在通过域发送一个AJAX请求,以便它发生。 我试过这段代码。 在我的机器上显示成功。

   

代码工作正常,添加$.support.cors=true ,它肯定适合你。

正如我所知,在内容脚本中,您无法进行任何跨域XHR。 您必须在扩展页面(例如“背景”,“弹出窗口”或甚至“选项”)中执行此操作。

有关内容脚本限制的更多信息,请参阅Google Developer’s Guide中的Content Scripts页面。

有关xhr限制的更多信息,请参阅XHR页面 。