使用iframe内的脚本标记无限加载

时间:2016-07-05 13:27:06

标签: javascript iframe

这是代码,坚持过去7年来从未有过的那个简单的问题:

<html>
<body>
    <iframe></iframe>
    <script>
        window.frames[0].document.write('<scr' + 'ipt type="text/javascript" src="//code.jquery.com/jquery-3.0.0.min.js"><\/scr' + 'ipt>');
    </script>
</body>
</html>

问题是浏览器的旋转轮继续循环。

网络控制台显示全部已加载。

如果我从DOM中删除iframe,或添加/更改@src属性 - 加载停止。

5 个答案:

答案 0 :(得分:5)

我认为第一个答案是更好的方法,但我会提供与您的代码几乎完全相同的第二个答案,但会显示调用document.close()如何解决您的问题。

问题是您已开始在iFrame中写入文档的<head>元素,但尚未完成(这就是页面继续加载的原因)。调用document.close()表示您已完成对文档的写入。

<html>
  <body>
    <iframe></iframe>
    <script>
      var doc = window.frames[0].document
      doc.write('<scr' + 'ipt type="text/javascript" src="//code.jquery.com/jquery-3.0.0.min.js"><\/scr' + 'ipt>');
      doc.close();
    </script>
  </body>
</html>

答案 1 :(得分:2)

实际上,我刚刚找到了解决方案,如果您可以控制内部脚本(虽然没有帮助加载第三方,例如jQ)。

你应该关闭&#34;当前流&#34;与document.close()

答案 2 :(得分:0)

尝试:

window.frames[0].document.write('<script type="text/javascript" src="//code.jquery.com/jquery-3.0.0.min.js"><\/script>');

我检查了JSbin,它运行正常。 Example page

更新

我认为它不起作用,因为iframe甚至没有任何文件。它只是一个空标记,直到它有一个工作src并填充。 见demo

无论如何,这只能在iframe的内容位于同一个域(google“cross-origin iframes”)时才有效。这里有一场“比赛”。你想加载jQuery,所以你加载的页面会使用它,但你不能从iframe的外部加载任何脚本到内部,直到页面加载到iframe中...

答案 3 :(得分:0)

看起来火狐可能会对iframe产生一些奇怪的感觉

<html>
  <body>
    <iframe></iframe>
    <script>setTimeout(function(){window.frames[0].document.write("hi");}, 5000);</script>
  </body>
</html>

这导致一个微调器在页面加载后5秒开始并且不会消失(至少在我的电脑上 - firefox 47.0)

答案 4 :(得分:0)

我能够通过在Javascript中定义和附加元素来插入脚本而不会出现您描述的加载问题,而不会出现任何加载问题。

<html>
  <body>
    <iframe id="myFrame"></iframe>
    <script>
      var jq = document.createElement('script')
      jq.type = 'text/javascript'
      jq.src = '//code.jquery.com/jquery-3.0.0.min.js'
      document.getElementById('myFrame').contentDocument.getElementsByTagName('body')[0].appendChild(jq);
    </script>
  </body>
</html>

当然,将body更改为head会更改脚本在iFrame中加载的位置。