在AJAX检索的<div>中执行<script>

JCO*_*611 94 html javascript ajax

有一个名为"内容"的div:

<div id="content"></div>
Run Code Online (Sandbox Code Playgroud)

它应该由AJAX的PHP文件中的数据填充,包括<script>标记.但是,此标记内的脚本未被执行.

<div id="content"><!-- After AJAX loads the stuff that goes here -->
   <script type="text/javascript">
     //code
   </script>
   <!-- More stuff that DOES work here -->
</div>
Run Code Online (Sandbox Code Playgroud)

Cho*_*ula 62

作为DOM文本插入的JavaScript将不会执行.但是,您可以使用动态脚本模式来实现目标.基本思想是将要执行的脚本移动到外部文件中,并在获得Ajax响应时创建脚本标记.然后src,您可以设置脚本标记的属性,然后加载并执行外部脚本.

这个其他StackOverflow帖子也可能对您有所帮助:可以使用innerHTML插入脚本吗?.


Fir*_*zam 58

我用过这段代码,工作正常

var arr = MyDiv.getElementsByTagName('script')
for (var n = 0; n < arr.length; n++)
    eval(arr[n].innerHTML)//run script inside div
Run Code Online (Sandbox Code Playgroud)

  • 如果你问我,这是一个比被接受的答案好得多的答案.这几乎是JavaScript注入. (3认同)
  • 不强烈推荐使用 Eval()。请参阅此 - /sf/ask/637549321/​​ontains-script-tags (2认同)

Chr*_*kar 13

如果您通过Ajax在div中加载脚本块,如下所示:

<div id="content">
    <script type="text/javascript">
    function myFunction() {
      //do something
    }
    myFunction();
    </script>
</div>
Run Code Online (Sandbox Code Playgroud)

...它只是更新页面的DOM,myFunction()不一定会被调用.

您可以使用Ajax回调方法(如jQuery的ajax()方法中的方法)来定义请求完成时要执行的操作.

你正在做的不同于从一开始就加载包含JavaScript的页面(它确实被执行).

获取某些内容后如何使用成功回调和错误回调的示例:

  $.ajax({
    type: 'GET',
    url: 'response.php',
    timeout: 2000,
    success: function(data) {
      $("#content").html(data);
      myFunction();
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert("error retrieving content");
    }
Run Code Online (Sandbox Code Playgroud)

另一种快速而肮脏的方法是使用eval()执行您作为DOM文本插入的任何脚本代码,如果您不想使用jQuery或其他库.


Evg*_*nii 8

以下是将评估文本中所有脚本标记的脚本.

function evalJSFromHtml(html) {
  var newElement = document.createElement('div');
  newElement.innerHTML = html;

  var scripts = newElement.getElementsByTagName("script");
  for (var i = 0; i < scripts.length; ++i) {
    var script = scripts[i];
    eval(script.innerHTML);
  }
}
Run Code Online (Sandbox Code Playgroud)

从服务器收到HTML后,只需调用此函数即可.警告:使用eval可能很危险.

演示:http: //plnkr.co/edit/LA7OPkRfAtgOhwcAnLrl?p =preview


Phr*_*ogz 5

如果您不尝试将 XHR 返回的 HTML 的子集附加到文档中,那么这对我使用 jQuery 来说“仅适用”。(请参阅此错误报告,其中显示了 jQuery 的问题。)

这是一个显示它工作的示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>test_1.4</title> 
    <script type="text/javascript" charset="utf-8" src="jquery.1.4.2.js"></script> 
    <script type="text/javascript" charset="utf-8"> 
        var snippet = "<div><span id='a'>JS did not run<\/span><script type='text/javascript'>" +
        "$('#a').html('Hooray! JS ran!');" +
        "<\/script><\/div>";
        $(function(){
            $('#replaceable').replaceWith($(snippet));
        });
    </script> 
</head> 
<body> 
    <div id="replaceable">I'm going away.</div> 
</body> 
</html>
Run Code Online (Sandbox Code Playgroud)

这是上面的等效项:http : //jsfiddle.net/2CTLH/