팝업 화면 닫기 대기

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

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

템플릿 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
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;
}

  • guide/screen/sync/sync_domodal.txt
  • 마지막으로 수정됨: 2023/10/31 10:27
  • 저자 127.0.0.1