javascript - 获取跨域脚本标签的内容

标签 javascript cross-domain requirejs innerhtml script-tag

我用 JavaScript 创建了一种新的编程语言,我希望用户能够像使用 script 标记的任何其他脚本一样将其包含在他们的网页中:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>My Prog Lang</title>
        <script src="scripts/myProgLang.js"></script>
        <script type="text/my-prog-lang" src="scripts/index.mypl"></script>
    </head>
</html>

想法是 myProgLang.js 将获取所有脚本的内容并执行它们:

window.addEventListener("DOMContentLoaded", function () {
    var scripts = document.querySelector('script[type="text/my-prog-lang"]');
    var length = scripts.length;

    for (var i = 0; i < length; i++) {
        var script = scripts[i];
        var src = script.getAttribute("src");
        var content = AJAX.getSync(src);
        myProgLang.eval(content);
    }
}, false);

这种方法的明显问题(除了进行同步 AJAX 调用外)是不同域上的脚本违反了同源策略。

显而易见的解决方案是使用脚本加载器,例如 RequireJS使用文本插件将脚本作为纯文本加载。

但是我不想为了这个任务而包含整个 RequireJS 框架。所以我做了一些挖掘并找到了这个答案:https://stackoverflow.com/a/4927418/783743

根据上面的回答:

The innerHTML property of the script element should give you the scripts content as a string provided the script element is:

  • an inline script, or
  • that the script has loaded (if using the src attribute)

不幸的是,这不起作用(至少在 Opera 上)。无法使用 innerHTML 属性访问使用 src 属性加载的脚本。

我还有哪些其他选择可以解决这个问题?

最佳答案

您需要发出 Ajax 请求...如果它与页面的域相同,它将正常加载,如果服务器发送了缓存 header ,则它应该使用现有副本。

如果它在另一个域上,您将需要 CORS header (在支持的情况下)和/或 JSONP 加载器。

关于javascript - 获取跨域脚本标签的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15039803/

相关文章:

javascript - 脚本加载顺序

backbone.js - RequireJS - 如何在 Backbone 加载 Underscore 之前对其进行配置?

javascript - 持续从 XML 节点获取文本

javascript - 导致跨域问题的 Facebook 点赞和 Twitter 推文按钮

javascript - 将发布数据发送到远程站点并显示结果

Apache 2.4 跨域

javascript - Require JS 仍然没有按顺序加载 shim 内容

javascript - 我的 HTML 按钮将我重定向到这个奇怪的 "Index of C:\"内容。我如何解决它?

javascript - 类型\"me\"的字段\"User\"必须具有一系列子字段

javascript - 为什么使用 Mongoose 将数据存储两次?