๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Dev/JavaScript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ File input ๋™์  ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๊ธฐ(์ด๋ฒคํŠธ ์œ„์ž„)

by vellahw 2023. 4. 29.

 

 

 

์™„์„ฑ๋ณธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

 

 

์„œ๋ก  ๐Ÿ’ญ

์ „์— ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์—์„œ j์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์•ฝ๊ฐ„์˜ ์• ๋ฅผ ๋จน์—ˆ๋˜ ๋™์ ์œผ๋กœ input file ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ์ž‘์—…!

ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด input์ด ์ถ”๊ฐ€ ๋˜๊ณ  ์ถ”๊ฐ€๋œ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น input์ด ์‚ญ์ œ๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. 

input ํƒœ๊ทธ๋Š” ์ž˜ ๋Š˜์–ด๋‚˜๋Š”๋ฐ ์‚ญ์ œ๊ฐ€ ๋’ค์ฃฝ๋ฐ•์ฃฝ์œผ๋กœ ๋จ, ์‚ญ์ œ๋Š” ๋˜๋Š”๋ฐ ํŒŒ์ผ ์„ ํƒ์ด ์•ˆ ๋จ, ๊ฑ ์‚ญ์ œ๊ฐ€ ์•ˆ ๋จ ๋“ฑ ๋‹ค์–‘ํ–ˆ๋Š”๋ฐ ์–ด์จŒ๋Š” ํ•ด๋‚ด์—ˆ๋‹ค ใ…Ž 

 

 

 

 

JSP ์ผ๋ถ€

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<tr>
    <th class="header"><label for="file" >์ด๋ฏธ์ง€ ์ฒจ๋ถ€</label></th>
    <td class="contents">
        <div id = "main" style="margin-bottom: 11px;">๋ฉ”์ธ ์ด๋ฏธ์ง€
        <span>
            <input type="file" name="mainIamge" style="border: none; width: auto;">
        </span>
        </div>
        ์ƒ์„ธ ์ด๋ฏธ์ง€
        <span>
            <input type="file" id="file" name="file_0" style="border: none; width: auto;">
            <a href="#this" class="btn" id="addFileInput">ํŒŒ์ผ ์ถ”๊ฐ€</a>
        </span>
        <div id="fileDiv"></div>
    </td>
</tr>  
cs

 

๋ฉ”์ธ์ด๋ฏธ์ง€๋Š” ์ด๋ฏธ์ง€ ํ•œ ์žฅ๋งŒ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ธ์ด๋ฏธ์ง€์—๋งŒ ๊ธฐ๋Šฅ์„ ์ ์šฉํ–ˆ๋‹ค.

input ํƒœ๊ทธ์˜ name ๊ฐ’์œผ๋กœ ๊ฐ๊ฐ์˜ input์„ ๊ตฌ๋ถ„ํ•˜๋„๋ก ํ–ˆ๊ณ  ๋™์ ์œผ๋กœ input ํƒœ๊ทธ๊ฐ€ ์ถ”๊ฐ€๋  ๊ณณ์€ div ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๊ณต๊ฐ„์„ ์ƒ์„ฑํ•ด๋‘์—ˆ๋‹ค.

 

 

 

 

JavaScript

1. ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ

 

1
2
3
4
5
6
const addFileBtn = document.getElementById('addFileInput');
 
addFileBtn.addEventListener('click'function(e){
   fn_addFileInput();
});
cs

 

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
var count = 1;
 
//file input ์ถ”๊ฐ€
function fn_addFileInput() {
   let fileDiv = document.getElementById('fileDiv');
   let fileName = 'file_' + (count++);
 
   //์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” file input
   let newFileInput = document.createElement('input');
   newFileInput.type = 'file';
   newFileInput.id = 'file';
   newFileInput.name = fileName;
   newFileInput.style = 'border:none; width:auto; padding-left:79px;';
 
   //์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” file input ์‚ญ์ œ ๋ฒ„ํŠผ
   let newDeleteFileInputBtn = document.createElement('button');
   newDeleteFileInputBtn.type = 'button';
   newDeleteFileInputBtn.id = 'delete-file-input';
   newDeleteFileInputBtn.textContent = '์‚ญ์ œ';
   newDeleteFileInputBtn.dataset.fileName = fileName;
 
   let newFileInputWrapper = document.createElement('p');
   newFileInputWrapper.appendChild(newFileInput);
   newFileInputWrapper.appendChild(newDeleteFileInputBtn);
 
   //์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ
   fileDiv.appendChild(newFileInputWrapper);
}
cs

 

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด fn_addFileInput() ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

count๋ผ๋Š” ์ด๋ฆ„์˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ฐ๊ฐ์˜ input ํƒœ๊ทธ๋ฅผ ๊ตฌ๋ถ„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ file_1์„ ์‹œ์ž‘์œผ๋กœ file_2, file_3 ์ด๋Ÿฐ ์‹์œผ๋กœ name ์†์„ฑ์ด ๋ถ™๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.

input ํƒœ๊ทธ์™€ input์„ ์‚ญ์ œํ•˜๋Š” ๋ฒ„ํŠผ, ๊ทธ๋ฆฌ๊ณ  ์ด ๋‘˜์„ ํ•ฉ์ณ์ค„ p ํƒœ๊ทธ๋ฅผ createElement๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค๊ณ ,

appendChild ๋ฉ”์„œ๋“œ๋กœ input๊ณผ ์‚ญ์ œ ๋ฒ„ํŠผ์„ p ํƒœ๊ทธ ์•ˆ์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

p ํƒœ๊ทธ ์•ˆ์— ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋‹ด๊ฒผ์œผ๋‹ˆ div ์•ˆ์— appendChild๋กœ p ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

์ด๋ ‡๊ฒŒํ•˜๋ฉด ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์€ ์ •์ƒ ์ž‘๋™ํ•œ๋‹ค!

 

 

 

 

2. ์‚ญ์ œ ๋ฒ„ํŠผ ๊ตฌํ˜„

์‚ญ์ œ ๋ฒ„ํŠผ์€ fn_addFileInput() ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•œ ์ดํ›„ ์ƒ์„ฑ๋œ๋‹ค. ํŒŒ์ผ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์•ผ๋งŒ ์ƒ์„ฑ๋˜๋Š” ๋ฒ„ํŠผ์ด๋ž€ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ฒ˜์Œ์—”  fn_addFileInput() ํ•จ์ˆ˜ ์•ˆ์—๋‹ค ์ด๋ฒคํŠธ๋ฅผ ์ž‘์„ฑ ํ–ˆ์—ˆ๊ณ  ๋ฌด์กฐ๊ฑด '์‚ญ์ œ ๋ฒ„ํŠผ ์ž์ฒด'์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์ฃผ๋ ค๊ณ  ํ–ˆ๋‹ค. ๋‹น์—ฐํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค...

๊ทธ๋Ÿฌ๋‹ค ์ด๋ฒคํŠธ ์œ„์ž„ ๊ฐœ๋…์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ํ™œ์šฉํ•ด๋ณด์•˜๋‹ค.

 

 

1
2
3
4
5
6
7
8
9
document.getElementById('fileDiv').addEventListener('click' , function(e) {
   if(e.target.matches('[data-file-name]')) {
      fn_deleteFileInput(e.target);
   }
});
 
function fn_deleteFileInput(target) {
   target.parentElement.remove();
}
cs

 

file input๊ณผ ์‚ญ์ œ ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€ ๋  fileDiv ์ž์ฒด์— ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์คฌ๋‹ค.

e.target์€ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์š”์†Œ๋ฅผ ๋œปํ•˜๊ณ  matches() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด data-file-name ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋™์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ dataset์„ ๋„ฃ์–ด์ค€ ์ด์œ ์ด๋‹ค!

์กฐ๊ฑด๋ฌธ์„ ํ†ต๊ณผํ•˜๋ฉด input ํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•ด์ค„ fn_deleteFileInput() ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

 

fn_deleteFileInput() ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์š”์†Œ๋Š” ์‚ญ์ œ๋ฒ„ํŠผ์ด๋‹ค.

์‚ญ์ œ ๋  input ํƒœ๊ทธ๋Š” ์‚ญ์ œ ๋ฒ„ํŠผ์˜ ๋ถ€๋ชจ ์š”์†Œ์ด๋ฏ€๋กœ parentElement๋กœ ์‚ญ์ œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

 

 

 

daaaaammMmm

 

๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ•˜๋ฉฐ matches() ๋ฉ”์„œ๋“œ๋„ ์ฒ˜์Œ.. ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์ด๋ฒคํŠธ ์œ„์ž„์€ ์ „์— ์บก์ฒ˜๋ง/๋ฒ„๋ธ”๋ง ๊ด€๋ จ ์˜์ƒ์„ ๋ณด๋‹ค๊ฐ€ ์ ‘ํ•œ์ ์ด ์žˆ๋Š”๋ฐ ์จ๋จน์–ด๋ณด๋‹ค๋‹ˆ ๋ฟŒ๋“ฏํ•˜๋‹ค!

 

 

 

 

 


์ฐธ๊ณ 

 

๋Œ“๊ธ€