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

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

Всплывающие окна - отстой. Но если вы абсолютно должен используете их, то расположите их относительно их родительского окна - НЕ используйте абсолютные координаты.

Shog9 26.09.2008 20:18

@ Shog9 привет, не могли бы вы пояснить, почему мы не должны использовать абсолютные координаты при открытии новых всплывающих окон? Это будет мне очень полезно.

Vadim 22.09.2014 11:54

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

Shog9 23.09.2014 07:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
3
12 870
6

Ответы 6

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

Интересно, может ли это реализовать такой проект, как Gears?

slashnick 26.09.2008 20:19

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

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

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

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

Эээ ... Я складываю свои экраны. Высота> Ширина. Ни один из экранов не имеет одинаковой ширины, поэтому, если вы используете максимальную ширину, вы окажетесь за пределами экрана за пределами определенной высоты. Не говоря уже о двух верхних конфигурациях, одна снизу.

Shog9 26.09.2008 21:55

Кроме того, многие мониторы имеют более широкое соотношение сторон, чем 4: 3.

Neall 26.09.2008 23:30

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

slashnick 30.09.2008 16:31

У вас может быть первичный моно с высоким разрешением и вторичный моно с низким разрешением. Это решение не годится.

Gary Tsui 19.08.2011 08:00

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

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

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

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

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

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

Samuel Neff 03.05.2012 05:28

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

Хорошо, предостережения.

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

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

Другие вопросы по теме