我正在从另一个需要在其后立即运行脚本的Web服务中动态加载窗口小部件。该示例使用document.write()来执行此操作,但这不起作用,因为它在文档关闭之后才会运行,这意味着它会覆盖整个文档。我正在尝试使用纯JavaScript通过AJAX加载它:
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) { // success
eval(this.responseText);
}
};
xhttp.open("GET", "https://d3gxy7nm8y4yjr.cloudfront.net/js/embed.js", true);
xhttp.setRequestHeader('Content-type', 'application/javascript');
xhttp.send();
但是我收到以下错误:
XMLHttpRequest无法加载 https://d3gxy7nm8y4yjr.cloudfront.net/js/embed.js。没有 '访问控制允许来源'标题出现在请求的上 资源。起源' https://example.com'因此是不允许的 访问。
我能够使用此代码在我的测试服务器上使用jQuery使其工作:
$.ajax({
dataType: "script",
cache: true,
url: "https://d3gxy7nm8y4yjr.cloudfront.net/js/embed.js"
});
但是,我不能在我的生产服务器上使用jQuery,因为......好吧......工作政治。
jQuery如何在没有错误的情况下完成此任务,我怎样才能在纯JavaScript中完成?
如@shabs所述,$.ajax
会向document.head
添加脚本标记,然后立即将其删除。我通过添加断点检查了这一点,并在Chrome的检查员中看到它已添加和删除。无论文件是什么,它都会在当前脚本完成后立即删除该文件。这适用于立即调用的脚本,但我不知道这对于像库这样的东西是如何工作的。
对于纯JavaScript实现,我使用了以下代码:
var widgetScript = document.createElement("script");
widgetScript.async = true;
widgetScript.src = "https://d3gxy7nm8y4yjr.cloudfront.net/js/embed.js";
document.head.append(widgetScript);
widgetScript.remove();
答案 0 :(得分:2)
相关资源不支持CORS。
这适用于$.ajax
,因为当您指定dataType: "script"
时,jQuery实际上会将<script>
标记附加到document.head
! *
是否有一个特殊原因你不仅仅使用像<script type="text/javascript" src="https://d3gxy7nm8y4yjr.cloudfront.net/js/embed.js"></script>
这样的东西?
* (这对我来说是新闻!documentation for $.ajax
提到“脚本[...]请求不受相同的原始政策限制”,并且the source code确认了这一点。 )