我用 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/