Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将脚本附加到HTML后运行脚本_Javascript_Html - Fatal编程技术网

Javascript 将脚本附加到HTML后运行脚本

Javascript 将脚本附加到HTML后运行脚本,javascript,html,Javascript,Html,我有一个HTML字符串: var str = '<div><p>Examplee</p></div><script>alert("testing!")</script>'; 内容被追加,但脚本不执行,有没有办法强制执行?首先,需要注意的是:自然地,只能使用您信任的脚本执行此操作。:-) 有两种方法。基本上,您需要: 获取脚本的文本,然后 运行它 获取文本 一种选择是继续添加它,然后找到它并抓取它的文本: document.

我有一个HTML字符串:

var str = '<div><p>Examplee</p></div><script>alert("testing!")</script>';

内容被追加,但脚本不执行,有没有办法强制执行?

首先,需要注意的是:自然地,只能使用您信任的脚本执行此操作。:-)

有两种方法。基本上,您需要:

  • 获取脚本的文本,然后

  • 运行它

  • 获取文本 一种选择是继续添加它,然后找到它并抓取它的文本:

    document.body.innerHTML += str;
    var scripts = document.querySelectorAll("script");
    var text = scripts[scripts.length - 1].textContent;
    
    在过时的浏览器上,您可能需要检测
    textContent
    vs.
    innerText

    您可能想给它一个识别特征(
    id
    class
    ,等等),这样您就不必像那样按位置查找它

    或者,您可以执行PrototypeJS库所做的操作,并尝试使用正则表达式从字符串中获取它。您可以找到他们的源代码(查找
    extractScripts

    运行它 获得脚本文本后,您有几个选项:

    • 在其上使用间接的
      eval
      (也称为“全局
      eval
      ”):
      (0,eval)(文本)
      。这与
      eval(text)
      不同;它在全局范围而不是本地范围内运行代码

    • 创建一个新的脚本元素,将其文本设置为文本,然后添加它

      var newScript = document.createElement("script");
      newScript.textContent = text;
      document.body.appendChild(newScript);
      
      如果这样做的话,删除原作可能是有意义的,尽管这并不重要

    添加后获取
    脚本
    元素的文本并使用间接
    eval
    的示例:

    var str='example

    alert(“testing!”); document.body.innerHTML+=str; var scripts=document.querySelectorAll(“脚本”);
    (0,eval)(脚本[scripts.length-1].textContent)您应该在加载HTML后更改它。 试试这个:

    document.addEventListener("DOMContentLoaded", function(event) {
        document.body.innerHTML += str;
    });
    

    jQuery提供了$.getScript(url[,success])函数。然后可以从一个单独的jquery文件加载和执行代码,该文件有助于管理和控制执行流

    基本上,将您的
    alert(“testing!”)
    脚本放在一个单独的文件中,例如
    alert.js
    在同一目录中

    然后,您可以在将员工添加到HTML时运行脚本

    var str = '<div><p>Examplee</p></div>';
    var url = 'alert.js';    
    document.body.innerHTML += str;    
    $.getScript(url);
    
    例如,在执行警报后添加员工可能是更好的设计

    var str = '<div><p>Examplee</p></div>';
    var url = 'alert.js'; 
    $.getScript(url, function(){
      document.body.innerHTML += str;
    });
    
    var str='example

    ; var url='alert.js'; $.getScript(url,函数(){ document.body.innerHTML+=str; });

    编辑:我知道jQuery没有标记,但我也不想成为这个问题的公认答案。我只是为可能遇到相同问题并可能正在使用jQuery的人提供了另一种选择。如果是这样的话,$.getScript是针对这个问题设计的非常有用的工具。

    因为附加时它不会运行,脚本在页面加载或操作事件上运行,所以需要向它添加触发器,我如何添加触发器?我尝试将警报包装在函数中,并在附加警报后调用它,但它也不起作用this@clearshot66:OP似乎没有使用jQuery,他们也没有标记.@t.J.Crowder OP也从未说过他们不能,因此我没有将其作为答案。
    $.getScript(url, function(){
      //do something after the alert is executed.
    });
    
    var str = '<div><p>Examplee</p></div>';
    var url = 'alert.js'; 
    $.getScript(url, function(){
      document.body.innerHTML += str;
    });