Тестирование для нескольких экранов с помощью javascript

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


person slashnick    schedule 26.09.2008    source источник
comment
Всплывающие окна отстой. Но если вы абсолютно должны их использовать, то расположите их относительно их родительского окна - НЕ используйте абсолютные координаты.   -  person Shog9    schedule 26.09.2008
comment
@ Shog9 привет, не могли бы вы пояснить, почему мы не должны использовать абсолютные координаты при открытии новых всплывающих окон? Это будет очень полезно для меня.   -  person Vadim    schedule 22.09.2014
comment
Это, вероятно, подходящая тема для совершенно отдельного вопроса, @Vadim, но краткий ответ заключается в том, что есть реальная вероятность того, что вы собираетесь разместить всплывающее окно в неудобном для меня месте. У меня часто открывается окно браузера в правой половине моего дополнительного монитора, которое больше моего основного монитора и расположено справа от него; если вы не примете это во внимание, есть очень большая вероятность, что вы поместите свое всплывающее окно поверх какого-либо другого приложения или даже за пределы экрана.   -  person Shog9    schedule 23.09.2014


Ответы (6)


Я не верю, что это возможно прямо сейчас; однако js становится все более популярным для использования на рабочем столе в виджетах в дополнение к веб-разработке, и это было бы отличной функцией для запроса будущей версии.

person Ris Adams    schedule 26.09.2008
comment
Интересно, может ли это реализовать такой проект, как Gears? - person slashnick; 26.09.2008

Это слишком сложное решение. Я настоятельно рекомендую провести рефакторинг этого — он не использовался на рабочем сайте, только как быстрое «доказательство концепции» для себя.

Правильно, предостережения закончились.

Сначала я предположил, что у пользователя может не быть установки с двумя мониторами, но у него может быть действительно большой монитор, и поэтому в любом случае можно применить ту же функциональность.

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 стал ужасным, уродливым и совершенно сложным для выполнения каких-либо действий. :)

person Algy Taylor    schedule 23.01.2014

Я нашел это как решение, которое кто-то использовал ... Я не понимаю, почему вы не могли ему доверять.

[если ширина больше, чем (Высота/3) * 4 > (Экран.Ширина), ТО]

[У пользователя два монитора]

[Конец, если]

person Patcouch22    schedule 26.09.2008
comment
Э... Я складываю свои экраны. Высота ширина. Ни один из экранов не имеет одинаковой ширины, поэтому, если вы придерживаетесь максимальной ширины, вы окажетесь за пределами экрана за пределами определенной высоты. Не говоря уже о двух конфигурациях сверху и одной снизу. - person Shog9; 26.09.2008
comment
Кроме того, многие мониторы имеют более широкое соотношение сторон, чем 4:3. - person Neall; 26.09.2008
comment
Некоторые машины (мой собственный) настроены как два отдельных рабочих стола, поэтому высота и ширина возвращаются только для экрана, на котором запущен браузер. - person slashnick; 30.09.2008
comment
У вас может быть первичный монитор с высоким разрешением и вторичный монитор с низким разрешением. Это решение никуда не годится. - person Gary Tsui; 19.08.2011

Вы не можете этого сделать. Однако вы можете расположить всплывающее окно по центру родительского окна. Я думаю, что лучше показать «div» как диалоговое окно в середине вашего веб-сайта, потому что вероятность того, что это всплывающее окно заблокировано, меньше, и это IMO менее раздражает.

person Armin Ronacher    schedule 26.09.2008

А размер экрана? Несколько экранов обычно имеют большой размер. Просто проверьте размеры и решите, разумно ли размещать их только на одном или нескольких экранах.

person unexist    schedule 26.09.2008

Вы можете сделать хорошо обоснованное предположение с помощью JavaScript screen.width (.availWidth) и screen.height (.availHeight).

Моя идея состояла в том, чтобы предположить (!), что мониторы в целом следуют определенному соотношению, тогда как .[avail]width должен быть за его пределами, потому что экран дублируется только по ширине, но не по высоте.

Однако написание этого ответа звучит как серьезный взлом. Ничего, на что бы я действительно полагался.

person Till    schedule 26.09.2008
comment
Так не пойдет. availwith и availHeight говорят вам на основе текущего монитора. Если окно браузера находится на втором мониторе, это можно вывести из availTop и availLeft, но если окно браузера находится на основном мониторе, эти свойства не смогут сказать вам, что второй монитор действительно существует. - person Samuel Neff; 03.05.2012