|
1 | 1 | /************************************************************************************** |
2 | | - * jQuery MsgBox 0.8.0 |
| 2 | + * jQuery MsgBox 0.8.1 |
3 | 3 | * by composite (ukjinplant@msn.com) |
4 | 4 | * http://blog.hazard.kr |
5 | 5 | * This project licensed under a MIT License. |
|
9 | 9 | window.console = {}; |
10 | 10 | window.console.log = $.noop; |
11 | 11 | } |
12 | | - var fixed = 'fixed', div = 'div', kp = 'keypress', rs = 'resize', legacy = 'v' == '\v' //IE 8 대응. |
| 12 | + var fixed = 'fixed', div = 'div', kp = 'keypress', rs = 'resize', mb = 'msgbox-', dmb = '.' + mb, cst = mb + '-style', btn = 'button', clk = 'click', legacy = 'v' == '\v' //IE 8 대응. |
13 | 13 | ,isCssDef = function(css){ |
14 | 14 | return !css || css == 'auto'; |
15 | 15 | },$$ = function(tag){return $(document.createElement(tag));}; |
|
18 | 18 | var styleGen = function(style, repl){ |
19 | 19 | if(styleGen.once && !repl) return; |
20 | 20 | style = style || {}; |
21 | | - var css = styleGen.style ? styleGen.style : (styleGen.style = $$('style').addClass('msgbox-style').attr('type','text/css')), builder = []; |
| 21 | + var css = styleGen.style ? styleGen.style : (styleGen.style = $$('style').addClass(cst).attr('type','text/css')), builder = []; |
22 | 22 |
|
23 | 23 | for(var part in style){ |
24 | 24 | if(!style[part]){continue;} |
25 | 25 | var cs = style[part]; |
26 | 26 |
|
27 | | - builder.push('.msgbox-' + part); |
| 27 | + builder.push(dmb + part); |
28 | 28 | builder.push('{'); |
29 | 29 |
|
30 | 30 | for(var name in cs){ |
|
58 | 58 | options = $.extend({}, $.msgbox.options, options); |
59 | 59 |
|
60 | 60 | //스타일 생성 |
61 | | - if(!$('.msgbox-style').length){styleGen($.msgbox.css);} |
| 61 | + if(!$(cst).length){styleGen($.msgbox.css);} |
62 | 62 |
|
63 | 63 | //변수 및 요소 정의 |
64 | 64 | var io = {}, |
65 | | - mb = 'msgbox-', |
66 | 65 | cok = mb + 'ok', |
67 | 66 | cno = mb + 'no', |
68 | 67 | pw = 'password', |
|
73 | 72 | q = !!options.confirm, |
74 | 73 | iae = function(e) { //포커스된 요소가 메시지박스 아니면 메시지박스로 강제 포커스 이동 |
75 | 74 | setTimeout(function(){ |
76 | | - var act=$(document.activeElement),ms=['.'+mb+'input','.'+mb+'button']; |
| 75 | + var act=$(document.activeElement),ms=[dmb+'input',dmb+btn]; |
77 | 76 | if(act.length&&(act.is(ms[0])||act.is(ms[1]))){ |
78 | 77 | //console.log('good.'); |
79 | 78 | } |
|
82 | 81 | }, |
83 | 82 | $W = $(window), |
84 | 83 | //경고창 |
85 | | - $C = $$('div').addClass(mb + 'container').append($$(div).addClass(mb + 'ui').addClass(mb + (p ? 'prompt' : (q ? 'confirm' : 'alert')))).children(), |
| 84 | + $C = $$(div).addClass(mb + 'container').append($$(div).addClass(mb + 'ui').addClass(mb + (p ? 'prompt' : (q ? 'confirm' : 'alert')))).children(), |
86 | 85 | //경고창 배경 |
87 | 86 | $M = $$(div).addClass(mb + 'modal'), |
88 | 87 | //경고 내용 |
|
94 | 93 | var code = e.which; |
95 | 94 | if(code == 9 && e.shiftKey){ |
96 | 95 | e.preventDefault(); |
97 | | - $C.find('.'+mb+'button').filter(':last').focus(); |
| 96 | + $C.find(dmb+btn).filter(':last').focus(); |
98 | 97 | }else{ |
99 | 98 | switch(code){ |
100 | 99 | case 13://엔터는 확인 |
101 | 100 | e.preventDefault(); |
102 | | - $C.find('button.' + cok).trigger('click'); |
| 101 | + $C.find(btn + '.' + cok).trigger(clk); |
103 | 102 | return false; |
104 | 103 | case 27://ESC는 취소 |
105 | 104 | e.preventDefault(); |
106 | | - $C.find('button.' + (p || q ? cno : cok)).trigger('click'); |
| 105 | + $C.find(btn + '.' + (p || q ? cno : cok)).trigger(clk); |
107 | 106 | break; |
108 | 107 | } |
109 | 108 | } |
|
112 | 111 | //경고 버튼 나열 |
113 | 112 | $B = $$(div).addClass(mb + 'buttons').appendTo($C), |
114 | 113 | //기본 버튼 |
115 | | - $BT = $$("button").addClass(mb + 'button').bind('keydown',function(e){ |
| 114 | + $BT = $$(btn).addClass(mb + btn).bind('keydown',function(e){ |
116 | 115 | if(this!=document.activeElement) return; |
117 | 116 |
|
118 | 117 | e.stopPropagation(); |
|
121 | 120 | case 9://탭키 누르면 다음 버튼 및 입력창 포커스 |
122 | 121 | case 39://오른쪽키 누르면 다음 버튼으로만 포커스 |
123 | 122 | e.preventDefault(); |
124 | | - if(target=that[code==9&&shift?'prev':'next']('button'),target.length) target.focus(); |
| 123 | + if(target=that[code==9&&shift?'prev':'next'](btn),target.length) target.focus(); |
125 | 124 | else if(code==9){ |
126 | | - if(target=$C.find('.'+mb+'input'),target.length) target.select(); |
127 | | - else if(target=that[shift?'next':'prev']('button'),target.length) target.focus(); |
| 125 | + if(target=$C.find(dmb+'input'),target.length) target.select(); |
| 126 | + else if(target=that[shift?'next':'prev'](btn),target.length) target.focus(); |
128 | 127 | } |
129 | 128 | break; |
130 | 129 | case 37://왼쪽키는 이전 버튼으로만 포커스 |
131 | 130 | e.preventDefault(); |
132 | | - if(target=that.prev('button'),target.length) target.focus(); |
| 131 | + if(target=that.prev(btn),target.length) target.focus(); |
133 | 132 | break; |
134 | 133 | case 27://ESC는 무조건 취소처리 |
135 | 134 | e.preventDefault(); |
136 | | - $C.find('button.' + (p || q ? cno : cok)).trigger('click'); |
| 135 | + $C.find(btn + '.' + (p || q ? cno : cok)).trigger(clk); |
137 | 136 | break; |
138 | 137 | } |
139 | 138 | }).bind('blur',iae), |
|
169 | 168 | var code = window.event ? window.event.keyCode : e.which; |
170 | 169 | //전역 메시지박스에도 before가 붙으므로 격리. |
171 | 170 | if(e.target.type=='text'&&!code){ |
172 | | - $C.find('button.' + (p || q ? cno : cok)).trigger('click'); |
| 171 | + $C.find(btn + '.' + (p || q ? cno : cok)).trigger(clk); |
173 | 172 | return f; |
174 | 173 | } |
175 | 174 | switch (code) { |
176 | 175 | case 13: |
177 | | - $C.find('button:focus').trigger('click'); |
| 176 | + $C.find(btn + ':focus').trigger('click'); |
178 | 177 | return f; |
179 | 178 | case 27: |
180 | | - $C.find('button.' + (p || q ? cno : cok)).trigger('click'); |
| 179 | + $C.find(btn + '.' + (p || q ? cno : cok)).trigger(clk); |
181 | 180 | return f; |
182 | 181 | } |
183 | 182 | }; |
184 | 183 | //body에 삽입 후 레이아웃 잡기 |
185 | | - var kt = '.' + mb + 'ui,.' + mb + 'modal', |
| 184 | + var kt = dmb + 'ui,' + dmb + 'modal', |
186 | 185 | $D = $(document.documentElement || document.body).append($M).append($C.parent()).bind(kp, io.before); |
187 | 186 | //경고창 비활성화 후 |
188 | 187 | io.after = function (b, v) { |
|
202 | 201 | $W.unbind(rs, io[rs]); |
203 | 202 | }; |
204 | 203 | //공통 경고 클릭 시 조치 |
205 | | - $C.delegate('button', 'click', function (e) { |
| 204 | + $C.delegate(btn, clk, function (e) { |
206 | 205 | var cleanup = function(){ |
207 | 206 | $C.parent().add($M).remove(); |
208 | 207 | },onclose = options.onclose || $.msgbox.onclose; |
|
218 | 217 | $W.trigger(rs); |
219 | 218 | //경고창 포커스 |
220 | 219 | if (p) $C.find('input:text').select(); |
221 | | - else $C.find('button:eq(0)').focus(); |
| 220 | + else $C.find(btn + ':eq(0)').focus(); |
222 | 221 | //onopen 이벤트 발생 |
223 | 222 | var onopen = options.onopen || $.msgbox.onopen; |
224 | 223 | if($.isFunction(onopen)) onopen.call($C[0], options); |
|
0 commit comments