我在 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
根据上面的答案:
脚本元素的 innerHTML 属性应该以字符串形式提供脚本内容,前提是脚本元素是:
- 内联脚本,或
- 脚本已加载(如果使用 src 属性)
不幸的是,这不起作用(至少在 Opera 上)。使用属性加载的脚本src
无法使用属性访问innerHTML
。
我还有什么其他选择来解决这个问题?