【问题标题】:How to dynamically add scripts to webpage from an HTML string?如何从 HTML 字符串动态地将脚本添加到网页?
【发布时间】:2013-08-21 16:24:18
【问题描述】:

假设我有一个名为 html 的字符串,其中包含:

<script>
    document.write("Some random stuff here");
</script>

<script src="someremotejsfile"></script>

我想在 iframe 窗口中动态显示它。

我最初的解决方案是:

document.open();
document.write(html);
document.close();

但这会导致 Firefox 出现问题,即使内容已经加载,微调器也会一直旋转,就好像它永远在加载一样。我的下一个尝试是:

document.body.innerHTML = html;

这会将脚本添加到正文中,但实际上并没有执行它们。所以最后我尝试了:

div = document.createElement("div");
div.innerHTML = html;
document.body.appendChild(div);

但这似乎也没有执行 html 字符串中的脚本。

所以我的问题是,给定一个 html 字符串,我如何将它动态添加到页面中?例如,它可以是一个广告标签,其中包含任意数量的脚本和其他 html 元素。我无法控制该 html 字符串中的内容。对我来说这是一个黑匣子。我只需要能够获取那长长的 html 字符串并将其加载到窗口中(在本例中为 iframe)。

【问题讨论】:

  • 我有限的知识表明这是不可能的。您无法获得的更接近的是在 a 中评估 only 脚本(不带标签),例如细绳。我希望我错了,因为这很有趣。 +1
  • 所以这个叫做 'html' 的字符串是一个黑盒子...但是它是整个网页(包括 html 和 head 元素)还是只是部分 html?它是否包含您要执行的脚本?我认为您将不得不将“html”字符串分开...
  • 一个有用的网站:4 ways to dynamically load external javascript files。我偶尔会提到它。
  • 可能看起来很奇怪,但您可能可以document.write 页面上的那个“黑匣子”...

标签: javascript html dom iframe


【解决方案1】:

document.write 作品:

<iframe id="ifr"></iframe>

<script type="text/javascript">

   var scr = decodeURIComponent("%3Ch1%3EHello%20World%3C%2Fh1%3E%3Cscript%3Ealert(%27Some%20random%20stuff%20here%27)%3B%3C%2Fscript%3E");

   document.getElementById("ifr").contentWindow.document.write(scr);
   document.getElementById("ifr").contentWindow.document.close();

</script>

(不要介意编码的 URI 字符串,只需要它能够将代码 &lt;h1&gt;Hello World&lt;/h1&gt;&lt;script&gt;alert('Some random stuff here');&lt;/script&gt; 分配给脚本标签内的字符串变量

【讨论】:

  • Document.write 在 Chrome 上非常适合我。但是,在 Firefox 上,document.write 会导致窗口似乎永远加载,就像页面顶部的微调器永远旋转一样。内容加载正确,但 FF 无法确定内容实际加载的时间。即使是在 html = "

    Hello World

    " 的 iframe 窗口中的一个简单 document.write(html) 也会导致这种情况发生
  • 添加 document.close() 似乎解决了这个问题(更新了我的答案)。我知道你以前试过这个,但是你可以用上面的解决方案再试一次吗?
  • 所以,如果我在您的帖子中保留警报('something random'),它会起作用。 Firefox 会像加载一样旋转,一旦我退出警告窗口,页面就会加载。但是,如果我取消警报语句,只留下“

    Hello World

    ”,Firefox 永远不会停止加载。
  • 你确定吗?似乎作为独立脚本和这里都可以正常工作:jsfiddle.net/Ms5FA 也许缓存是问题?
  • 是的,这行得通。有一个我不知道的随机脚本导致 FF 永远加载。一旦我摆脱它,这种方法就奏效了。谢谢!
【解决方案2】:

如果你使用 jQuery,你可以使用 .html 来加载,它会触发你的脚本

$(document.body).html( $(document.body).html() + htmlToAdd );

如果你不使用 jQuery,你可以手动评估你的脚本..

function appendHTMLtoBody(html){
   var body = document.body;

   var scriptsLoaded = [].slice.apply(body.getElementsByTagName("script"),[0]);

   for(var i = 0; i < scriptsLoaded.length; i++){

       scriptsLoaded[i].setAttribute("data-loaded","true");

   }

   body.innerHTML += html;
   var allScripts = body.getElementsByTagName("script");
   for(var i = 0; i < allScripts.length; i++){


      if( allScripts[i].getAttribute("data-loaded") !== "true" ){

         var script = allScripts[i].innerHTML;
         eval(script);
      }
   }
}

我想会解决你的问题。

【讨论】:

  • 代替$(document.body).html( $(document.body).html() + htmlToAdd );,你也可以使用append函数:$(document.body).append (htmlToAdd);或前置,如果你想把它插入到前面
  • 这似乎也可以,尽管 JQuery 不是我正在研究的选项。
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多