βοΈ What I Learned
[TIL] FormData, data-*
Jiwon()
2024. 1. 15. 23:51
π‘ μ¬μ©ν ν°νΈλ λ₯κ·Όλͺ¨κΌ΄μ΄λ©°, μ 체μ μΈ λμμΈ μ»¨μ μ λμμ΄λ κΈΈνμ§λ λΈλ‘κ·Έμ λ₯κ·Όλͺ¨κΌ΄ μκ° κ²μκΈμμ λ°μλ€. ν΄λΉ κ²μκΈμ λ₯κ·Όλͺ¨κΌ΄ ν°νΈλ₯Ό Fixedsys ν°νΈμ κ²°ν©νκ³ λ€λ¬μ΄μ νΌλΈλ¦ λλ©μΈ λΌμ΄μΌμ€λ‘ λ°°ν¬ν νμ΄μ§μ΄λ€.
FormData
- FormData λ λΈλΌμ°μ μ λ΄μ₯λ APIλ‘ HTML νΌ λ°μ΄ν°λ₯Ό μ½κ² μ²λ¦¬νκ³ μ μ‘ν μ μλ κ°μ²΄μ΄λ€.
- new ν€μλλ μλ°μ€ν¬λ¦½νΈ κ°μ²΄μ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μ¬μ©λλ€. μμ±μ ν¨μλ₯Ό νΈμΆν λ new ν€μλλ₯Ό μ¬μ©νλ©΄ ν΄λΉ ν¨μκ° μμ±μλ‘ λμνλ©° μλ‘μ΄ λΉ κ°μ²΄κ° λ°νλλ€. μ΄λ κ² μμ±ν FormData κ°μ²΄μ λ€μν λ©μλλ₯Ό νμ©νμ¬ νΌ λ°μ΄ν°μ λν μμ
λ€μ μ²λ¦¬ν μ μλ€.
- ex. νΌ λ°μ΄ν° μμ§, νμΌ μ λ‘λ, AJAX μμ² μ λ°μ΄ν° μ μ‘ λ±
<form>
<div class="form-control">
<label for="playername">νλ μ΄μ΄ μ΄λ¦</label>
<input type="text" name="playername" id="playername" autocomplete="off" />
</div>
<div>
<button type="button" class="btn btn-alt" id="cancel-config-btn">μ·¨μ</button>
<button type="submit" class="btn">νμΈ</button>
</div>
</form>
const formElement = document.querySelector('form');
formElement.addEventListener('submit', savePlayerConfig);
// formμ submitν λμ μ½λ°±ν¨μ
function savePlayerConfig(e) {
e.preventDefault();
const formData = new FormData(e.target);
const enteredPlayername = formData.get('playername').trim();
console.log(enteredPlayername);
}
- λ°μν μ΄λ²€νΈ κ°μ²΄μ λ€μ΄μλ target μμ±μ FormDataμ κ°μΌλ‘ μ λ¬ν μ μλ€.
- νΌμ μ λ¬νλ©΄ μλ°μ€ν¬λ¦½νΈκ° μ΄ νΌμ λΆμν΄μ name μμ±μ΄ νΌ λ΄μ μμλ₯Ό νμνλ€. name μμ±μ μμ±κ°μ μ¬μ©νμ¬ FormDataμ λ°μ΄ν°λ₯Ό μλ³ν μ μλ€.
id μμ±κ³Ό name μμ±
id μμ±
- HTML λ¬Έμ λ΄μμ κ° μμλ€μ λν κ³ μ ν μλ³μμ΄λ€. λμΌν λ¬Έμ λ΄μμ idλ μ€λ³΅λ μ μλ€.
- μ£Όλ‘ css μ€νμΌλ§μ΄λ μλ°μ€ν¬λ¦½νΈμ νΉμ μμλ₯Ό μ ννκ³ μ‘°μν λ μ¬μ©λλ€.
<div id="uniqueId">This is a unique element.</div>
name μμ±
- νΉν νΌ μμμμ μλ²λ‘ λ°μ΄ν°λ₯Ό μ μ‘ν λ μ¬μ©λλ©°, μλ²μμλ μ΄ name μμ±κ°μ ν΅ν΄ ν΄λΉ λ°μ΄ν°λ₯Ό μλ³νλ€.
- νΌ μμμλ μ€λ³΅λ μ μλ€. νλμ νΌ μμμ μ¬λ¬ μμκ° λμΌν nameμ κ°κ³ μμ μ μλ€.
- νΌ λ°μ΄ν°λ₯Ό μλ²μ μ μ‘ν λ, νΉν λΌλμ€ λ²νΌμ΄λ 체ν¬λ°μ€ λ± κ·Έλ£ΉμΌλ‘ λ¬ΆμΈ μμμμ μ¬μ©λλ€.
<input type="text" name="username">
<input type="radio" name="gender" value="male"> Male
<input type="radio" name="gender" value="female"> Female
submit λ°μ΄ν° μ μ₯ λ° λ°μ: data-*
- data-* μ μ νΉμ±μ μ¬μ©μ μ§μ λ°μ΄ν° νΉμ±(custom data attributes)μ΄λΌλ νΉμ± ν΄λμ€λ₯Ό νμ±ν¨μΌλ‘μ¨ μμμ λ°μ΄ν°λ₯Ό μ€ν¬λ¦½νΈλ‘ HTMLκ³Ό DOM μ¬μ΄μμ κ΅νν μ μλ λ°©λ²μ΄λ€.
- data-* λ‘ μ€μ ν΄ μ€ λ°μ΄ν°λ dataset μμ±μΌλ‘ μ¬μ©ν μ μλ€.
<button id="edit-player-1-btn" data-playerid="1">
νλ μ΄μ΄ 1μ μμ λ²νΌ
</button>
<button id="edit-player-2-btn" data-playerid="2">
νλ μ΄μ΄ 2μ μμ λ²νΌ
</button>
// νλ μ΄μ΄ 1μ μμ λ²νΌ
const editPlayer1BtnElement = document.getElementById('edit-player-1-btn');
// νλ μ΄μ΄ 2μ μμ λ²νΌ
const editPlayer2BtnElement = document.getElementById('edit-player-2-btn');
editPlayer1BtnElement.addEventListener('click', openPlayerConfig);
editPlayer2BtnElement.addEventListener('click', openPlayerConfig);
let editedPlayer = 0;
const players = [
{
name: '',
symbol: 'X',
},
{
name: '',
symbol: 'O',
},
];
function openPlayerConfig(e) {
editedPlayer = e.target.dataset.playerid; // dataset μ¬μ©
playerConfigOverlayElement.style.display = 'block';
backdropElement.style.display = 'block';
};
function savePlayerConfig(e) {
e.preventDefault();
const formData = new FormData(e.target);
const enteredPlayername = formData.get('playername').trim(); // ' ' => ''
if (!enteredPlayername) { // enteredPlayername === ''
e.target.firstElementChild.classList.add('error');
errorsOutputElement.textContent = 'μ΄λ¦μ μ
λ ₯ν΄μ£ΌμΈμ!';
return; // return λ°ν μ μλμ μ½λκ° μ€νλμ§ μκ³ μ¬κΈ°μ ν¨μμ μ€νμ΄ μ€λ¨λ¨
}
const updatedPlayerDataElement = document.getElementById(`player-${editedPlayer}-data`)
updatedPlayerDataElement.children[1].textContent = enteredPlayername;
players[editedPlayer - 1].name = enteredPlayername;
closePlayerConfig();
}
- html νμΌμμ κ° λ²νΌμ data-playerid κ°μ μ€μ ν λ€ μλ°μ€ν¬λ¦½νΈλ‘ λ²νΌμ μ΄λ²€νΈλ¦¬μ€λ μ½λ°±ν¨μμμ e.target.datasetμΌλ‘ playerid κ°μ νμΈν μ μλ€.
- e.target.dataset.playerid λλ e.target.dataset['playerid']λ‘ valueλ§ κΊΌλ΄μ μ¬μ©ν μλ μλ€.