Window.open() в системе с несколькими мониторами/с двумя мониторами - где всплывает окно?
При использовании javascript window.open() в системе с несколькими мониторами, как вы контролируете, какой монитор или где в пространстве дисплея всплывающее окно открывается? Это кажется мне неконтролируемым и в противном случае случайным в нем поведением.
Ответы
Ответ 1
Результат поиска "window.open dual-screen" показал этот причудливый самородок: Двойные мониторы и 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 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/браузерах, только то, что рабочий стол с двумя экранами представляет собой просто увеличенную одиночную декартовую плоскость вместо двух дискретных плоскостей.
Ответ 2
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;
}
Ответ 3
ФУНКЦИЯ:
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});
Он также будет работать с минимальными окнами
Ответ 4
Ни одно из вышеперечисленных решений не работает правильно. в терминах точного Центра,
Я пробовал это, он отлично работает для меня в хроме и 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));
Но это также имеет проблему, если второй браузер мониторов просматривается наполовину в первой и второй половине секунды.
Ответ 5
Решение на основе javascript не работает из соображений безопасности.
У меня есть еще одна идея для вас, почему бы не использовать хром-расширение для обработки позиционирования. (там нет проблем с безопасностью)
Это, конечно, только для хром (возможно, это хорошо для вас).
История вопроса: У нас были связанные трудности. Внутренний webapp, который открывает несколько документов в окнах и должен быть размещен на других мониторах.
Javascript не поддерживает это по соображениям безопасности, и только родное расширение может корректно работать с объектами tabs/windows.
Таким образом, мы создали расширение chrome с открытым исходным кодом для выполнения именно этого: гибкое положение окна в настройках нескольких мониторов.
В вашем случае вы можете легко определить правило для каждого монитора, где и как оно появится. Вы можете сделать это на странице опций расширения chrome.
(как вы можете, после установки, перейти прямо туда используя)
Расширение хрома называется "MultiWindow Positioner" и его полная свобода. Вы можете получить его в магазине chrome здесь
Фактический исходный код, который вы найдете в github в проекте chrome-multiwindow-positioner
Отказ от ответственности: я являюсь разработчиком проекта gitub с открытым исходным кодом (MIT). Если есть какая-то интересная идея или комментарии, не стесняйтесь делиться ими здесь.
Ответ 6
/**
* 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);
},