这是代码,坚持过去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属性 - 加载停止。
答案 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中加载的位置。