9

是否可以判断网站用户是否使用多个显示器?我需要找到弹出窗口的位置,但用户很可能会有多显示器设置。虽然window.screenXetc. 会给出浏览器窗口的位置,但它对于多个监视器是无用的。

4

6 回答 6

1

这是一个过于复杂的解决方案。我强烈建议重构它——它没有在生产站点上使用,只是作为我自己的快速“概念证明”。

对,警告结束。

我首先假设用户可能没有双显示器设置,但他们可能有一个非常大的显示器,因此无论如何都可以应用相同的功能。

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 变得可怕、丑陋和完全难以做任何事情的责任。:)

于 2014-01-23T10:25:12.700 回答
1

我不相信现在是可能的;然而,除了 Web 开发之外,js 在桌面小部件中变得越来越流行,这将是请求未来版本的绝佳功能

于 2008-09-26T16:17:34.593 回答
0

我发现这是有人使用过的解决方案......我不明白为什么你不能相信它。

[如果宽度大于 (Height/3) * 4 > (Screen.Width) THEN]

[用户有双显示器]

[万一]

于 2008-09-26T16:19:32.637 回答
0

你不能那样做。但是,您可以将弹出窗口定位在父窗口的中心。我认为在您的网站中间显示一个“div”作为对话框是一个更好的主意,因为这个弹出窗口被阻止的机会更小,而且 IMO 也不那么烦人。

于 2008-09-26T16:19:34.337 回答
0

屏幕的大小呢?多个屏幕通常具有很大的尺寸。只需检查尺寸并确定仅在一个或多个屏幕上是否合理。

于 2008-09-26T16:19:37.147 回答
0

screen.width您可以使用 JavaScript 的( .availWidth) 和screen.height( )做出有根据的猜测.availHeight

我的想法是假设(!)监视器通常遵循一定的比例,而 .[avail]width 应该在它之外,因为屏幕仅在宽度方面复制,而不是高度复制。

写下这个答案,听起来像是一个严重的黑客攻击。没有什么是我真正依赖的。

于 2008-09-26T16:22:34.643 回答