Тестирование на нескольких экранах с JavaScript - PullRequest
7 голосов
/ 26 сентября 2008

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

Ответы [ 6 ]

1 голос
/ 23 января 2014

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

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

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

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, где это необходимо. </p>

В-четвертых, код грязный и может выглядеть намного элегантнее, чем на самом деле. Я не извиняюсь за это. Тем не менее, вы не должны нигде использовать такой ужасный, не поддерживаемый JS, и его НЕОБХОДИМО для переписывания. Я разместил его здесь только потому, что он сейчас находится в моем сознании, и, скорее всего, я забуду опубликовать здесь хорошее решение, когда напишу это правильно, так как этого не произойдет в течение нескольких месяцев.

правый. Вот и ты. Я не несу никакой ответственности за то, чтобы сделать ваш javascript ужасным, уродливым и совершенно сложным. :)

0 голосов
/ 26 сентября 2008

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

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

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

0 голосов
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

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

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

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

[End If]

0 голосов
/ 26 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...