팝업을 열고 닫을 때 상위 페이지 새로 고침


94

JavaScript에서 window.open으로 팝업 창을 열 었는데,이 팝업 창을 닫을 때 상위 페이지를 새로 고침하고 싶습니다. (onclose 이벤트?) 어떻게 할 수 있습니까?

window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");

1
이를 확인하시기 바랍니다 : stackoverflow.com/questions/18321323/... 힘 도움말 사람
NONAME

답변:


231

' window.opener '를 사용하여 부모 창에 액세스 할 수 있으므로 자식 창에 다음과 같이 작성합니다.

<script>
    window.onunload = refreshParent;
    function refreshParent() {
        window.opener.location.reload();
    }
</script>

window.opener, 고마워요! 나는 항상 호출자 창을 자식의 contentWindow에있는 변수에 넣습니다. : - /
케이 - SE는 악이다

3
자식 페이지 (예 : OAuth 흐름)에서 JavaScript를 제어하지 않는 경우 @Zuul의 솔루션에서 like를 popupWindow.closed사용하여 확인해야합니다 setInterval.
jchook

34

팝업 창에는들을 수있는 닫기 이벤트가 없습니다.

반면에 창이 닫힐 때 true로 설정되는 closed 속성이 있습니다.

닫힌 속성을 확인하도록 타이머를 설정하고 다음과 같이 할 수 있습니다.

var win = window.open('foo.html', 'windowName',"width=200,height=200,scrollbars=no");   
var timer = setInterval(function() {   
    if(win.closed) {  
        clearInterval(timer);  
        alert('closed');  
    }  
}, 1000); 

작동하는 Fiddle 예제를 참조하십시오 !


1
나는 타이머를 사용하고 싶지 않다! 다른 생각?
ArMaN

1
다소 끔찍하지만 타이머를 사용하는 것이 모든 브라우저에서 가장 잘 작동한다고 생각합니다.
kay-SE는 악입니다.

이는 팝업이 닫히기 전에 여러 페이지가있는 경우에도 최상의 솔루션입니다. onunload 이벤트는 사용자가 첫 번째 페이지에서 이동 한 후에 만 ​​트리거되기 때문입니다.
AntonChanning

14

자녀 페이지에 다음을 입력하십시오.

<script type="text/javascript">
    function refreshAndClose() {
        window.opener.location.reload(true);
        window.close();
    }
</script>

<body onbeforeunload="refreshAndClose();">

하지만 좋은 UI 디자인으로 button더 사용자 친화적이기 때문에 닫기를 사용해야합니다 . 아래 코드를 참조하십시오.

<script type="text/javascript">
    $(document).ready(function () {
        $('#btn').click(function () {
            window.opener.location.reload(true);
            window.close();
        });
    });
</script>

<input type='button' id='btn' value='Close' />

사용자가 버튼을 클릭하여 페이지를 새로 고치고 팝업 창을 닫을 때가 아니라 팝업 창이 닫힐 때
gengkev

@gengkev, OP가 창 닫기에 이벤트를 첨부하고 싶어한다는 것을 알고 있었지만 버튼을 사용하는 것이 더 나은 UI 디자인이라고 생각합니다. 그러나 두 가지 모두에 대한 코드를 포함했습니다. 조언하십시오.
Ray Cheng

나는 <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> function refreshAndClose () {window.opener.location.reload (true); } self.close (); </ script>
steve0nz 2013-08-10

3

나는 이것을 사용한다 :

<script language='javascript'>
var t;
function doLoad() {
t = setTimeout("window.close()",1000);
}

</script>
<script type="text/javascript">
function refreshAndClose() {
    window.opener.location.reload(true);
    window.close();
}
</script>
<body onbeforeunload="refreshAndClose();" onLoad='doLoad()''>

창이 닫히면 상위 창을 새로 고칩니다.


2

window.open은 열린 URL이 동일한 출처 정책을 준수하는 경우 새로 생성 된 창에 대한 참조를 반환합니다. .

이것은 작동합니다.

function windowClose() {
    window.location.reload();
}

var foo = window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
foo.onbeforeunload= windowClose;​

사용자가 열린 창에서 링크를 따라갈 수있는 경우 작동하지 않습니다. 그리고 암시 적으로 about : blank를 남겨두기 때문에 대상 URL이 처음로드되기 전에 언로드 이벤트가 발생한다고 확신합니다. (SOP를 언급하는 데 +1)
kay-SE는 사악합니다.

2

제 경우에는 상위 페이지에서 링크 버튼을 클릭하면 팝업 창을 열었습니다. 다음을 사용하여 자식을 닫을 때 부모를 새로 고치려면

window.opener.location.reload();

자식 창에서 자식 창을 다시 열었습니다 (보기 상태 때문일 수 있습니다. 내가 틀렸다면 수정하십시오). 그래서 부모 페이지를 다시로드하지 않고 동일한 URL을 할당하여 페이지를 다시로드하기로 결정했습니다.

팝업 창을 닫은 후 팝업이 다시 열리지 않도록하려면 도움이 될 수 있습니다.

window.onunload = function(){
    window.opener.location = window.opener.location;};

1

앱이 HTML5 지원 브라우저에서 실행되는 경우. postMessage 를 사용할 수 있습니다 . 거기에 주어진 예는 당신과 매우 유사합니다.


"그렇지 않으면 서로 다른 창간에 통신 할 수 없습니다." 잘못되었습니다. 기술은 여전히 ​​가능하지만 @Moses
gengkev

-1 제거됨. 작은 예를 들어 보면 +1도받을 수 있습니다 ;-)
kay-SE is evil

신경 쓰지 마. 그러나 나는 window.opener가 IE에 대해 괜찮다고 생각하지 않습니다. 시도해 볼게요.
Chris Li

1
@kay, IE7, 8에서 잘 작동합니다. 아주 좋아, 전에는 몰랐습니다. 모세의 경우 +1.
Chris Li

1
@ArMaN : jsfiddle.net/8c2e4/10 , window.opener를 사용 하세요 . 이를 사용하여 환경을 테스트 할 수 있습니다.
Chris Li

1

이 시도

        self.opener.location.reload(); 

현재 창의 부모를 열고 위치를 다시로드합니다.


0

모든 것을 만들 수있는 단계 후에 부모 명령 (부모는 창)으로 메인 페이지에 도달 할 수 있습니다.

    function funcx() {
        var result = confirm('bla bla bla.!');
        if(result)
            //parent.location.assign("http://localhost:58250/Ekocc/" + document.getElementById('hdnLink').value + "");
            parent.location.assign("http://blabla.com/" + document.getElementById('hdnLink').value + "");
    } 

0

상위 페이지에서 아래 코드를 사용할 수 있습니다.

<script>
    window.onunload = refreshParent;
    function refreshParent() {
      window.opener.location.reload();
    }
</script>

0

다음 코드는 닫기 후 상위 창 새로 고침을 관리합니다.

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.