2008-09-26 5 views
7

웹 사이트 사용자가 여러 모니터를 사용하고 있는지 여부를 알 수 있습니까? 팝업 위치를 찾아야하지만 사용자가 다중 모니터 설정을 할 가능성이 큽니다. window.screenX 등은 브라우저 창 위치를 알려주지 만 여러 대의 모니터에서는 쓸모가 없습니다.자바 스크립트로 여러 화면 테스트하기

+2

팝업. 그러나 절대적으로 * 사용해야한다면 절대 좌표를 사용하지 마십시오. – Shog9

+0

@ Shog9 안녕하세요, 새로운 팝업을 열 때 절대 좌표를 사용해서는 안되는 이유를 명확히 설명해 주시겠습니까? 그것은 나를 위해 매우 도움이 될 것입니다. – Vadim

+0

아마도 완전히 별개의 질문 인 @ Vadim에 적합한 주제 일 것입니다. 그러나 짧은 대답은 당신이 나에게 불편한 곳에서 팝업 위치를 정할 수있는 합리적인 기회가 있다는 것입니다. 내 보조 모니터의 오른쪽 절반에 브라우저 창이 열려있어 내 기본 모니터보다 크고 오른쪽에 위치합니다. 이것을 고려하지 않으면 팝업을 다른 앱이나 화면을 벗어나게 할 수있는 아주 좋은 기회입니다. – Shog9

답변

0

지금은 가능하다고 생각하지 않습니다. 그러나 js는 웹 개발 이외에 위젯에서 데스크톱 사용에 더 많이 사용되고 있으며, 향후 버전을 요청할 수있는 훌륭한 기능이 될 것입니다.

+0

Gears와 같은 프로젝트가 구현할 수 있을지 궁금합니다. – slashnick

+0

Gears는 데이터 저장에 관한 것입니다. – Till

0

누군가가 사용한 해결책으로 이것을 발견했습니다 ... 보이지 않습니다. 왜 당신은 그것을 믿을 수 없었습니다.

[사용자가 가지고있는 듀얼 모니터]

[최종면]

+2

어 ... 나는 화면을 쌓는다. 높이> 너비. 두 화면의 너비가 같지 않으므로 최대 너비를 포옹했다면 특정 높이 이상으로 화면이 꺼지게됩니다. 위의 두 가지는 말할 것도없고 한 가지 구성 아래 있습니다. – Shog9

+0

또한 많은 모니터가 4 : 3보다 넓은 종횡비를 가지고 있습니다. – Neall

+0

일부 컴퓨터 (자체)는 두 개의 별도 데스크톱으로 설정되므로 높이와 너비는 브라우저가있는 화면에서만 반환됩니다. – slashnick

0

당신이 할 수있는 [폭은 (높이/3) * 4> (Screen.Width)보다 큰 경우,] 그럴 수 없어. 그러나 부모 창에 팝업을 배치 할 수 있습니다. 귀하의 웹 사이트 중간에 대화 상자로 "div"를 표시하는 것이 더 좋을 것 같습니다. 팝업이 차단되는 기회가 더 적어지고 IMO의 성가심이 덜하기 때문입니다.

0

화면의 크기는 어떻습니까? 보통 여러 개의 스크린이 있습니다. 크기를 확인하고 하나 이상의 화면에있는 것이 합리적인지 결정하십시오.

0

자바 스크립트의 screen.width (.availWidth) 및 screen.height (.availHeight)을 사용하면 잘 교육 된 추측을 할 수 있습니다.

내 생각은 일반적으로 모니터가 특정 비율을 따르는 반면, 화면은 너비가 아니라 높이만 복제되기 때문에 .avail 너비가 바깥에 있어야한다는 가정 (!)입니다.

이 답변을 작성하면 심각한 해킹처럼 들릴 수 있습니다. 나는 정말로 의지하지 않을 것입니다.

+3

이것은 작동하지 않습니다. 'availwith'와'availHeight'는 현재 모니터를 기반으로 알려줍니다. 브라우저 창이 두 번째 모니터에 있으면'availTop'과'availLeft'에서 유추 할 수 있지만 브라우저 창이 기본 모니터에 있으면 두 번째 모니터가 실제로 존재 함을 알 수 없습니다. –

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); 

사용 가능한 화면 공간의 양을 확인하고 사용 가능한 경우 최소 크기 (800x600)가 있으면 창이 열립니다. 충분한 공간이 없으면 화면의 오른쪽에 창을 겹쳐서 그 중 절반 정도를 차지합니다.

주 : 공간의 최대 크기는 단지 arbitarily 왼쪽으로 검색, 오른쪽, 위, 아래가 아닌 곳

첫째, 찾아 변경해야합니다.

둘째로, 나는 screen.availHeight가 사용 된 곳에서 screen.height가 대신 사용해야한다고 생각합니다. 폭과 마찬가지로. 이는 사용자가 두 번째 모니터를 가지고 있는지 또는 화면에 많은 공간이 있는지를 결정할 때 작업 표시 줄의 위치에 지나치게 관심이 없기 때문입니다.

세 번째로 IE < 8에서 작동하지 않습니다. 적절한 경우 화면 X/화면 Y 대신 화면 왼쪽과 위쪽을 사용하여 쉽게 수정할 수 있습니다.

넷째, 코드가 엉망이며 훨씬 더 우아 해 보일 수 있습니다. 나는 이것을 사과하지 않는다. 그러나, 당신은 그런 끔찍한, unmaintainable JS를 어디에서든지 사용하면 안되며 NEEDS을 다시 써야합니다. 나는 그것이 지금 생각의 기차에 있기 때문에 여기에만 놓았고 몇 달 동안 제대로되지 않을 것이므로이 글을 올바르게 쓸 때 여기서 좋은 해결책을 게시하는 것을 잊어 버릴 것입니다.

오른쪽. 됐어. 나는 당신의 javascript를 무서운, 추악하고 솔직하게 만드는 일에 아무런 책임을지지 않습니다. :)

관련 문제