2013-05-03 3 views
19

При использовании javascript window.open() в системе с несколькими мониторами, как вы контролируете, какой монитор или где в пространстве экрана всплывающее окно открывается? Это кажется мне неконтролируемым и в противном случае случайным в его поведении.window.open() на системе с несколькими мониторами/с двумя мониторами - где всплывает окно?

ответ

11

Результат «window.open двойного экрана» поиск показал этот причудливый самородок:. Dual Monitors and Window.open

«Когда пользователь нажимает на ссылку, которая открывает новое окно с помощью window.open Make появится окно на том же мониторе, что и его родительский « ».

// 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/браузерах, только то, что рабочий стол с двумя экранами представляет собой просто увеличенную одиночную декартовую плоскость вместо двух дискретных самолеты.

+0

Ваш код является возвратом ** 'window.leftWindowBoundry не является функцией' **. Я пытаюсь в chrome 63.0.3239.132. –

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. Но в хроме он не работает. Его размещение всплывающее окно на правом краю окна. Есть идеи? –

+0

@RumitParakhiya есть ли у вас решение? У меня такая же проблема, что он работает на firefox, но не в хроме – Heroic

+1

@Heroic: Нет, не получил никакого решения для Chrome. Решение, упомянутое в ответе, работает на FF, но Chrome не позволяет размещать всплывающие окна таким образом из-за безопасности. В то время я пришел к официальной теме Chrome, подтверждающей это. В настоящее время URL не подходит. –

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) на 1. Никогда не понимал, что функция «google.com» использовалась в использовании , но обнаружил, что это может быть что угодно, пока это было что угодно. –

+0

@drymoon Знаете ли вы, почему это открывает каждую ссылку в том же окне вместо нового? Действительно раздражает /: –

+0

Кажется, что это только для ссылок с одним и тем же основным URL-адресом. –

2

Ни один из выше SOLUTIO ns работают правильно. с точки зрения точного центра,

Я попробовал это, он отлично работает для меня в хроме и светлячок

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 не работает из соображений безопасности.

У меня есть еще одна идея для вас, почему бы не использовать хромированное удлинение для обработки позиционирования. (там нет проблем с безопасностью) Это, конечно, только для хром (возможно, это хорошо для вас).

История вопроса: У нас были связанные трудности. Внутренний webapp, который открывает несколько документов в окнах и должен быть размещен на других мониторах. Javascript не поддерживает это по соображениям безопасности, и только родное расширение может корректно работать с объектами tabs/windows.

Поэтому мы создали расширение chrome с открытым исходным кодом для выполнения именно этого: гибкое положение окна в настройках нескольких мониторов.

В вашем случае вы можете легко определить правило для каждого монитора, где и как оно появится. Вы можете сделать это на странице опций расширения chrome. (как вы можете, после установки, перейдите прямо туда using)

Хромовое удлинение называется «MultiWindow Positioner» и его полным свободным. Вы можете получить его в хромированной магазине here

Фактический исходный код, который вы найдете в GitHub в проекте chrome-multiwindow-positioner

Отказ от ответственности: Я сопровождающим с открытым исходным кодом (MIT) GitHub проекта. Если есть какая-то интересная идея или комментарии, не стесняйтесь делиться ими here.

+0

«почему бы не использовать хром-расширение» ... Ну, потому что попросить случайных посетителей нашего сайта установить расширение, чтобы разместить всплывающее окно, не кажется идеальным. –

+0

да, в этом смысле, это не будет. На самом деле это серая зона. Приложения на основе браузеров, требующие больше и больше функций, которые хотят перейти в область вкладки браузера, в то время как браузер должен защищать пользователей от проблем безопасности. Это противоречие. –

Смежные вопросы