Можно ли узнать, использует ли пользователь веб-сайта несколько мониторов? Мне нужно найти положение всплывающего окна, но вполне вероятно, что у пользователя будет несколько настроек монитора. В то время как window.screenX и т. д. Дадут положение окна браузера, это бесполезно для нескольких мониторов.
@ Shog9 привет, не могли бы вы пояснить, почему мы не должны использовать абсолютные координаты при открытии новых всплывающих окон? Это будет мне очень полезно.
Вероятно, это подходящая тема для совершенно отдельного вопроса, @Vadim, но краткий ответ заключается в том, что есть разумная вероятность, что вы собираетесь разместить всплывающее окно в неудобном для меня месте. У меня часто открыто окно браузера в правой половине моего дополнительного монитора, которое больше моего основного монитора и расположено справа от него; если вы не примете это во внимание, очень высока вероятность, что вы разместите свое всплывающее окно поверх другого приложения или даже за пределами экрана.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не верю, что это возможно прямо сейчас; однако js становится все более популярным для настольного использования в виджетах в дополнение к веб-разработке, и это было бы отличной функцией для запроса будущей версии.
Интересно, может ли это реализовать такой проект, как Gears?
Я нашел это как решение, которое кто-то использовал ... Я не понимаю, почему вы не могли ему доверять.
[если ширина больше, то (Height / 3) * 4> (Screen.Width) THEN]
[У пользователя двойной монитор]
[Конец, если]
Эээ ... Я складываю свои экраны. Высота> Ширина. Ни один из экранов не имеет одинаковой ширины, поэтому, если вы используете максимальную ширину, вы окажетесь за пределами экрана за пределами определенной высоты. Не говоря уже о двух верхних конфигурациях, одна снизу.
Кроме того, многие мониторы имеют более широкое соотношение сторон, чем 4: 3.
Некоторые машины (мои собственные) настроены как два отдельных рабочих стола, поэтому высота и ширина возвращаются только для экрана, на котором работает браузер.
У вас может быть первичный моно с высоким разрешением и вторичный моно с низким разрешением. Это решение не годится.
Вы не можете этого сделать. Однако вы можете разместить всплывающее окно по центру родительского окна. Я думаю, что лучше показывать «div» в виде диалога в середине вашего веб-сайта, потому что вероятность того, что это всплывающее окно заблокировано, меньше, и это IMO менее раздражает.
А как насчет размера экрана? Несколько экранов обычно имеют большой размер. Просто проверьте размеры и решите, целесообразно ли использовать только один или несколько экранов.
Вы можете сделать обоснованное предположение с помощью JavaScript screen.width (.availWidth) и screen.height (.availHeight).
Моя идея заключалась в том, чтобы предположить (!), Что мониторы в целом следуют определенному соотношению, тогда как ширина. [Avail] должна быть за его пределами, потому что экран дублируется только по ширине, но не по высоте.
Написание этого ответа звучит как серьезный взлом. Ничего такого, на что я бы действительно положился.
Так не пойдет. availwith и availHeight сообщают вам на основе текущего монитора. Если окно браузера находится на втором мониторе, это можно сделать с помощью availTop и availLeft, но если окно браузера находится на основном мониторе, эти свойства не смогут сказать вам, что второй монитор действительно существует.
Это слишком сложное решение. Я настоятельно рекомендую провести рефакторинг - он не использовался на рабочем сайте, только как быстрое «доказательство концепции» для меня.
Хорошо, предостережения.
Сначала я предположил, что у пользователя может не быть настройки с двумя мониторами, но у них может быть действительно большой монитор, поэтому те же функции могут быть применены в любом случае.
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 x 600), открывает там окно. Если места недостаточно, он перекрывает окно с правой стороны экрана, занимая примерно половину его.
Заметки:
Во-первых, его следует изменить, чтобы узнать, где находится максимальный объем пространства, а не просто произвольно искать влево, вправо, вверх, вниз.
Во-вторых, я подозреваю, что в некоторых местах, где использовался screen.availHeight, вместо этого следует использовать screen.height. То же самое и с шириной. Это потому, что нас не слишком интересует, где находится панель задач, когда мы решаем, есть ли у пользователя второй монитор или нет (или много места на экране).
В-третьих, это не будет работать в IE <8. Это можно легко исправить, используя screenLeft и screenTop вместо screenX / screenY там, где это необходимо.
В-четвертых, код запутан, и его можно было бы сделать более элегантным, чем он есть на самом деле. Я не извиняюсь за это. Однако вам НЕ следует использовать такой ужасный, неподдерживаемый JS где-либо, и его ПОТРЕБНОСТИ нужно переписывать. Я разместил его здесь только потому, что в данный момент я думаю об этом, и я, скорее всего, забуду опубликовать здесь хорошее решение, когда напишу это правильно, поскольку этого не произойдет в течение нескольких месяцев.
Верно. Вот и все. Я не беру на себя ответственности за то, что ваш javascript будет ужасным, уродливым и совершенно непонятным. :)
Всплывающие окна - отстой. Но если вы абсолютно должен используете их, то расположите их относительно их родительского окна - НЕ используйте абсолютные координаты.