Javascript 能否确定window.resizeTo是否有效?
在Javascript控制台中,如果执行:Javascript 能否确定window.resizeTo是否有效?,javascript,Javascript,在Javascript控制台中,如果执行: m = window.open(location.origin); m.resizeTo(400, 400); 窗口将调整大小,但如果我只是执行: window.resizeTo(400, 400); 然后什么也没发生。我理解这种行为的原因。如何检测window.resizeTo不起作用的情况?MDN是一个很好的JavaScript资源: 自Firefox 7以来,根据以下规则,网站不再可能更改浏览器中窗口的默认大小: 无法调整非由窗口创建的窗口或
m = window.open(location.origin);
m.resizeTo(400, 400);
窗口将调整大小,但如果我只是执行:
window.resizeTo(400, 400);
然后什么也没发生。我理解这种行为的原因。如何检测window.resizeTo不起作用的情况?MDN是一个很好的JavaScript资源: 自Firefox 7以来,根据以下规则,网站不再可能更改浏览器中窗口的默认大小: 无法调整非由窗口创建的窗口或选项卡的大小。请打开 当窗口或选项卡位于包含多个选项卡的窗口中时,无法调整其大小 因此,您需要检测您是否是子窗口:
最简单的方法是检查窗口是否有父级。如果
!父窗口
,这意味着它是不能用JS调整大小的主窗口,否则您就需要调整大小
编辑:Igor在我找到它之前发布了它:你想要m.opener()
而不是window.parent
方法1:
您可以使用窗口。打开器
。如果为空,则表示您没有打开该窗口,因此无法调整其大小
window.parent
更适用于iframes
等
例如:
if (m.opener) {
m.resizeTo(400, 400);
} else {
// You did not create the window, and will not be able to resize it.
}
方法2:
ajp15243提出了一个很好的观点,因此您可以做的一件事是收听resize事件,看看您的resizeTo
是否有效:
var resizeFired = false;
...
var triggeredResize = function() {
resizeFired = true;
m.removeEventListener('resize', triggeredResize);
}
m.addEventListener('resize', triggeredResize, true);
m.resizeTo(400, 400);
if (resizeFired) {
// Your resize worked.
}
我还没有能够完全测试这一点,但这仍然是一种潜在的方法。对于IE8及以下版本,您可能需要使用attachEvent
。正如@Wesabi所指出的,resize可能会为其他事件触发(如果用户作为附加的侦听器调整窗口大小,则可能触发),因此最好在尽可能短的时间内执行此操作
方法3:
另一种方法是调用m.resizeTo(400400)
,然后检查窗口大小,查看当前大小是否等于您设置的大小:
m.resizeTo(400, 400);
if (w.outerWidth != 400 && w.outerHeight != 400) {
// Your resize didn't work
}
我的问题是这种情况是否能被发现,正如我所说,我理解这种行为的原因。是的,问题恰恰是关于如何发现这种情况。这件事不能做的事实是众所周知的。对不起,我认为这是显而易见的。由于无法调整不是由window.open创建的窗口的大小,因此必须检测此情况。答案已更新,以演示如何执行此操作。请注意,如果您的页面作为iframe嵌入,则使用此方法将产生不希望的结果。如果我执行
[!window.parent,!m.parent]
我将获得[false,false]
。我遗漏了什么吗?顶部的窗口
为我提供了一个窗口的自引用。父项
,所以不会!window.parent
始终为false
?你不想要窗口吗!==window.parent
来检查它是否不是顶级窗口?啊,我是在Igor发布他的asnwer后发现的。我想要m.opener()
最简单的方法是检查窗口高度,按像素调整大小,然后再检查一次。@Zirak这是一个非常不利于用户的想法。按像素调整窗口大小,然后再重新调整大小,可能比他们注意到的要快?@Zirak解决方案是您正在寻找的答案。如果您将窗口大小更改一个像素,保存大小并立即恢复,用户不会注意到调整大小,因为如果您打开一个500x500的弹出窗口并启动:window.resizeTo(300300);窗口。resizeTo(500500);您根本看不到窗口移动(即使onresize事件仍然被触发),这似乎涵盖了窗口中的第一条规则。resizeTo
文档,但第二条规则是关于多个选项卡的。@ajp15243很好,我也发布了另一种方法。还要注意,msie8及以下版本上的resize事件会触发任何元素(不仅仅是窗口)@Wesabi是的,它也不考虑用户调整大小。我的假设是,逻辑应该在足够短的时间内发生,这不重要。但是的,这肯定是另一个考虑因素。这更像是一个黑客行为。“理想情况下”我们希望resizeTo
在其成功状态下返回一个布尔值。解决方案很好!但我认为OP希望提前检查resize是否有效,但遗憾的是,这是不可能的…我会使用评论中建议的zirak解决方案,它是一个侵入性较小的解决方案
m.resizeTo(400, 400);
if (w.outerWidth != 400 && w.outerHeight != 400) {
// Your resize didn't work
}