JQuery Cross-Domain .load()(自构小部件)
我正在创建一个小部件供人们在他们的网站上使用,但为了保持小部件面向未来,我希望它是使用外部JavaScript自我构建。
因此,我要求人们在他们的网站上放置的小部件代码将是这样的:
mywidget.js
然后使用jquery的.load()
用iframe填充#my_widget
div。
问题是这不起作用….
我需要做什么?
(注意我不想在我给客户的代码中使用iframe)
这取决于您在load
函数中指定的url。 如果此URL未托管在同一域上,则由于相同的源策略限制,执行包含此脚本的页面将不起作用。 如果您可以控制load
函数中使用的服务器端脚本,那么进行跨域ajax调用的一种可能的解决方法是使用JSON-P 。
以下是JSON-P背后的想法:
- 您提供在域A上托管的服务器端脚本,该脚本将返回JSONP格式的响应。 域A是您完全控制的域。
- 可以使用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。