Вопрос по cross-browser, javascript, html – Тестирование на нескольких экранах с JavaScript

7

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

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

Ваш Ответ

6   ответов
1

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

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

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

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 ужасным, уродливым и совершенно сложным. :)

0

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

Gears о хранении данных. Till
Интересно, если этоЧто-то, что может реализовать проект, подобный Gears? slashnick
0

ер. Просто проверьте размеры и решите, есть лиРазумно быть на одном или нескольких экранах.

0

pt (screen.width.availWidth) а также (screen.height.availHeight).

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

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

Это не будет работать.availwith а такжеavailHeight сказать вам на основе текущего монитора. Если окно браузера находится на втором мониторе, оно может быть выведено изavailTop а такжеavailLeft, но если окно браузера находится на основном мониторе, то эти свойства не смогут сообщить вам, что второй монитор действительно существует. Samuel Neff
0

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

[если ширина больше чем (Высота / 3) * 4> (Screen.Width) THEN]

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

[End If]

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

сделать это. Однако вы можете расположить всплывающее окно по центру родительского окна. Я думаю это'Лучше показать "ДИВ» как диалог в середине вашего сайта, потому что вероятность того, что это заблокировано всплывающих окон меньше, и этоИМО менее раздражает.

Похожие вопросы