Javascript 是动态插入的<;脚本>;标签是用来工作的吗?

Javascript 是动态插入的<;脚本>;标签是用来工作的吗?,javascript,html,javascript-events,Javascript,Html,Javascript Events,我有一些代码,其中动态插入了块 此块包含一个函数,它上面有一个元素(也动态插入),使用onclick属性调用它 但是,它不起作用,Firebug说,当我尝试单击按钮时,函数没有定义 这是可以预期的吗?如果可以,是否有解决方法?如果您正在使用 document.getElementById('foo').innerHTML = blah 那就不行了 一个简单的解决方法是使用插入,插入将在该块中执行脚本。只需对元素使用html函数,将html/脚本块传递给它。动态插入客户端还是服务器端 服务器端它

我有一些代码,其中动态插入了

此块包含一个函数,它上面有一个
元素(也动态插入),使用
onclick
属性调用它

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


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

如果您正在使用

document.getElementById('foo').innerHTML = blah
那就不行了


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

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

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


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

如果您要将其写入innerHTML属性,IE中存在DEFER属性时除外:

scriptParentNode.innerHTML = '<span/><script defer="defer" type="text/javascript">blah();</script>';
或者b)在解析HTML时使用document.write(但不要在解析之后!)


写('blah();');
编辑

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


函数insertScript(){
var sHTML=“
”; var sScript=“”; sScript=sScript+“函数go2(){alert('Hello from inserted script.')}”; SSCcript=SSCcript+“”; ScriptDiv.innerHTML=sHTML+sScript; }

请随意点击MSDN文档中的“Show me”(显示我)按钮,查看一个工作示例。[]

是的,如果你做得对,那应该行得通。发布代码&我们会让您知道……您是否查看了页面源代码并验证了函数是否按照预期插入?这取决于您对“动态插入”的定义。请定义它。@Crescent Fresh:我很清楚他的意思-你可以用多少种不同的方式定义动态插入?Firebug显示了标签,当我点击“编辑HTML…”时,JavaScript显示得很好。只是我不太喜欢得到“使用xxx库”这样的答案吗?如果他只写了5行代码,那么浏览器下载并解析一个库来执行一个简单的功能真的值得吗?我实际上是一个jQuery用户,但是在这个特定的例子中,我不想使用库。我也是,只是有一些场景不需要跨浏览器兼容性(内部网、桌面小部件等)虽然库仍然可以让事情变得更简单,但有时可能会有些过火。我确实想知道,是否有些人知道库之外的javascript……而且,我在这里真的同意你的观点——让人告诉你“使用库”通常没有太大帮助。然而,在这个特定的答案中,我纯粹是根据经验来回答的,而jQuery是我用来解决这个问题的工具;老实说,我不知道基于DOM的替代方案是有效的。当时没有答案,所以我想使用jQuery总比不使用要好。别介意,当时是凌晨2点我脾气暴躁:-)我记得,你在我还在写我的答案的时候得到了你的答案,我同意,答案是一天结束时的答案,jQuery总是适合大多数开发人员的选择。我使用的是DOM方法。谢谢
var head = document.getElementsByTagName("head")[0];
var sTag = document.createElement("script");
sTag.type = "text/javascript";
sTag.text = "blah();";
head.appendChild(sTag);
<head>
  <script type="text/javascript">
    document.write('<script type="text/javascript">blah();</script>');
  </script>
</head>
<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>