2008-09-26 141 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可怕,醜陋和徹底難以做任何事情。 :)