버튼 입력 시 처리 방법
주어진 button 태그 예시
아래와 같이 버튼하나가 있다고 가정한다.
<button class="btn btn-icon btn-trash" th:data-id="${friend.id}">
<i class="fas fa-trash"></i>
</button>document.querySelectorAll을 사용
querySelectAll을 사용해서 해당 태그들을 저장해서 클릭이 되었을 때 특정 함수를 호출한다.
document.querySelectorAll('.btn-trash').forEach(function(btn) {
btn.addEventListener('click', function() {
console.log('휴지통 버튼이 클릭되었습니다!' + btn.dataset.id);
});
});작동원리
document.querySelectorAll('.btn-trash')는 현재 DOM에서.btn-trash클래스를 가진 모든 요소를 한 번에 찾아서 정적(Static) NodeList로 반환한다.- 이 NodeList는 배열처럼 반복이 가능한 객체이지만, 실시간으로 DOM 변화를 반영하지는 않습니다. 즉, 이 시점에 존재하는
.btn-trash요소들의 참조만을 가지고 있다. forEach를 통해 각 버튼에 이벤트 리스너(addEventListener)로 등록함으로써 메모리로 저장한다.
button에서 onclick() 사용
button 태그에서 onclick() 함수를 사용해서 javascript에서 코드를 호출한다.
th:onclick 사용
<button class="btn btn-icon btn-trash"
th:onclick="|deleteFriend('${friend.id}')|"
th:data-id="${friend.id}">
<i class="fas fa-trash"></i>
</button>th:attr 사용
<button class="btn btn-icon btn-trash"
th:attr="onclick=|deleteFriend('${friend.id}')|"
th:data-id="${friend.id}">
<i class="fas fa-trash"></i>
</button>javascript 파일
위에서 호출할 함수를 script 태그 안에 기록을 한다.
function deleteFriend(friendId) {
console.log('삭제할 친구 id:', friendId);
}button을 눌렀을 때 post 요청
form을 사용한 요청
<form th:action="@{/friend/v1/banned}" method="post" style="display:inline;">
<input type="hidden" name="requestId" th:value="${friend.id}" />
<button type="submit" class="btn btn-icon btn-trash">
<i class="fas fa-trash"></i>
</button>
</form>
javascript를 사용해서 요청
async function deleteFriend(friendId) {
const url = '/friend/v1/banned';
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ friendId: friendId }) // 키 이름 일치
});
if (!response.ok) throw new Error('서버 오류');
alert('차단 성공!');
window.location.reload(); // 페이지 새로고침
} catch (error) {
console.error(error);
alert('차단 실패: ' + error.message);
}
}