如何将 <script> 元素添加到 DOM 并执行其代码?

IT技术 javascript html
2021-01-21 10:43:18

我想在现有的 DOM 中添加一个元素来运行 javascript 代码。

我用 YUI 做到了这一点:

var scriptNode = Y.Node.create('<script type="text/javascript" charset="utf-8">alert("Hello world!");<\/script>');
var headNode = Y.one('head');
headNode.append(scriptNode);

它已成功添加到 DOM 但它没有给我警报。

有人知道问题是什么吗?

2个回答

我不知道 YUI 的Node.create()功能是如何工作的,所以对此不予评论。但是一个简单的跨浏览器脚本是:

  window.onload = function() {
    var s = document.createElement('script');
    s.type = 'text/javascript';
    var code = 'alert("hello world!");';
    try {
      s.appendChild(document.createTextNode(code));
      document.body.appendChild(s);
    } catch (e) {
      s.text = code;
      document.body.appendChild(s);
    }
  }

在try..catch块是必要的,因为大多数浏览器,如第一种方法,但有些却没有,并抛出一个错误。第二种方法涵盖了那些。您也可以简单地评估代码,这或多或少与某些库的功能相同。

是的,这很好,因为错误是由将文本节点附加到脚本元素引起的。
2021-03-19 10:43:18
如果 catch 块代码满足更多浏览器,那为什么不简单地使用它呢?
2021-03-25 10:43:18
那你为什么不能只使用第二种方法呢?某些浏览器不适用于第二种方法?
2021-03-28 10:43:18
请注意,如果您评估代码而不是添加脚本元素,则document.currentScript将无法正确设置。如果您正在制作供其他人使用的工具,则他们的脚本代码可能取决于document.currentScript
2021-04-04 10:43:18
你不能把 document.body.appendChild(s) 放在 finally 子句下吗?
2021-04-09 10:43:18

我在 JQuery 源代码中找到了这个函数,它似乎可以做你想做的事情,而且感觉比我的其他方法更简洁。但话又说回来,我是一个 JS 初学者,可能看不到细节。无论如何,有人可能会从中拿走一些有用的东西。

function DOMEval( code, doc ) {
    doc = doc || document;

    var script = doc.createElement( "script" );

    script.text = code;
    doc.head.appendChild( script ).parentNode.removeChild( script );
}
removeChild 调用是什么?这不会删除您刚刚添加的脚本吗?我缺少什么技巧吗?
2021-03-13 10:43:18
@Danger 将代码附加到脚本标签中,立即执行,然后删除脚本标签进行清理。该函数称为 DOMEval,而不是 addScript 等。
2021-03-14 10:43:18
使用createTextNode将代码作为字符串附加。您通过text属性添加代码的解决方案对我来说是很好的解决方案
2021-03-29 10:43:18