1/** 2 * ì¬ì©ë°©ë² 3 * $(selector).modal(); ë¡ í¸ì¶ì selector í´ë¦ì modal í¸ì¶ 4 * $.fn.modal(); ë¡ íì¶ì modal ë°ë¡ í¸ì¶ 5 * defaults ìµì 주ì ì°¸ê³ 6 * 2ê° ì´ìì modalì ëìì ëì¸ ê²½ì° modalClassëª ì ë¤ë¥´ê² í¸ì¶ 7 */ 8(function($) { 9 let modalMask; 10 11 $.fn.modal = function(options) { 12 const defaults = { 13 title: '', // modal ì 목 14 message: '', // modal ë´ì© 15 type: 'confirm', // confirm : ì·¨ì/íì¸, info : íì¸ 16 cancelText: 'ì·¨ì', // ì·¨ìë²í¼ 기본 문구 17 confirmText: 'íì¸', // íì¸ë²í¼ 기본 문구 18 cancelColor: '#E6E6E6', // ì·¨ìë²í¼ 기본 ìì 19 confirmColor: '#00A979', // íì¸ë²í¼ 기본 ìì 20 cancelLink: '', // ì·¨ìë²í¼ ë§í¬ 21 confirmLink: '', // íì¸ë²í¼ ë§í¬ 22 onCancel: null, // ì·¨ìë²í¼ í¨ì ì ì 23 onConfirm: null, // íì¸ë²í¼ í¨ì ì ì 24 customData: null, // ì¬ì©ì ë°ì´í° 25 modalClass: 'modal-layer' // 기본 modal classëª 26 }; 27 28 // optionsì¼ë¡ ëì´ì¨ ê°ì ìì¼ë©´ defaults ê°ì¼ë¡ ì í 29 const settings = $.extend({}, defaults, options); 30 31 // modalMaskê° ìì ê²½ì°ìë§ ìì± (무íìì±ë°©ì§) 32 if (!modalMask) { 33 modalMask = document.createElement('div'); 34 modalMask.id = 'modalMask'; 35 document.body.appendChild(modalMask); 36 } 37 38 // modal div ìì± ë° classëª ì§ì 39 const modalElement = document.createElement('div'); 40 modalElement.classList.add(settings.modalClass); 41 42 let titleHtml = ''; // íì´í HTML ì´ê¸°í 43 let messageHtml = ''; // ë´ì© HTML ì´ê¸°í 44 let buttonHtml = ''; // ë²í¼ HTML ì´ê¸°í 45 46 // ì ëª©ì´ ëì´ìì¼ë©´ modalì ì¶ê° 47 if (settings.title) { 48 titleHtml = `<h3 class="title">${settings.title}</h3>`; 49 } 50 51 // ë´ì©ì´ ëì´ìì¼ë©´ modalì ì¶ê° 52 if (settings.message) { 53 messageHtml = `<p class="message">${settings.message}</p>`; 54 } 55 56 // modal typeì´ infoê° ìëë©´ ì·¨ìë²í¼ ì¶ê° (ìì ë° ë²í¼ ê¸ì ì¶ê°) 57 if (settings.type != "info") { 58 buttonHtml = `<button class="modal-cancel" style="background-color: ${settings.cancelColor}">${settings.cancelText}</button>`; 59 } 60 // modalì íì¸ë²í¼ ì¶ê° (ìì ë° ë²í¼ ê¸ì ì¶ê°) 61 buttonHtml += `<button class="modal-confirm" style="background-color: ${settings.confirmColor}">${settings.confirmText}</button>`; 62 63 // modal ìì± 64 modalElement.innerHTML = ` 65 <span class="modal-close"><img src="/img/common/icon_close.svg" alt="ë«ê¸°" /></span> 66 ${titleHtml} 67 ${messageHtml} 68 <div class="btnArea"> 69 ${buttonHtml} 70 </div> 71 `; 72 73 // modal typeì´ infoê° ìëë©´ ì·¨ì ë²í¼ì ì´ë²¤í¸ ì¶ê° 74 if (settings.type != "info") { 75 const cancelBtn = modalElement.querySelector('.modal-cancel'); 76 const closeBtn = modalElement.querySelector('.modal-close'); 77 78 // ì·¨ì ë§í¬ê° ìì¼ë©´ ì·¨ìë²í¼, X ë«ê¸° ë²í¼ì ë§í¬ ì¶ê° 79 if (settings.cancelLink) { 80 cancelBtn.addEventListener('click', () => { 81 window.location.href = settings.cancelLink; 82 }); 83 closeBtn.addEventListener('click', () => { 84 window.location.href = settings.cancelLink; 85 }); 86 // ì·¨ì ë²í¼, Xë²í¼ modal ë«ê¸° ì²ë¦¬ 87 } else { 88 cancelBtn.addEventListener('click', () => { 89 closeModal(); 90 // ë«ê¸° í¨ìê° ì ì ëì´ ìì¼ë©´ í¨ì ì²ë¦¬ 91 if (typeof settings.onCancel === 'function') { 92 settings.onCancel(settings.customData); 93 } 94 }); 95 closeBtn.addEventListener('click', () => { 96 closeModal(); 97 // ë«ê¸° í¨ìê° ì ì ëì´ ìì¼ë©´ í¨ì ì²ë¦¬ 98 if (typeof settings.onCancel === 'function') { 99 settings.onCancel(settings.customData); 100 } 101 }); 102 } 103 // modal typeì´ infië©´ X ë²í¼ì ê·¸ë¥ ë«ê¸° ì²ë¦¬ 104 } else { 105 const closeBtn = modalElement.querySelector('.modal-close'); 106 closeBtn.addEventListener('click', closeModal); 107 } 108 109 const confirmBtn = modalElement.querySelector('.modal-confirm'); 110 111 // íì¸ ë²í¼ì ë§í¬ê° ìì¼ë©´ ë§í¬ë¡ ë³´ë´ê¸° 112 if (settings.confirmLink) { 113 confirmBtn.addEventListener('click', () => { 114 window.location.href = settings.confirmLink; 115 }); 116 } else { 117 confirmBtn.addEventListener('click', () => { 118 // íì¸ í¨ìê° ì ì ëì´ ìì¼ë©´ í¨ì ì²ë¦¬ 119 if (typeof settings.onConfirm === 'function') { 120 settings.onConfirm(settings.customData); 121 } 122 // íì¸ ë²í¼ modal ë«ê¸°ì²ë¦¬ 123 closeModal(); 124 }); 125 } 126 127 // modal ë«ë í¨ì 128 function closeModal() { 129 $(modalMask).hide(); 130 $(modalElement).hide(); 131 $('.'+settings.modalClass).remove(); 132 /*$(modalMask).fadeOut(); 133 $(modalElement).fadeOut().delay(500).queue(function (){ 134 $('.'+settings.modalClass).remove(); 135 });*/ // jQuery를 ì¬ì©íì¬ fadeOut ì ëë©ì´ì ì ì© 136 } 137 138 // modalì ì´ê¸° ì ì ìí를 íì¸íì¬ ì¤ë³µ ì´ë¦¼ ë°©ì§ 139 function openModal() { 140 if (!$('.'+settings.modalClass).length) { 141 /*$(modalElement).fadeIn(); 142 $(modalMask).fadeIn();*/ 143 $(modalElement).show(); 144 $(modalMask).show(); 145 document.body.appendChild(modalElement); 146 } 147 } 148 149 // modal í¸ì¶ì ì ìë ì íì í´ë¦íì¬ ëª¨ë¬ì í¸ì¶ 150 if (this.selector) { 151 this.on('click', function() { 152 openModal() 153 }); 154 // ì íì ìì¼ë©´ í¨ì í¸ì¶ë¡ 모ë¬ì í¸ì¶ 155 } else { 156 openModal() 157 } 158 159 return this; 160 }; 161})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.