목차

팝업 화면 닫기 대기

팝업 화면에 대한 닫힘을 동기 방식으로 대기하는 기능에 대한 샘플화면이다.

자바스크립의 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

템플릿 파일

화면 스크립트

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;
}