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

unr*_*ity 4 html javascript javascript-events

我有一些<script type="text/javascript">动态插入块的代码.

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

但是,它不起作用,并且Firebug说我尝试单击按钮时没有定义该功能.

这是可以预料的,如果有的话有解决方法吗?

And*_*y E 9

如果你将它写入innerHTML属性,除了在IE中存在DEFER属性时它将不起作用:

scriptParentNode.innerHTML = '<span/><script defer="defer" type="text/javascript">blah();</script>';
Run Code Online (Sandbox Code Playgroud)

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

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

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

<head>
  <script type="text/javascript">
    document.write('<script type="text/javascript">blah();</script>');
  </script>
</head>
Run Code Online (Sandbox Code Playgroud)

编辑

看来显然是因为有关延迟属性不正确的信息,我觉得有必要从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>
Run Code Online (Sandbox Code Playgroud)

您可以随意单击MSDN文档中的"显示我"按钮以获取工作示例.[ 链接 ]