2008-09-26 138 views
7

是否有可能判断网站的用户是否使用多个显示器?我需要找到弹出窗口的位置,但很可能用户将有多个监视器设置。虽然window.screenX等将提供浏览器窗口的位置,但对多个显示器无用。使用javascript测试多个屏幕

+2

弹出窗口吸。但是,如果你绝对*必须*使用它们,然后将它们相对于它们的父窗口放置 - 不要使用绝对坐标。 – Shog9 2008-09-26 16:18:24

+0

@ Shog9您好,请您澄清为什么我们不应该在打开新弹出窗口时使用绝对坐标?这对我非常有帮助。 – Vadim 2014-09-22 07:54:47

+0

对于完全独立的问题@Vadim来说,这可能是一个合适的话题 - 但简单的回答是,有一个合理的机会可以让您将弹出窗口定位在某个对我不方便的地方。我的辅助显示器右侧通常有一个浏览器窗口打开,该窗口比我的主显示器大,并位于右侧;如果你不考虑这个问题,你很有可能会把你的弹出窗口放在其他应用程序中,甚至在屏幕外。 – Shog9 2014-09-23 03:42:52

回答

0

我不认为现在是可能的;然而,除了网页开发之外,js在小部件中变得越来越受欢迎,并且这将是用于请求未来版本的极好功能

0

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

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

[用户具有双显示器]

[结束如果]

0

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

0

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

0

你可以用JavaScript的screen.width.availWidth)和screen.height.availHeight)做出受过良好教育的猜测。

我的想法是假设(!)监视器总体上遵循一定的比例,而[有用的]宽度应该在它之外,因为屏幕仅在宽度方面而不是高度方面重复。

写这个答案,它听起来像一个严重的黑客,但。没有我真的会依赖。

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×600),它打开的窗口中出现。如果没有足够的空间,它会覆盖屏幕右侧的窗口,占用大约一半的空间。

注:

第一,应该进行修改,以找出的最大空间量,而不是仅仅arbitarily搜查左,右,上,下。

其次,我怀疑在某些使用screen.availHeight的地方,应该使用screen.height。同样的宽度。这是因为当决定用户是否有第二台显示器(或屏幕上有很多空间)时,我们并不太关心任务栏的位置。

三,它不会在IE <中工作8.这可以很容易地通过使用screenLeft和screenTop而不是screenX/screenY在适当的情况下纠正。

第四,代码很混乱,可以看起来比它更优雅。我对此没有任何道歉。但是,你不应该在任何地方使用这种可怕的,不可维护的JS,并且它必须被重写,它需要需要。我只是把它放在了这里,因为它现在在我的思路中,当我写得很好时,我很可能会忘记在这里发布一个好的解决方案,因为它不会发生几个月。

对。你走了。我不承担任何责任,使您的JavaScript可怕,丑陋和彻底难以做任何事情。 :)