AJAX调用后执行由innerHTML注入的<script>

IT技术 javascript html ajax
2021-02-07 22:02:49

有一个名为“内容”的 div:

<div id="content"></div>

它应该用来自 PHP 文件的数据填充,通过 AJAX,包括一个<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>
6个回答

我使用了这段代码,它工作正常

var arr = MyDiv.getElementsByTagName('script')
for (var n = 0; n < arr.length; n++)
    eval(arr[n].innerHTML)//run script inside div
虽然很有用,但这确实不能回答为什么脚本不能运行的问题。参见例如jsfiddle.net/fkqmcaz7jsfiddle.net/wnn5fz3m/1它绝对应该运行,而且我没有找到它不起作用的简化案例。
2021-03-10 22:02:49
@NaoiseGolden OP 实际上是在询问脚本执行情况,所以我认为这里没问题。:-)
2021-03-21 22:02:49
如果你问我,这比接受的答案要好得多。这几乎是 JavaScript 注入。
2021-03-28 22:02:49
不强烈推荐 Eval()。看到这个 - stackoverflow.com/questions/9107847/...
2021-04-01 22:02:49

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

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

添加到页面的 Javascript 绝对应该执行。例如jsfiddle.net/wnn5fz3m/1)。问题是为什么有时不这样做?
2021-03-15 22:02:49
@Chocula 我将我的脚本移到了一个单独的文件中,但它仍然无法部分工作,你能帮忙解决这个问题吗?stackoverflow.com/questions/42941856/...
2021-03-18 22:02:49
您可以选择所有加载的脚本并通过 eval() 函数执行它们: $('#audit-view script').each(function (index, element) { eval(element.innerHTML); })
2021-03-31 22:02:49
仅供参考(@NoBugs 给了我一个线索)。我尝试了普通的 javascipt element.innerHTML=zzz 和 desnt 工作。然后我尝试 Jquery $(element).html(zzz) 并工作。
2021-04-07 22:02:49

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

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

...它只是更新页面的 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");
    }

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

使用 jQuery 的回调,我如何“执行”新 <script> 中的代码?
2021-03-11 22:02:49
太感谢了!“我的功能();” 部分是我从代码中遗漏的内容。
2021-03-17 22:02:49
我添加了一个使用成功回调的例子:
2021-03-27 22:02:49

这是将评估文本中所有脚本标记的脚本。

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);
  }
}

从服务器收到 HTML 后,只需调用此函数即可。请注意:使用eval可能很危险。

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

如果您不尝试将 XHR 返回的 HTML 的子集附加到文档中,这对我来说“只是有效”。(请参阅此错误报告,其中显示了 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>

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

这极不可能是当前问题的解决方案,因为这是一个非常旧版本的 jQuery 的错误。
2021-03-15 22:02:49