你如何执行一个dynamic加载的JavaScript块?

我正在一个网页上,我正在进行一个AJAX调用,返回一个HTML块如下:

<div> <!-- some html --> <script type="text/javascript"> /** some javascript */ </script> </div> 

我将整个东西插入到DOM中,但是JavaScript没有运行。 有没有办法来运行它?

一些细节:我无法控制脚本块中的内容(所以我不能将其更改为可以调用的函数),我只需要执行整个块。 我不能在响应中调用eval,因为JavaScript在更大的HTML块内。 我可以做一些正则expression式来分离出JavaScript,然后调用eval,但是这很糟糕。 任何人都知道更好的方法?

通过设置元素的innerHTML属性添加的脚本不会被执行。 尝试创build一个新的div,设置其innerHTML,然后将这个新的div添加到DOM。 例如:

 <HTML>
 <HEAD>
 <script type ='text / javascript'>
函数addScript()
 {
     var str =“<script> alert('我在这里'); <\ / script>”;
     var newdiv = document.createElement('div');
     newdiv.innerHTML = str;
    的document.getElementById( '目标')的appendChild(newdiv)。
 }
 </ SCRIPT>
 </ HEAD>
 <BODY>
 <input type =“button”value =“添加脚本”onclick =“addScript()”/>
 <div> hello world </ div>
 <div id =“target”> </ div>
 </ BODY>
 </ HTML>

如果您使用响应来填充div或其他内容,则不必使用正则expression式。 您可以使用getElementsByTagName。

 div.innerHTML = response; var scripts = div.getElementsByTagName('script'); for (var ix = 0; ix < scripts.length; ix++) { eval(scripts[ix].text); } 

而@Ed接受的答案。 在当前版本的Firefox,Google Chrome浏览器或Safari浏览器中无法正常工作,为了调用dynamic添加的脚本,我设法熟悉他的示例。

必要的更改只能以脚本添加到DOM的方式进行。 而不是将其作为innerHTML添加,窍门是创build一个新的脚本元素,并将实际的脚本内容作为innerHTML到创build的元素,然后将脚本元素附加到实际的目标。

 <html> <head> <script type='text/javascript'> function addScript() { var newdiv = document.createElement('div'); var p = document.createElement('p'); p.innerHTML = "Dynamically added text"; newdiv.appendChild(p); var script = document.createElement('script'); script.innerHTML = "alert('i am here');"; newdiv.appendChild(script); document.getElementById('target').appendChild(newdiv); } </script> </head> <body> <input type="button" value="add script" onclick="addScript()"/> <div>hello world</div> <div id="target"></div> </body> </html> 

这适用于Firefox 42,Google Chrome 48和Safari 9.0.3

另一种方法是不要将使用InnerHTML的Ajax调用的返回信息转储到DOM中。

您可以dynamic插入每个节点,然后脚本将运行。

否则,浏览器只是假定你正在插入一个文本节点,并忽略这些脚本。

使用Eval是相当邪恶的,因为它需要JavaScript VM的另一个实例被激发并且JIT传递的string。

我没有解决scheme,但是你可能会在这里find你要找的东西:

http://ajaxpatterns.org/On-Demand_Javascript

最好的方法可能是直接通过DOM来识别和评估脚本块的内容。

我会小心,虽然..如果你正在实施这个来克服一些异地电话的限制,你正在打开一个安全漏洞。

无论您实施什么,都可以用于XSS。

您可以使用其中一个stream行的Ajax库为您在本地执行此操作。 我喜欢Prototype 。 您可以添加evalScripts:true作为Ajax调用的一部分,并自动发生。

下面是一个不同的方法,它使用的事实是,如果标签包含type =“text / xml”JavaScript里面不会执行:

 function preventJS(html) { return html.replace(/<script(?=(\s|>))/i, '<script type="text/xml" '); } 

您可以在这里阅读更多 – JavaScript:如何防止在DOM中添加html的JavaScript执行 。 如果它适合你,请在这里留下一个评论,并提供你使用的浏览器和版本的信息。