动态插入的 <script> 标签是否有效?

IT技术 javascript html javascript-events
2021-03-12 08:48:31

我有一些代码,其中<script type="text/javascript">动态插入了一个块。

这个块包含一个函数,它<input type="button">上面有一个元素(也是动态插入的),用onclick属性调用它

但是,它不起作用,Firebug 说当我尝试单击该按钮时未定义该函数。

这是可以预期的,如果可以,是否有解决方法?

3个回答

如果您将它写入一个 innerHTML 属性,则它不会工作,除非在 IE 中存在 DEFER 属性:

scriptParentNode.innerHTML = '<span/><script defer="defer" type="text/javascript">blah();</script>';

您的选择是,a) 使用 DOM 创建元素并附加它:

var head = document.getElementsByTagName("head")[0];
var sTag = document.createElement("script");
sTag.type = "text/javascript";
sTag.text = "blah();";
head.appendChild(sTag);

或 b) 在解析 HTML 时使用 document.write(但不是之后!)

<head>
  <script type="text/javascript">
    document.write('<script type="text/javascript">blah();</script>');
  </script>
</head>

编辑

看到我显然因为有关 defer 属性不正确的信息而被否决,我觉得有必要从MSDN 文档中发布一个工作示例虽然 IE 确实从 innerHTML 字符串的开头删除了 NoScope 元素,但可以通过在 HTML 字符串的开头添加一个作用域元素来解决这个问题(上面更新的示例):

<HTML>
<SCRIPT>
function insertScript(){
    var sHTML="<input type=button onclick=" + "go2()" + " value='Click Me'><BR>";
    var sScript="<SCRIPT DEFER>";
    sScript = sScript + "function go2(){ alert('Hello from inserted script.') }";
    sScript = sScript + "</SCRIPT" + ">";
    ScriptDiv.innerHTML = sHTML + sScript;
}    
</SCRIPT>
<BODY onload="insertScript();">
    <DIV ID="ScriptDiv"></DIV>
</BODY>
</HTML>

可以随意单击 MSDN 文档中的“显示给我”按钮以获取工作示例。[链接]

我正在使用 DOM 方法。谢谢。
2021-04-26 08:48:31

如果你正在使用类似的东西

document.getElementById('foo').innerHTML = blah

那么不,它不会工作。

一个简单的解决方法是使用jQuery进行插入,这执行该块中的脚本。只需html在元素上使用该函数,将您的 HTML/脚本块传递给它。

AndyE,我真的同意你的看法——让别人告诉你“使用图书馆”通常不是很有帮助。然而,在这个特定的答案中,我纯粹是根据经验说话,而 jQuery 是我用来解决问题的工具;老实说,我不知道基于 DOM 的替代方案有效。当时没有答案,所以我认为使用 jQuery 总比没有好。
2021-04-29 08:48:31
别介意我,现在是凌晨 2 点,我脾气暴躁:-) 我记得,当我还在写我的时候,你得到了你的答案,我同意,答案是一天结束时的答案,jQuery始终是大多数开发人员的合适选择。
2021-05-06 08:48:31
我实际上是一个 jQuery 用户,但是对于这个特定的实例,我不想使用库
2021-05-11 08:48:31
和我一样,只是在许多情况下不需要跨浏览器兼容性(内部网、桌面小部件等),虽然库仍然可以使事情变得更容易,但它们有时可能会矫枉过正。我想知道是否有人知道图书馆之外的 javascript ......
2021-05-12 08:48:31
只有我不特别喜欢得到“使用 xxx 库”之类的答案吗?如果他只写了 5 行代码,那么浏览器下载并解析一个库来执行一个简单的功能真的值得吗?
2021-05-13 08:48:31

动态插入客户端还是服务器端?

服务器端它会工作 - 假设服务器端调用不是 AJAX 回发(因为实际上实际的动态插入仍然是客户端)。

客户端不会(您不能简单地在页面已经加载并期望它执行后将 java 脚本注入到页面中)。在这种情况下,您必须实际明确地执行 JavaScript,或者使用像 jQuery 这样的框架来为您执行此操作。