2013-05-03 322 views

回答

11

結果發現這個奇特金塊:Dual Monitors and Window.open

「當打開使用 window.open一個新窗口的鏈接用戶點擊使窗口出現在與其父母' '相同的監視器上。「

// Find Left Boundry of the Screen/Monitor 
function FindLeftScreenBoundry() 
{ 
    // Check if the window is off the primary monitor in a positive axis 
    // X,Y     X,Y     S = Screen, W = Window 
    // 0,0 ---------- 1280,0 ---------- 
    //  |   |   | ---  | 
    //  |   |   | | W | | 
    //  |  S |   | --- S | 
    //  ----------   ---------- 
    if (window.leftWindowBoundry() > window.screen.width) 
    { 
     return window.leftWindowBoundry() - (window.leftWindowBoundry() - window.screen.width); 
    } 

    // Check if the window is off the primary monitor in a negative axis 
    // X,Y     X,Y     S = Screen, W = Window 
    // 0,0 ---------- -1280,0 ---------- 
    //  |   |   | ---  | 
    //  |   |   | | W | | 
    //  |  S |   | --- S | 
    //  ----------   ---------- 
    // This only works in Firefox at the moment due to a bug in Internet Explorer opening new windows into a negative axis 
    // However, you can move opened windows into a negative axis as a workaround 
    if (window.leftWindowBoundry() < 0 && window.leftWindowBoundry() > (window.screen.width * -1)) 
    { 
     return (window.screen.width * -1); 
    } 

    // If neither of the above, the monitor is on the primary monitor whose's screen X should be 0 
    return 0; 
} 

window.leftScreenBoundry = FindLeftScreenBoundry; 

現在,代碼編寫,你現在可以使用window.open打開監視器上的 窗口的父窗口上。

window.open(thePage, 'windowName', 'resizable=1, scrollbars=1, fullscreen=0, height=200, width=650, screenX=' + window.leftScreenBoundry() + ' , left=' + window.leftScreenBoundry() + ', toolbar=0, menubar=0, status=1'); 

如果成功,您可以打開相同的屏幕文件上的彈出啓動它,然後用同樣的努力,應該能夠修改它以不同的表現。請注意,正如代碼長度所暗示的,沒有內置函數來理解jQuery/javascript/browsers中的多個監視器,只是雙屏幕桌面僅僅是一個放大的單個笛卡爾平面而不是兩個離散的飛機。

+0

你的代碼是returnign **'window.leftWindowBoundry不是函數'**。我想在鉻63.0.3239.132。 – 2018-02-02 17:13:21

11

window.screenX將給出當前監視器屏幕的位置。

假設顯示器寬度爲1360

監視器1 window.screenX = 0;

對於監視器2 window.screenX = 1360;

所以通過添加左位置與window.screenX,彈出在預期的位置打開。

function openWindow() { 

    var width = 650; 
    var left = 200; 

    left += window.screenX; 

    window.open(thePage,'windowName','resizable=1,scrollbars=1,fullscreen=0,height=200,width=' + width + ' , left=' + left + ', toolbar=0, menubar=0,status=1');  
    return 0; 

} 
+2

我想解決使用這種技術在另一臺顯示器上放置彈出窗口。它在Firefox和IE中按預期工作。但在鉻,它不工作。它的放置在窗口的右邊緣。任何想法? – 2015-01-12 09:14:27

+0

@RumitParakhiya你有什麼解決方案嗎?我得到了同樣的問題,它在Firefox上工作,但不在鉻 – Heroic 2016-04-12 05:57:35

+1

@Heroic:沒有,沒有得到任何解決方案的Chrome。答案中提到的解決方案適用於FF,但由於安全原因,Chrome不允許以這種方式放置彈出窗口。當時我通過官方的Chrome線程來確認這一點。該網址目前不方便。 – 2016-04-12 06:01:50

0
/** 
* Display popup window in the center of the screen. 
*/ 
function popupWindow(url, title, w, h) { 
    // Use window.screenX to center the window horizontally on multi-monitor 
    // setup. 
    var left = window.screenX + (screen.width/2) - (w/2); 
    var top = (screen.height/2) - (h/2); 
    return window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left); 
}, 
5

功能:

function PopupCenter(url, title, w, h, opts) { 
    var _innerOpts = ''; 
    if(opts !== null && typeof opts === 'object'){ 
     for (var p in opts) { 
      if (opts.hasOwnProperty(p)) { 
       _innerOpts += p + '=' + opts[p] + ','; 
      } 
     } 
    } 
    // Fixes dual-screen position, Most browsers, Firefox 
    var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left; 
    var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top; 

    var width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; 
    var height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; 

    var left = ((width/2) - (w/2)) + dualScreenLeft; 
    var top = ((height/2) - (h/2)) + dualScreenTop; 
    var newWindow = window.open(url, title, _innerOpts + ' width=' + w + ', height=' + h + ', top=' + top + ', left=' + left); 

// Puts focus on the newWindow 
    if (window.focus) { 
     newWindow.focus(); 
    } 
} 

用法:

PopupCenter('http://www.google.com','google.com','900','500', {toolbar:1, resizable:1, location:1, menubar:1, status:1}); 

它也將在最小化的窗口工作

+0

這工作得很好!我想要左上角,所以我只是誇大了第一個寬度和高度的分割,然後將第二個(w和h)與第一個分開。從未明白'google.com'的功能在用法中,但發現它可以是任何東西,只要它是任何東西。 – 2017-06-15 08:51:06

+0

@drymoon你知道爲什麼這會打開每個鏈接在同一個窗口而不是一個新的?真的很煩人/: – 2017-06-19 06:17:51

+0

似乎它只用於具有相同核心網址的鏈接。 – 2017-06-19 12:47:15

2

無上述搜索解決方案的ns工作正常。在精確的中心而言,

我想這一點,它工作正常,我在Chrome和Firefox

var sY = screenY; 
     if (sY < 0) { 
      sY = 0; 
     } 
     var totalScreenWidth = (screenX + window.outerWidth + sY); 
     if (totalScreenWidth > screen.width) { 
      totalScreenWidth = totalScreenWidth/2; 
     } else { 
      totalScreenWidth = 0; 
     } 
     windowobj.moveTo(totalScreenWidth + ((screen.width - h)/2), ((screen.height - h)/2)); 

但是,這也有問題,如果第二個顯示器瀏覽器在第一和第二另一半看半。

1

基於JavaScript的解決方案由於安全原因不起作用。

我對你有另一種想法,爲什麼不使用鉻擴展來處理定位。 (沒有安全問題) 當然,只有鉻(也許這對你很好)。

背景:我們有相關的困難。內部web應用程序,它在Windows中打開多個文檔,並且需要放置在其他監視器中。 爲了安全起見,JavaScript不支持這種方式,只有本機擴展才能正確使用製表符/窗口對象。

因此,我們已經創建了一個開源的chrome擴展來完成這一任務:在多監視器設置中靈活的窗口位置。

在你的情況下,你可以很容易地定義一個規則每個監視器在哪裏以及如何出現。您可以在Chrome擴展的選項頁面中執行此操作。 (作爲shorcut,你可以在安裝後直接進入using

鉻擴展被稱爲「MultiWindow定位器」,它的完全免費。您可以在Chrome網上應用店here

得到它,你在github上找到實際的源代碼項目chrome-multiwindow-positioner

免責聲明:我是開放源碼(MIT)的GitHub項目的維護者。如果有任何有趣的想法,或評論隨意分享他們here

+0

「爲什麼不使用擴展名」...嗯,因爲要求我們網站的隨機訪問者安裝擴展名來定位彈出窗口聽起來並不理想。 – 2017-03-27 19:27:24

+0

是的,從這個意義上說,這是不行的。它實際上是一個灰色區域。基於瀏覽器的應用程序需要越來越多的功能,希望進入瀏覽器選項卡的範圍,而瀏覽器必須保護用戶免受安全問題的困擾。它是一個矛盾。 – 2017-05-02 15:05:58