====== 팝업 화면 닫기 대기 ======
팝업 화면에 대한 닫힘을 동기 방식으로 대기하는 기능에 대한 샘플화면이다.
자바스크립의 Promise 오브젝트를 사용하는 방법인 async, await 문법(ECMAScript (ECMA-262)을 사용한다.
동기 방식 API 함수를 호출하는 함수는 async function이어야하며, await 문법을 이용해서 동기 방식 API를 호출해야 한다.
동기 방식 API는 IE에서는 지원되지 않는다.
관련 API로 domodal, getscreentype이 있다.
관련 이벤트로 on_popupload, on_popupdestroy가 있다.
===== 예시 =====
템플릿 위치: /HTML5/SCREEN/SYNC/sync_domodal
템플릿 파일
* [[xf5projecthome>template/screen/HTML5/SCREEN/SYNC/sync_domodal.xml|sync_domodal.xml]]
* [[xf5projecthome>template/screen/HTML5/SCREEN/SYNC/sync_domodal.js|sync_domodal.js]]
* [[xf5projecthome>template/template.html?xframe_screen_url=/HTML5/SCREEN/SYNC/sync_domodal|새창으로 실행]]
echo '';
echo '';
echo '';
==== 화면 스크립트 ====
var SCREEN_BASE_DIR = "/HTML5/SCREEN/SYNC/";
// 화면 로드 이벤트
function screen_on_load()
{
factory.showconsoletrace(true);
}
/**
* factory.loadpopup API로 로드한 팝업 화면이 로드가 완료되면 발생하는 이벤트
*
* @param popup_screen 팝업 화면 인스턴스 오브젝트
* @param popup_name factory.loadpopup API 호출시 지정한 팝업 이름
*/
async function screen_on_popupload(popup_screen, popup_name)
{
var log_prefix, popup_ret;
log_prefix = "mainscreen:screen_on_popupload> ";
factory.consoleprint(log_prefix + "start");
factory.consoleprint(log_prefix + "popup_name = " + popup_name);
if (factory.isobject(popup_screen)) {
factory.consoleprint(log_prefix + "screen = " + popup_screen.getscreenurl());
}
// domodal 호출 여부 옵션 검사
if (this.chk_calldomodal.getcheck()) {
factory.consoleprint(log_prefix + "screen type = " + popup_screen.getscreentype());
factory.consoleprint(log_prefix + "before WaitPopupUnload");
popup_ret = await WaitPopupUnload(screen, popup_name, popup_screen.getscreentype() == 0 ? false : true);
factory.consoleprint(log_prefix + "after WaitPopupUnload");
factory.consoleprint(log_prefix + "popup_ret = " + popup_ret);
}
factory.consoleprint(log_prefix + "end");
}
/**
* 로드된 팝업 화면에서 unloadpopup API 호출로 인해서 팝업이 닫힐때 발생하는 이벤트
*
* @param popup_screen 팝업 화면 인스턴스 오브젝트
* @param popup_name factory.loadpopup API 호출시 지정한 팝업 이름
* @param result 로드된 팝업 화면에서 unloadpopup API 호출시 전달한 파라미터 값
*/
function screen_on_popupdestroy(popup_screen, popup_name, result)
{
var log_prefix;
log_prefix = "mainscreen:screen_on_popupdestroy> ";
factory.consoleprint(log_prefix + "start");
factory.consoleprint(log_prefix + "popup_name = " + popup_name);
factory.consoleprint(log_prefix + "result = " + result);
factory.consoleprint(log_prefix + "end");
}
// "loadpopup" 버튼 이벤트
function btn_loadpopup_on_mouseup(objInst)
{
var log_prefix, ret, is_modal;
log_prefix = "mainscreen:loadpopup> ";
is_modal = this.chk_modalpopup.getcheck();
// 일반 화면을 모달/모달리스 팝업으로 비동기 방식 로드
factory.consoleprint(log_prefix + "before loadpopup");
ret = factory.loadpopupex("POPUP_SCREEN_ASYNC",
SCREEN_BASE_DIR + "business_screen", "POPUP SCREEN ASYNC",
false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, is_modal,
screen, "POPUPSCREEN_EXTRADATA");
factory.consoleprint(log_prefix + "after loadpopup");
factory.consoleprint(log_prefix + "ret = " + ret);
}
// "loadpopupsync" 버튼 이벤트
async function btn_loadpopupsync_on_mouseup(objInst)
{
var log_prefix, popup_screen, ret, popup_ret, is_modal;
log_prefix = "mainscreen:loadpopupsync_modal> ";
is_modal = this.chk_modalpopup.getcheck();
// 일반 화면을 모달/모달리스 팝업으로 동기 방식 로드
factory.consoleprint(log_prefix + "before loadpopupsync");
ret = await factory.loadpopupsync("POPUP_SCREEN_SYNC",
SCREEN_BASE_DIR + "business_screen", "POPUP SCREEN SYNC",
false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, is_modal,
screen, "POPUPSCREEN_EXTRADATA");
factory.consoleprint(log_prefix + "after loadpopupsync");
factory.consoleprint(log_prefix + "return = " + ret);
// 팝업 이름을 기준으로 팝업 화면 인스터스를 구하여 화면 URL 로깅
popup_screen = factory.findpopup("POPUP_SCREEN_SYNC");
if (factory.isobject(popup_screen)) {
factory.consoleprint(log_prefix + "screen = " + popup_screen.getscreenurl());
}
// domodal 호출 여부 옵션 검사
if (this.chk_calldomodal.getcheck()) {
factory.consoleprint(log_prefix + "before WaitPopupUnload");
popup_ret = await WaitPopupUnload(screen, "POPUP_SCREEN_SYNC", true);
factory.consoleprint(log_prefix + "after WaitPopupUnload");
return popup_ret;
}
return ret;
}
// "loadportletpopup 버튼 이벤트
function btn_loadportletpopup_on_mouseup(objInst)
{
var log_prefix, ret;
log_prefix = "mainscreen:loadportletpopup> ";
// 포틀릿 화면을 모달 팝업으로 비동기 방식 로드
factory.consoleprint(log_prefix + "before loadportletpopup");
ret = screen.loadportletpopup("POPUP_PORTLET_ASYNC",
SCREEN_BASE_DIR + "business_screen", "POPUP PORTLET ASYNC",
false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, false,
"POPUPSCREEN_EXTRADATA");
factory.consoleprint(log_prefix + "after loadportletpopup");
factory.consoleprint(log_prefix + "ret = " + ret);
}
// "loadportletpopupsync" 버튼 이벤트
async function btn_loadportletpopupsync_on_mouseup(objInst)
{
var log_prefix, popup_screen, ret, popup_ret;
log_prefix = "mainscreen:loadportletpopupsync> ";
// 포틀릿 화면을 모달 팝업으로 동기 방식 로드
factory.consoleprint(log_prefix + "before loadportletpopupsync");
ret = await screen.loadportletpopupsync("POPUP_PORTLET_SYNC",
SCREEN_BASE_DIR + "business_screen", "POPUPPORTLET SYNC",
false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, false,
"POPUPSCREEN_EXTRADATA");
factory.consoleprint(log_prefix + "after loadportletpopupsync");
factory.consoleprint(log_prefix + "return = " + ret);
// 팝업 이름을 기준으로 팝업 화면 인스터스를 구하여 화면 URL 로깅
popup_screen = screen.findportletpopup("POPUP_PORTLET_SYNC");
if (factory.isobject(popup_screen)) {
factory.consoleprint(log_prefix + "screen = " + popup_screen.getscreenurl());
}
// domodal 호출 여부 옵션 검사
if (this.chk_calldomodal.getcheck()) {
factory.consoleprint(log_prefix + "before WaitPopupUnload");
popup_ret = await WaitPopupUnload(screen, "POPUP_PORTLET_SYNC", true);
factory.consoleprint(log_prefix + "after WaitPopupUnload");
factory.consoleprint(log_prefix + "popup_ret = " + popup_ret);
return popup_ret;
}
return ret;
}
/**
* 팝업 화면이 닫히는 것을 동기 방식으로 대기
*
* @param is_modal 모달 팝업 여부
* @param obj_screen 팝업 화면 대기 화면 인스턴스
* @param popup_name 팝업 화면 이름
* @param is_portlet_popup 포틀릿 팝업 여부
*
* @returns 팝업 화면에서 unloadpopup API 호출시 전달된 파라미터 값
*/
async function WaitPopupUnload(obj_screen, popup_name, is_portlet_popup)
{
var log_prefix, obj_extra_data, popup_screen;
log_prefix = "mainscreen:WaitPopupUnload> ";
// 팝업 화면 인스턴스를 구함
if (is_portlet_popup) {
popup_screen = obj_screen.findportletpopup(popup_name);
}
else {
popup_screen = factory.findpopup(popup_name);
}
if (!factory.isobject(popup_screen)) { return null; }
// 팝업 화면에 대해서 domodal API를 호출하여, 팝업 화면이 닫힐 때까지 대기
// 팝업 화면에서 unloadpopup API 호출시 전달된 파라미터 값이 리턴값으로 설정됨
// domodal API 호출시 팝업 부모 화면의 "on_popupdestroy" 이벤트는 발생하지 않음
// domodal API를 호출하지 않으면, on_popupdestroy 이벤트를 통해서
// 팝업 화면에서 unloadpopup API 호출시 전달된 파라미터 값이 전달됨
factory.consoleprint(log_prefix + "before domodal");
popup_ret = await popup_screen.domodal();
factory.consoleprint(log_prefix + "after domodal");
factory.consoleprint(log_prefix + "popup_ret = " + popup_ret);
return popup_ret;
}