Javascript 能否确定window.resizeTo是否有效?

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以来,根据以下规则,网站不再可能更改浏览器中窗口的默认大小: 无法调整非由窗口创建的窗口或

在Javascript控制台中,如果执行:

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
}