多显示器/双显示器系统上的window.open() - 窗口弹出的位置在哪里?

时间:2013-05-03 16:22:26

标签: javascript popup window window.open multiple-monitors

在多显示器系统上使用javascript window.open()时,如何控制弹出窗口打开的显示器或显示空间中的哪个位置?它对我来说似乎失去了控制,而且随之而来的是它的行为。

7 个答案:

答案 0 :(得分:18)

“window.open双屏”搜索结果显示了这个花哨的金块: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中多个监视器的内置函数,只是双屏桌面只是一个放大的单个笛卡尔平面而不是两个离散平面

<强>更新

链接已经死了。使用this waybackmachine link

答案 1 :(得分:13)

window.screenX将显示当前监视器屏幕的位置。

假设监视器宽度为1360

监视器1 window.screenX = 0;

监视器2的{p> 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 :(得分:8)

FUNCTION:

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();
   }
}

USAGE:     

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

它也适用于最小化的窗口

答案 3 :(得分:2)

以上解决方案均无法正常运行。就确切的中心而言,

我试过这个,它在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));

但是,如果第二个监视器浏览器在第一个中被查看一半而在另一个中查看另一半,那么这也会有问题。

答案 4 :(得分:2)

由于安全原因,基于javascript的解决方案无效。

我还有另一个想法,为什么不使用镀铬扩展来处理定位。 (没有安全问题) 当然,它只适用于镀铬(也许对你来说很好)。

背景:我们遇到了相关的困难。内部webapp,在Windows中打开多个文档,需要放在其他监视器中。 出于安全原因,javascript不支持此功能,只有原生扩展可以正常使用标签/窗口对象。

因此,我们创建了一个开源的chrome扩展程序,用于实现这一目标:灵活的窗口位置可以跨多个监视器设置。

在您的情况下,您可以轻松地为每台显示器定义一个规则,以及它在何处以及如何显示。您可以在chrome扩展程序的选项页面中执行此操作。 (你可以在安装后直接去那里using

镀铬扩展名为“MultiWindow Positioner”,完全免费。您可以在Chrome商店here

获取它

您在项目chrome-multiwindow-positioner

中的github中找到的实际源代码

免责声明:我是开源(MIT)github项目的维护者。如果有任何有趣的想法,或者评论可以随意分享here

答案 5 :(得分: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);
},

答案 6 :(得分:0)

这是一个解决方案:

function openWindow( url, winnm, options)
{
    var wLeft = parseInt( typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft );

    var left = 0;

    if( (result = /left=(\d+)/g.exec(options)) ) {
        left = parseInt(result[1]);
    }

    if(options)
    {
       options = options.replace("left="+left,"left="+(parseInt(left) + wLeft));        
       w = window.open( url, winnm, options );
    }
    else
    {
       w = window.open( url, winnm );
    }

    if(w)
         w.focus();

    return w;
}

您只需要替换您的js文件:window.open到openWindow