是否可以判断网站用户是否使用多个显示器?我需要找到弹出窗口的位置,但用户很可能会有多显示器设置。虽然window.screenX
etc. 会给出浏览器窗口的位置,但它对于多个监视器是无用的。
6 回答
这是一个过于复杂的解决方案。我强烈建议重构它——它没有在生产站点上使用,只是作为我自己的快速“概念证明”。
对,警告结束。
我首先假设用户可能没有双显示器设置,但他们可能有一个非常大的显示器,因此无论如何都可以应用相同的功能。
var newWindow,
screenSpaceLeft = window.screenX,
screenSpaceTop = window.screenY,
screenSpaceRight = screen.availWidth - (window.screenX + window.outerWidth),
screenSpaceBottom = screen.availHeight - (window.screenY + window.outerHeight),
minScreenSpaceSide = 800,
minScreenSpaceTop = 600,
screenMargin = 8,
width = (screen.availWidth / 2.05),
height = screen.availHeight,
posX = (screen.availWidth / 2),
posY = 0;
e.preventDefault();
if (screenSpaceRight > screenSpaceLeft && screenSpaceRight > screenSpaceTop && screenSpaceRight > screenSpaceBottom && screenSpaceRight > minScreenSpaceSide) {
if (width > screenSpaceRight) {
width = screenSpaceRight - screenMargin;
}
if (posX < (screen.availWidth - screenSpaceRight)) {
posX = window.screenX + window.outerWidth + screenMargin;
}
} else if (screenSpaceLeft > screenSpaceRight && screenSpaceLeft > screenSpaceTop && screenSpaceLeft > screenSpaceBottom && screenSpaceLeft > minScreenSpaceSide) {
if (width > screenSpaceLeft) {
width = screenSpaceLeft - screenMargin;
}
posX = 0;
} else if (screenSpaceTop > screenSpaceRight && screenSpaceTop > screenSpaceLeft && screenSpaceTop > screenSpaceBottom && screenSpaceTop > minScreenSpaceTop) {
posX = 0;
posY = 0;
width = screen.availWidth;
height = (screen.availHeight / 2.05);
if (height > screenSpaceTop) {
height = screenSpaceTop - screenMargin;
}
} else if (screenSpaceBottom > screenSpaceRight && screenSpaceBottom > screenSpaceLeft && screenSpaceBottom > screenSpaceTop && screenSpaceBottom > minScreenSpaceTop) {
posX = 0;
width = screen.availWidth;
if (window.screenY + window.outerHeight + screenMargin > (screen.availHeight / 2)) {
posY = window.screenY + window.outerHeight + screenMargin;
} else {
posY = (screen.availHeight / 2);
}
height = (screen.availHeight / 2.05);
if (height > screenSpaceBottom) {
height = screenSpaceBottom - screenMargin;
}
}
newWindow = window.open(this.href, "_blank", "width=" + width + ",height=" + height + ",location=yes,menubar=no,resizable=yes,scrollbars=yes,status=yes,menubar=yes,top=" + posY + ",left=" + posX);
它检查有多少可用的屏幕空间,如果有可用的最小数量(800 x 600),它会在那里打开窗口。如果没有足够的空间,它会覆盖屏幕右侧的窗口,仅占一半左右。
笔记:
首先,应该改变它以找出最大空间量在哪里,而不是随意搜索左、右、上、下。
其次,我怀疑在某些已经使用 screen.availHeight 的地方,应该使用 screen.height 来代替。宽度也是如此。这是因为在决定用户是否有第二台显示器(或屏幕上有很多空间)时,我们对任务栏的位置并不太感兴趣。
第三,它在 IE < 8 中不起作用。这可以通过在适当的情况下使用 screenLeft 和 screenTop 而不是 screenX/screenY 来轻松纠正。
第四,代码是杂乱无章的,可以让它看起来比它更优雅。我不为此道歉。但是,您不应该在任何地方使用如此糟糕、无法维护的 JS,并且它需要被重写。我只是把它放在这里,因为它目前在我的思路中,当我正确地写这个时,我很可能会忘记在这里发布一个好的解决方案,因为它不会发生几个月。
正确的。你去吧。我不承担让你的 javascript 变得可怕、丑陋和完全难以做任何事情的责任。:)
我不相信现在是可能的;然而,除了 Web 开发之外,js 在桌面小部件中变得越来越流行,这将是请求未来版本的绝佳功能
我发现这是有人使用过的解决方案......我不明白为什么你不能相信它。
[如果宽度大于 (Height/3) * 4 > (Screen.Width) THEN]
[用户有双显示器]
[万一]
你不能那样做。但是,您可以将弹出窗口定位在父窗口的中心。我认为在您的网站中间显示一个“div”作为对话框是一个更好的主意,因为这个弹出窗口被阻止的机会更小,而且 IMO 也不那么烦人。
屏幕的大小呢?多个屏幕通常具有很大的尺寸。只需检查尺寸并确定仅在一个或多个屏幕上是否合理。
screen.width
您可以使用 JavaScript 的( .availWidth
) 和screen.height
( )做出有根据的猜测.availHeight
。
我的想法是假设(!)监视器通常遵循一定的比例,而 .[avail]width 应该在它之外,因为屏幕仅在宽度方面复制,而不是高度复制。
写下这个答案,听起来像是一个严重的黑客攻击。没有什么是我真正依赖的。