JQuery Cross-Domain .load()(自构小部件)

我正在创建一个小部件供人们在他们的网站上使用,但为了保持小部件面向未来,我希望它是使用外部JavaScript自我构建。

因此,我要求人们在他们的网站上放置的小部件代码将是这样的:

mywidget.js然后使用jquery的.load()用iframe填充#my_widget div。

问题是这不起作用….

我需要做什么?

(注意我不想在我给客户的代码中使用iframe)

这取决于您在load函数中指定的url。 如果此URL未托管在同一域上,则由于相同的源策略限制,执行包含此脚本的页面将不起作用。 如果您可以控制load函数中使用的服务器端脚本,那么进行跨域ajax调用的一种可能的解决方法是使用JSON-P 。

以下是JSON-P背后的想法:

  1. 您提供在域A上托管的服务器端脚本,该脚本将返回JSONP格式的响应。 域A是您完全控制的域。
  2. 可以使用AJAX从域B调用此服务器端脚本。

假设http://domainA.com/myscript?jsoncallback=foo返回以下响应:

 foo({ result: 'Hello World' }); 

现在在mywidget.js你可以调用这个脚本:

 $.getJSON('http://domainA.com/myscript?jsoncallback=?', function(data) { $('#my_widget').html(data.result); }); 

剩下的就是告诉用户包含mywidget.js脚本并提供一个占位符id="my_widget"来托管结果(你甚至可以在成功回调中生成这个占位符)。

备注:使用JSONP时,您仅限于GET请求。 这意味着您可以发送的请求大小有限制。

由于您在其网站上执行代码,因此您可以完全控制其页面。

您可以创建iframes document.createElement("iframe") ,将其注入页面document.getElementById("my_widget").appendChild(iframe)任何位置,并执行您想要的任何其他操作。

有一点需要注意的是不要弄乱他们的命名空间…避免任何通常的命名空间并组成你自己的(__ my_widget或其他任何奇怪的东西)。 并尝试将名称空间计数保持为1,如果可能,甚至不保留。

如果您只是尝试从您的网站加载html,请不要使用加载 ,请使用iframe。