阻止 iframe 使用 javascript 加载页面

Posted

技术标签:

【中文标题】阻止 iframe 使用 javascript 加载页面【英文标题】:Stopping a iframe from loading a page using javascript 【发布时间】:2011-01-13 12:44:23 【问题描述】:

javascript 中有没有办法在加载页面的过程中停止 iframe?我需要这样做的原因是我有一个来自网络服务器的后台 iframe 流数据(通过 Comet 样式机制),我需要能够随意切断连接。

欢迎任何想法。

【问题讨论】:

没有足够的信心将其作为答案,但是您不能将 iframe 定向到另一个 url 吗?类似document.getElementById("myiframe").src = "http://www.example.com/not-long-polling.html"; 这是我的第一个想法 (+1),但我需要保留框架的内容。 【参考方案1】:

对于 FireFox/Safari/Chrome,您可以使用 window.stop():

window.frames[0].stop()

对于 IE,你可以用 document.execCommand('Stop') 做同样的事情:

window.frames[0].document.execCommand('Stop')

对于您可以使用的跨浏览器解决方案:

if (navigator.appName == 'Microsoft Internet Explorer') 
  window.frames[0].document.execCommand('Stop');
 else 
  window.frames[0].stop();

【讨论】:

检查typeof(window.frames[0].stop) 可能比navigator.appName 更好。未来的 IE 版本可能会支持。 @MorSela,我想说检查功能比检查浏览器更好。条件看起来像(typeof (window.frames[0].stop === 'undefined') 感谢您的回答。我同意 unclenorton 的观点:最好测试一个功能本身的存在而不是测试浏览器。 Alex 使用 typeof() 的例子非常完美。为其他人投票以更快地找到答案 对于那些使用 jQuery 的人,我在测试 stop 函数时遇到了问题,因为 jQuery method with the same name。为了解决这个问题,我使用了这样的 javascript dom 选择器:document.getElementById("myId").getElementsByTagName('iframe')[0]。我不知道是否有一个简单的替代方案,但它可以完成这项工作。【参考方案2】:

整个代码应该是这样的,(unclenorton的那行少了一个括号)

if (typeof (window.frames[0].stop) === 'undefined')
    //Internet Explorer code
    setTimeout(function() window.frames[0].document.execCommand('Stop');,1000);
else
    //Other browsers
    setTimeout(function() window.frames[0].stop();,1000);

【讨论】:

为什么使用setTimeout【参考方案3】:

只是,

document.getElementById("myiframe").src = '';

【讨论】:

这不会阻止大型和繁重的 javascript 执行,例如 Unity WebGL Build。【参考方案4】:

非常简单:

1) 获取你不想加载的 iframe 或 img:

let myIframe = document.getElementById('my-iframe')

2) 然后你可以将 src 属性替换为 about.blank:

myIframe.src = 'about:blank'

就是这样。


如果您想在某些事件发生时一次加载 iframe 或图像,那么只需将 src 变量存储在 dataset 中:

myIframe.dataset.srcBackup = myIframe.src
// then replace by about blank
myIframe.src = 'about:blank'

现在您可以在需要时轻松使用它:

myIframe.src = myIframe.dataset.srcBackup

【讨论】:

【参考方案5】:

如果您只有对该元素的引用,则需要使用.contentX 来获取document/window 以运行接受的答案。 对于动态添加的 iframe 元素,还需要检查 iframe 是否确实有文档。

function stopIframe(element) 
    var doc = element.contentDocument;
    //iframes wont have a document if they aren't loading/loaded
    //check so JS wont throw
    if (!doc)
        return;

    //try for modern browsers
    if (doc.defaultView.stop)
        doc.defaultView.stop();
    //fallback for IE
    else
        doc.execCommand('Stop');

【讨论】:

【参考方案6】:

IE 不支持

<script>
function stopit() 
window.stop();

;
</script>


<a href="#" onclick="stopit()" class="Stop" title="Stop"></a>

【讨论】:

请看一下接受的答案,我认为它与您发布的内容相当

以上是关于阻止 iframe 使用 javascript 加载页面的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法阻止 Symfony2 为某些路径发送会话 cookie?

如何阻止网站在 iframe 中加载?

无法阻止加载iframe

X-Frame选项不是100%用于阻止iframe

ClientAuthError:令牌调用在隐藏的 iframe 中被阻止

在 iFrame 中嵌入 Google Apps 脚本