브라우저가 팝업을 차단하고 있는지 어떻게 알 수 있습니까?


130

때때로, 나는 사용자 입력 또는 중요한 것을 위해 새 창을 열려고 시도하는 웹 페이지를 보았지만 팝업 차단기는이 문제를 방지합니다.

호출 창이 새 창을 제대로 시작하기 위해 사용할 수있는 방법은 무엇입니까?

답변:


160

JavaScript를 사용하여 팝업을 열면 다음과 같이 사용할 수 있습니다.

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}

크롬에 대한 답은 다음과 같습니다. 크롬 에서 팝업 차단
ajwaka

@ajwaka이 답변이 크롬에 실패하면 친절하게 설명 할 수 있습니까, 아니면 다른 답변이 크롬에 더 좋은 이유가 있습니까? 감사!
Crashalot

@ajwaka 적어도 오늘은이 코드가 크롬에서 작동하는 것 같습니다.
Crashalot

@Crashalot-6 년 전에 내가 대답 한 것에 대해 물어보고 있습니다. 슬프게도 더 이상 상황을 기억하지 못하고 브라우저는 6 년 만에 먼 길을 왔습니다.
ajwaka

40

위의 많은 예제를 시도했지만 Chrome에서 작동하도록 할 수 없었습니다. 이 간단한 접근 방식은 Chrome 39, Firefox 34, Safari 5.1.7 및 IE 11에서 작동하는 것 같습니다. 다음은 JS 라이브러리의 코드입니다.

openPopUp: function(urlToOpen) {
    var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");            
    try {
        popup_window.focus();   
    } catch (e) {
        alert("Pop-up Blocker is enabled! Please add this site to your exception list.");
    }
}

1
@ Surendra 제발, 당신은 "작동하지 않는"의 의미를 지정할 수 있습니까? 구문 분석 시간에 오류가 있습니까? 런타임에 오류가 있습니까? 팝업이 열리지 만 차단 된 것으로 표시되어 있습니까? 팝업이 차단되었지만 열린 것으로 표시되어 있습니까? NULL에 focus () 호출이 허용되지 않는 한 탐색기가 실패하는 이유를 알 수 없습니다.이 경우 try 전에 작동하기 전에 NULL 테스트가 작동합니다.
FrancescoMM

팝업에 성공하더라도 IE는 항상 null을 반환합니다.
Devin Garner

34

업데이트 : 팝업은 실제로 고대부터 존재합니다. 초기 아이디어는 기본 창을 닫지 않고 다른 컨텐츠를 표시하는 것이 었습니다. 현재로서는 다른 방법이 있습니다. JavaScript는 서버에 대한 요청을 보낼 수 있으므로 팝업은 거의 사용되지 않습니다. 그러나 때로는 여전히 편리합니다.

과거에는 악의적 인 사이트가 팝업을 많이 남용했습니다. 나쁜 페이지는 광고로 많은 팝업 창을 열 수 있습니다. 따라서 대부분의 브라우저는 팝업을 차단하고 사용자를 보호하려고합니다.

대부분의 브라우저는 onclick과 같은 사용자 트리거 이벤트 핸들러 외부에서 호출되는 경우 팝업을 차단합니다.

생각하면 조금 까다 롭습니다. 코드가 직접 클릭 핸들러에 있으면 쉽게 할 수 있습니다. 그러나 setTimeout에서 팝업은 무엇입니까?

이 코드를 사용해보십시오 :

 // open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);

팝업은 Chrome에서 열리지 만 Firefox에서는 차단됩니다.

… 그리고 이것은 Firefox에서도 작동합니다.

 // open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);

차이점은 Firefox가 2000ms 이하의 시간 초과를 처리한다는 점이지만, 그 이후에는 "사용자 작업 외부"라고 가정하고 "신뢰"를 제거합니다. 따라서 첫 번째는 차단되고 두 번째는 차단되지 않습니다.


현재 2012 년의 원래 답변 :

팝업 차단기 검사를위한이 솔루션은 FF (v11), Safari (v6), Chrome (v23.0.127.95) 및 IE (v7 및 v9)에서 테스트되었습니다. 오류 메시지를 처리 ​​할 수 ​​있도록 displayError 함수를 업데이트하십시오.

var popupBlockerChecker = {
    check: function(popup_window){
        var scope = this;
        if (popup_window) {
            if(/chrome/.test(navigator.userAgent.toLowerCase())){
                setTimeout(function () {
                    scope.is_popup_blocked(scope, popup_window);
                },200);
            }else{
                popup_window.onload = function () {
                    scope.is_popup_blocked(scope, popup_window);
                };
            }
        } else {
            scope.displayError();
        }
    },
    is_popup_blocked: function(scope, popup_window){
        if ((popup_window.innerHeight > 0)==false){ 
            scope.displayError();
        }
    },
    displayError: function(){
       alert("Popup Blocker is enabled! Please add this site to your exception list.");
    }
};

용법:

var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);

도움이 되었기를 바랍니다! :)


20
더 밑줄이 필요하다고 생각합니다.
Jacob Stamm

파이어 폭스에서는 빈 페이지가 표시되며 오프너 페이지에서 팝업 차단 메시지를 볼 수도 없습니다. 빈 페이지를 닫는 방법?
user460114

팝업 URL이 다운로드 가능한 파일 ( Content-Disposition: attachment;응답 헤더에 있음) 인 경우 팝업이 즉시 닫히므로 setTimeout코드가 실패하고 브라우저는 "팝업 차단기가 활성화되었습니다!"라고 불평합니다. Chrome의 경우 @DanielB의 솔루션을 권장하며 훌륭하게 작동합니다.
wonsuc

1
@wonsuc Content-Disposition: attachment;헤더 가있는 링크 를 열 때 팝업에서 열 필요가 없습니다. 다운로드하려는 자산에 직접 연결하기 만하면 브라우저의 기본 동작을 통해 현재 페이지에서 사용자를 리디렉션하지 않고도 다운로드 할 수 있습니다.
케빈 B

@KevinB 나는 특정 상황에 있다고 말해야합니다. HTML에서 PDF 파일을 생성하는 여러 파일을 다운로드해야합니다. HTML 내용이 크면 때로는 몇 초가 걸리고 그것을 사용 window.location하면 첫 번째 파일을 생성하는 데 너무 오래 걸리면 두 번째 요청이 시작될 때 무시됩니다. 그게 내가 사용해야하는 이유입니다 window.open때문에, window.location나를 때 응답 완료를 알 수 없다.
wonsuc

12

브라우저 회사 나 버전에 관계없이 항상 작동 하는 한 가지 "솔루션" 은 팝업을 생성하는 컨트롤과 가까운 곳에 화면에 경고 메시지를 표시하여 사용자에게 해당 작업에 팝업이 필요하다는 것을 공손하게 경고하는 것입니다. 사이트에서 사용하도록 설정하십시오.

나는 그것이 화려하거나 아무것도 아니지만, 더 간단하게 얻을 수 없으며 약 5 분만 테스트하면 다른 악몽으로 넘어갈 수 있습니다.

사용자가 사이트에 팝업을 허용하면 팝업을 과도하게 사용하지 않는 경우에도 고려할 것입니다. 당신이하고 싶은 마지막은 방문자를 귀찮게합니다.


1
불행히도 때때로이 질문의 다른 모든 솔루션은 허용되지 않습니다. 왜? 팝업이 활성화되어 있는지 감지하는 것이 아니라 팝업을 표시하려고하기 때문입니다. 조용히하고 싶다면 어떻게해야합니까?
Sagi Mann

여기서도 기억해야 할 것은 사용자가 항상 사이트에 팝업을 활성화 할 수는 없다는 것입니다. 예를 들어, 이전 버전의 사파리에서는 사용자가 허용 목록을 표시하지 않고 팝업 차단기를 완전히 활성화 또는 비활성화 할 수 있습니다.
제레미

1

@Kevin B와 @DanielB의 솔루션을 결합했습니다.
이것은 훨씬 간단합니다.

var isPopupBlockerActivated = function(popupWindow) {
    if (popupWindow) {
        if (/chrome/.test(navigator.userAgent.toLowerCase())) {
            try {
                popupWindow.focus();
            } catch (e) {
                return true;
            }
        } else {
            popupWindow.onload = function() {
                return (popupWindow.innerHeight > 0) === false;
            };
        }
    } else {
        return true;
    }
    return false;
};

용법:

var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
    // Do what you want.
}

1
isPopupBlockerActivated 함수는에 반환되지 않습니다 return (popupWindow.innerHeight > 0) === false;. 브라우저가 Chrome이 아닌 경우 함수가 false를 반환합니다. onload는 비동기 프로세스이기 때문입니다. 함수는 false를 반환 한 다음 onload가 실행되지만 결과는 반환되지 않습니다.
Onur Gazioğlu

0

많은 솔루션을 시도했지만 uBlock Origin과 함께 사용할 수있는 유일한 방법은 시간 초과를 사용하여 팝업의 닫힌 상태를 확인하는 것입니다.

function popup (url, width, height) {
    const left = (window.screen.width / 2) - (width / 2)
    const top = (window.screen.height / 2) - (height / 2)
    let opener = window.open(url, '', `menubar=no, toolbar=no, status=no, resizable=yes, scrollbars=yes, width=${width},height=${height},top=${top},left=${left}`)

    window.setTimeout(() => {
        if (!opener || opener.closed || typeof opener.closed === 'undefined') {
            console.log('Not allowed...') // Do something here.
        }
    }, 1000)
}

분명히 이것은 해킹입니다. 이 문제에 대한 모든 솔루션과 같습니다.

초기 개회 및 마감을 설명하기 위해 setTimeout에 충분한 시간을 제공해야하므로 절대 정확하지는 않습니다. 시행 착오의 위치가 될 것입니다.

시도 목록에 추가하십시오.


0

자식 코드를 소유하고 있다면 간단한 접근 방식 은 다음과 같이 HTML에 간단한 변수를 만드는 것입니다.

    <script>
        var magicNumber = 49;
    </script>

그런 다음 부모와 비슷한 것이 있는지 확인하십시오.

    // Create the window with login URL.
    let openedWindow = window.open(URL_HERE);

    // Check this magic number after some time, if it exists then your window exists
    setTimeout(() => {
        if (openedWindow["magicNumber"] !== 32) {
            console.error("Window open was blocked");
        }
    }, 1500);

웹 페이지가로드되었는지 확인하고 존재 여부를 확인하기 위해 잠시 기다립니다. 분명히, 창이 1500ms 후에로드되지 않으면 변수는 여전히입니다 undefined.


-1

onbeforeunload 이벤트를 사용하여 다음과 같이 확인할 수 있습니다

    function popup()
    {
        var chk=false;
        var win1=window.open();
        win1.onbeforeunload=()=>{
            var win2=window.open();
            win2.onbeforeunload=()=>{
                chk=true;
            };
        win2.close();
        };
        win1.close();
        return chk;
    }

백그라운드에서 2 개의 검은 색 창이 열립니다.

이 함수는 부울 값을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.