Contents
see List작성일 2016. 09. 07.
AngularJS 이벤트 전파 제어하기
AngularJS에서 이벤트 버블링, 캡처링을 이해하고 $event 객체로 전파를 제어하는 방법입니다. ng-click 중첩 시 발생하는 문제 해결법을 다룹니다.
1. 이벤트 전파 문제 상황
<!-- 문제: 버튼 클릭 시 부모 div의 click도 실행됨 -->
<div ng-click="parentClick()">
부모 영역
<button ng-click="buttonClick()">버튼</button>
</div>
2. $event.stopPropagation()
<!-- 이벤트 전파 중단 -->
<div ng-click="parentClick()">
부모 영역
<button ng-click="buttonClick(); $event.stopPropagation()">
버튼
</button>
</div>
<!-- 또는 컨트롤러에서 처리 -->
<button ng-click="buttonClick($event)">버튼</button>
// Controller
$scope.buttonClick = function($event) {
$event.stopPropagation();
// 버튼 로직
};
3. $event.preventDefault()
<!-- 기본 동작 방지 -->
<a href="/page" ng-click="handleClick($event)">링크</a>
$scope.handleClick = function($event) {
$event.preventDefault(); // 페이지 이동 방지
// 커스텀 로직
};
<!-- 폼 제출 방지 -->
<form ng-submit="submitForm($event)">
<button type="submit">제출</button>
</form>
$scope.submitForm = function($event) {
$event.preventDefault();
// AJAX 처리
};
4. 이벤트 객체 속성
$scope.handleEvent = function($event) {
console.log($event.target); // 이벤트 발생 요소
console.log($event.currentTarget); // 핸들러가 연결된 요소
console.log($event.type); // 이벤트 타입 (click 등)
console.log($event.pageX); // 마우스 X 좌표
console.log($event.pageY); // 마우스 Y 좌표
console.log($event.keyCode); // 키보드 키 코드
};
5. 실전 예시: 테이블 행 클릭
<!-- 행 클릭 시 상세보기, 버튼은 삭제 -->
<tr ng-repeat="item in items" ng-click="viewDetail(item)">
<td>{{item.name}}</td>
<td>{{item.price | number}}</td>
<td>
<button ng-click="deleteItem(item, $event)">삭제</button>
</td>
</tr>
$scope.deleteItem = function(item, $event) {
$event.stopPropagation(); // 행 클릭 방지
// 삭제 로직
};
6. 드롭다운 메뉴
<!-- 메뉴 외부 클릭 시 닫기 -->
<div ng-click="closeMenu()">
<div class="dropdown" ng-click="$event.stopPropagation()">
<button ng-click="toggleMenu()">메뉴</button>
<ul ng-show="menuOpen">
<li ng-click="selectItem(1)">항목 1</li>
<li ng-click="selectItem(2)">항목 2</li>
</ul>
</div>
</div>
7. 이벤트 위임 패턴
<!-- 부모에서 이벤트 처리 -->
<ul ng-click="handleListClick($event)">
<li ng-repeat="item in items" data-id="{{item.id}}">
{{item.name}}
</li>
</ul>
$scope.handleListClick = function($event) {
var target = angular.element($event.target);
var id = target.attr("data-id");
if (id) {
// 해당 아이템 처리
}
};
stopPropagation vs preventDefault
| 메서드 | 역할 | 예시 |
|---|---|---|
| stopPropagation | 버블링/캡처링 중단 | 부모 클릭 방지 |
| preventDefault | 기본 동작 방지 | 링크 이동 방지 |
| 둘 다 사용 | 전파 + 기본 방지 | 폼 제출 커스텀 |
javascript
| No | 작성일 | Title |
|---|---|---|
| 3384 | 2026. 08. 21. | Node.js API에서 요청 취소를 제대로 처리하는 방법: AbortSignal로 외부 작업 정리하기 |
| 3352 | 2026. 08. 13. | Node.js 응답이 간헐적으로 느릴 때: 이벤트 루프 지연 측정과 CPU 작업 분리 방법 |
| 3320 | 2026. 08. 04. | JavaScript fetch 요청을 안전하게 만드는 방법: timeout·재시도·오류 처리 실전 패턴 |
| 3288 | 2026. 07. 27. | Node.js 서버 무중단 배포를 위한 Graceful Shutdown 구현 가이드 |
| 3257 | 2026. 07. 19. | Node.js 대용량 파일 처리 가이드: 스트림과 backpressure로 메모리 사용량 제어하기 |
| 3232 | 2026. 07. 11. | Node.js 실무형 에러 처리: async/await에서 실패를 일관되게 분류하고 복구 속도 높이기 |
| 3174 | 2026. 07. 02. | Node.js 환경 변수 검증 가이드: process.env를 안전한 설정 객체로 바꾸기 |
| 3123 | 2026. 06. 24. | TypeScript 타입 좁히기 운영 가이드: unknown 입력을 안전한 도메인 객체로 바꾸기 |
| 3065 | 2026. 06. 16. | 브라우저 성능 병목 찾기: PerformanceObserver로 LCP·INP·긴 작업 로그 수집하기 |
| 2978 | 2026. 06. 08. | Node.js fetch 타임아웃과 재시도 설계: 외부 API 장애 전파 줄이기 |