小编典典

为什么我不能从jQuery加载方法加载外部资源?

ajax

在使用jQuery学习Ajax请求的过程中,我尝试通过单击链接来加载google主页。所以我写了类似的东西:

$("#ajax").click (function (event) {
    $("#g").html("Loading...");
    $("#g").load("http://www.google.com");
    event.preventDefault ();
});

在身体某处:

<a id="ajax" href="http://www.google.com">Load file ajax way</a>
<div id="g">Click the above link to load the page...</div>

哪个没有用,最初我以为是语法错误或某些错误。但是后来,当我在服务器上用静态html文件替换google url时,它可以正常工作。

$("#g").load("Temp.htm");

它是设计成这样工作的(如果是,为什么?),或者我做错了什么?

编辑:请问有人可以解释(或引用)跨域ajax调用引入的安全性问题吗?换句话说,为什么可以安全地打开另一个浏览器选项卡并打开google而不从页面内部打开?是为了保护呼叫者或被呼叫者?


阅读 239

收藏
2020-07-26

共1个答案

小编典典

jQuery使用ajax(XMLHttpRequest)请求来加载数据,但是浏览器允许此请求用于同一域上的资源。(上面的答案提到了同源政策)。这就是为什么它可与Temp.htm一起使用的原因,而不适用于www.google.com。

  • 解决此问题的一种方法是创建一个服务器脚本,该脚本将为您加载页面-基本上是代理。然后你打电话

    $('#g').load("load.php?url=google.com")
    
  • 另一个解决方案是使用iframe进行通信-我发现了这个库,这似乎是您所需要的:jquery-crossframe

  • 第三个选项是JSONP,但在您的情况下不起作用。

我的意见-选择服务器端代理作为第一选择。


为什么会有相同的原产地政策?

想象一下,您正在检查eBay帐户上的某些内容。然后,在另一个选项卡中,打开我的网站,我在其中的脚本中发出了一系列向ebay发出请求(您仍处于登录状态)的出价,甚至在没有引起注意的情况下竞标奥迪A8。烦人…如果是您的银行,可以直接从您那里窃取资金。

具有讽刺意味的是,尽管采用了相同的来源策略,但仍可能发生上述攻击。

2020-07-26