如何避免window.close函数被遮蔽?已遮蔽时如何调用原生window.close关闭标签页?
如何在自定义close函数存在时调用原生window.close
当你在全局作用域定义了close函数后,它会覆盖window对象上的原生close方法。以下几种方法可以帮你调用到原生的浏览器标签页关闭功能:
方法1:通过原型链调用原生方法
自定义的close是挂载在window实例上的属性,而原生close方法存在于Window的原型中。你可以直接调用原型上的方法并绑定window作为上下文:
function myFunction() { Window.prototype.close.call(window); }
方法2:提前缓存原生方法
如果能调整代码顺序,在定义自定义close函数前,先缓存原生的window.close,之后直接调用缓存的方法即可:
<!DOCTYPE html> <html> <body> <button onclick="myFunction()">Click me</button> <script> // 提前缓存原生关闭方法 const nativeClose = window.close; function close() { alert('hi') } function myFunction() { nativeClose.call(window); } </script> </body> </html>
方法3:临时恢复原生方法(不推荐)
如果无法调整代码顺序,也可以临时删除自定义的close属性,此时window.close会恢复为原生方法,调用后再重新赋值自定义函数(注意:这种方式可能影响其他依赖该自定义函数的代码):
function myFunction() { const tempClose = window.close; delete window.close; window.close(); window.close = tempClose; }
重要提示
现代浏览器对window.close有严格的安全限制:只有通过脚本(比如window.open)打开的标签页/窗口,才能被脚本关闭。如果是用户手动打开的标签页,即使调用原生方法,浏览器也会阻止关闭操作。
内容的提问来源于stack exchange,提问作者Rickie
相关产品推荐
相关产品推荐

