Frontend/javaScript

window.close (부모window, 자식window 닫기)

dddzr 2023. 1. 11. 23:04

[요구사항]

1. mian 페이지에서 subPage를 오픈.

2. 어떤 페이지에서 로그아웃되면 전체 페이지에서 로그아웃 (한 창만 로그아웃화면으로 이동하고 나머지는 닫음)

3. 부모창을 닫으면 자식창도 닫침. (부모창 닫을때 컨펌)

4. mian페이지 위에 최상위 부모창이 있을 경우도 있음.

 

subPage1

 $scope.logout = function () {//subPage1에서 로그아웃할때 바로 /lougout으로 이동하지 않고 상위 페이지 close    
	sessionStorage.clear();
	localStorage.setItem("closeAllTabs", "Y");
	localStorage.setItem("closeTabsTrigger", "subPage1");
	window.opener.close();
	// location.href = "../logout";
};

 

mainPage

$scope.systemOpenWin = function (systemId) {//subPageOpen
	if (systemId == "subPage1") {
		let url = commonUtil.getDataServiceURL("") + "subPage1";
		if (subPage1Win == undefined || subPage1Win.closed) {
			subPage1Win = window.open(url);//sub창 안열렸을 때 새로오픈
		} else {
			if (subPage1Win.location.pathname.includes("/subPage1/")) {
				subPage1Win.self.focus();//열렸고 페이지이동 안했을 때 focus
			} else {
				subPage1Win = window.open(url);//열렸다가 페이지 이동했을때
			}
		}
	}
}

function logout() {//로그아웃        
      sessionStorage.clear();
      localStorage.setItem("closeAllTabs", "Y");
      localStorage.setItem("closeTabsTrigger", "main");
      closeTabs();
      // location.href = "../logout";
};

window.onbeforeunload = function (event) {
    event.preventDefault();
	event.stopPropagation();
    if(localStorage.getItem("closeAllTabs") !== "Y"){//로그아웃 아닐 때, 자식창에 의해 닫히지x, 본인꺼 닫을 때
       return ""//beforeunload함수에서 return하면 화면 닫기 confrim메세지 뜸.
    }else{
       closeTabs();
    }
}

window.onunload = function (event) {//컨펌창에서 확인했을 때 unload로 넘어감, 컨펌창 안띄우면 바로 넘어옴
    event.preventDefault();
    closeTabs();//최종 main화면 닫음.
}

$scope.closeTabs = function(){
	// closeAllTabs는 로그아웃 했을 때 Flag로 부모창도 닫음.
    let closeTabsTrigger = localStorage.getItem("closeTabsTrigger");
    if(subPage1Win !== undefined && closeTabsTrigger  !== "subPage1Win"){
       subPage1Win.close();//main의 부모창이 없을 경우 닫지 않고 /logout으로 이동
    }
    if(subPage2Win !== undefined && closeTabsTrigger  !== "subPage2Win"){
       subPage2Win.close();//sub창 닫음
    }
    if(localStorage.getItem("closeAllTabs") === "Y" && closeTabsTrigger !== "main"){
       if(window.opener !== undefined && !window.opener.closed){//더 상위 창이 있을 때
            if(!window.opener.closed){
                window.opener.location.href = "../logout";//최상위창을 /logout으로 보내고
                window.close();//->beforeunload 발생-> 다시한번 closeTabs()실행됨 -> trigger은 "" -> 이전 trigger였던 자식창도 닫음
             }else{
                location.href = "../logout";//다시한번 closeTabs()실행됨 -> trigger은 "" -> 이전 trigger였던 자식창도 닫음
             }
             // window.opener.close();
         }
     }
     localStorage.setItem("closeAllTabs", "N");
     localStorage.setItem("closeTabsTrigger", "");
}