테스트 사이트 - 개발 중인 베타 버전입니다

opener 부모창에 대한 접근이 안됩니다...ㅜㅜ 채택완료

김준수사랑 7개월 전 조회 2,089

인덱스에서 최신글등을 모달창으로 띄우고 있습니다.

최신글을 누르면 모달창이 열리고,

모달창 에서 글쓰기등을 하면

form 타겟을 target="myiframe" 이렇게 주어 처리페이지에서는 새로고침을 하려고합니다

<iframe name="myiframe" src="" style="display:none;"></iframe>

 

처리완료페이지에서 top 으로 하면 모달창까지 다닫히면서 새로고침이 됩니다.

echo "<body onLoad='top.document.location.reload();'>";

 

그래서 top 부분을 opener로 바꾸면 새로고침자체가 안되고 그대로 멈춰있구요...

opener가 안되는것같은데 뭐가 잘못된걸까요..ㅜㅜ

 

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트
glitter0gim
7개월 전

모달창과 iframe의 DOM 구조 문제로 인해 발생하는 증상입니다.

opener 객체는 window.open()을 열었을 때만 부모 창을 참조할 수 있습니다.

그러나 모달은 기존 페이지 내에서 생성되므로 opener를 사용할 수 없습니다.

따라서, iframe 내에서 부모 문서를 새로고침하려면 parent 또는 top 객체를 사용해야 합니다.

하지만, 현재 모달창 내부의 iframe에서 부모 문서를 새로고침하려는 경우,

top.location.reload();론 전체 페이지가 새로고침되면서 모달도 닫히는 문제가 발생합니다.

parent.location.reload();로 모달을 유지하면서 부모 문서만 새로고침할 수 있습니다.

1. index.php 예시 코드

<button id="openModal">최신글 보기</button>

<div id="myModal" style="display:none;">
    <form action="write_update.php" method="post" target="myiframe">
        <input type="text" name="content">
        <button type="submit">작성</button>
    </form>
</div>

<!-- iframe (서버 응답을 처리할 용도) -->
<iframe name="myiframe" style="display:none;"></iframe>

<script>
// 모달 열기 버튼 클릭 시 상태 저장
document.getElementById('openModal').addEventListener('click', function() {
    document.getElementById('myModal').style.display = 'block';
    sessionStorage.setItem("modalOpen", "yes"); // 모달이 열려 있음을 저장
});

// 부모 페이지가 새로고침될 때 모달 상태 유지
window.onload = function() {
    if (sessionStorage.getItem("modalOpen") === "yes") {
        document.getElementById('myModal').style.display = 'block';
    }
};

// 모달 닫기 (ESC 키로 닫기)
document.addEventListener('keydown', function(event) {
    if (event.key === "Escape") {
        document.getElementById('myModal').style.display = 'none';
        sessionStorage.removeItem("modalOpen"); // 모달 상태 초기화
    }
});

</script>

2. 처리 완료 후 index.php만 새로고침 (write_update.php에서 실행)

<?php
echo "<script>parent.location.reload();</script>";

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

김준수사랑
7개월 전
echo "<script>parent.location.reload();</script>";
이거 하줄로 되었네요;;; 너무너무 감사합니다~~~
g
glitter0gim
7개월 전
(●'◡'●) 감사합니다.

댓글을 작성하려면 로그인이 필요합니다.

7개월 전

자바스크립트에서 세션스토리지 변수를 하나 만들어서

가령 yes 일때는 모달열기 no 일때는 모달닫기

이렇거 한후 부모창 리로드시 세션변수에 yes 가 들어가도록 하면 될 것입니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

glitter0gim
7개월 전

.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인