0%

禁止iframe控制父窗口跳转

最近开发个功能,对于富文本的a标签,要求在当前标签弹窗打开。

实现方案是对a标签绑定click事件,点击时阻止默认,然后读取href,在弹窗组件中嵌套iframe,将iframe跳转到该href。

但跳转到个别站点时,竟将外层的页面也跳转了。

排查后发现,应该是个别站点中对修改了父级或顶级窗口的location,如:

1
2
3
4
// 控制父级窗口跳转
window.parent.location.href = 'xxx.com';
// 或 控制顶级窗口跳转
window.top.location.href = 'xxx.com';

确定问题后,尝试了一些方案,均无法解决:

* 监听beforeunload,看下能否有preventDefault类似的操作来阻止页面跳转。
* 使用Object.freee冻结location对象,让子窗口不可修改。

后来在网上找到方案,利用h5 iframe的新特性sandbox完美解决,支持度: caniuse也比较好,ie9+

示例:

1
<iframe sandbox="allow-same-origin allow-scripts allow-popups"></iframe>

参考:

如何阻止iframe里引用的网页自动跳转
iframe 标签的 sandbox 属性