Это слишком сложное решение. Я очень рекомендую рефакторинг этого - он не использовался на производственной площадке, только для быстрого «доказательства концепции» для меня.
Правильно, предостережения закончились.
Сначала я предположил, что у пользователя может не быть настройки с двумя мониторами, но у него может быть очень большой монитор, и поэтому в любом случае можно применить те же функции.
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 ужасным, уродливым и совершенно сложным. :)