자 바스 크 립 트 의 거품 과 포획 을 생생 하고 상세 하 게 설명 하 며 가방 회 를 이해 합 니 다.
10541 단어 JavaScript
quirksmode 의 일련의 문장 은 모두 괜 찮 고 통속 적 이 며 이해 하기 쉽다.이 문장 은 단지 일련의 한 편 일 뿐 이 며,기회 가 있 으 면 자 바스 크 립 트 라 는 시 리 즈 를 모두 에 게 번역 할 수 있다.
원문 주 소 는 여기http://www.quirksmode.org/js/events_order.html이 고 문장 에'(?)'라 고 표시 되 어 있 습 니 다.이 문장 에 대해 잘 이해 하지 못 하고 틀 릴 수 있 음 을 나타 낸다.본 격 시작:
사건 발생 순서
이 문제 의 기원 은 매우 간단 하 다.만약 네가 한 원소 에 또 다른 원 소 를 끼 워 넣 었 다 고 가정한다 면
-----------------------------------
| element1 |
| ------------------------- |
| |element2 | |
| ------------------------- |
| |
-----------------------------------
:그리고 둘 다 onClick 이벤트 처리 함수(event handler)가 있 습 니 다.사용자 가 요소 2 를 누 르 면 요소 1 과 요소 2 의 클릭 이벤트 가 실 행 됩 니 다.그런데 어떤 사건 이 먼저 촉발 되 었 습 니까?어떤 이벤트 처리 함수 가 먼저 실 행 됩 니까?사건 의 발생 순 서 는 어떻게 되 는 것 일 까?
두 가지 모형
예상대로'돌 이 킬 수 없 는'(브 라 우 저 대전)의 날 에 넷 스 케 이 프 와 마이크로소프트 는 두 가지 다른 처리 방법 이 있 었 다.
이 두 사건 의 순 서 는 완전히 상반 된다.Explorer 브 라 우 저 는 거품 이벤트 만 지원 합 니 다.Mozilla,Opera 7,Konqueror 둘 다 지원 합 니 다.더 오래된 opera 와 icab 는 둘 다 지원 하지 않 습 니 다.
포획 형 이벤트
포획 형 이 벤트 를 사용 할 때
| |
---------------| |-----------------
| element1 | | |
| -----------| |----------- |
| |element2 \ / | |
| ------------------------- |
| Event CAPTURING |
-----------------------------------
:요소 1 의 이벤트 처리 함수 가 먼저 트리거 되 고 요소 2 의 이벤트 처리 함수 가 마지막 에 트리거 됩 니 다.
거품 형 사건
거품 형 이 벤트 를 사용 할 때
/ \
---------------| |-----------------
| element1 | | |
| -----------| |----------- |
| |element2 | | | |
| ------------------------- |
| Event BUBBLING |
-----------------------------------
:원소 2 의 처리 함수 가 먼저 촉발 되 고 원소 1 이 그 다음 이다
W3C 모델
W3c 는 현명 하 게 이 싸움 에서 선택 한 방안 을 선택 했다.w3c 이벤트 모델에서 발생 하 는 모든 사건 은 포획 단계 에 들 어가 목표 요소 에 도달 할 때 까지 거품 단계 에 들어간다.
| | / \
-----------------| |--| |-----------------
| element1 | | | | |
| -------------| |--| |----------- |
| |element2 \ / | | | |
| -------------------------------- |
| W3C event model |
------------------------------------------
웹 개발 자 를 위해 포획 단계 인지 거품 단계 인지 귀속 이벤트 처리 함 수 를 선택 할 수 있 습 니 다.이것 은 addEventListener()방법 을 통 해 이 루어 진 것 입 니 다.만약 에 이 함수 의 마지막 인자 가 true 라면 포획 단계 에서 귀속 함수,반대로 false,거품 단계 에서 귀속 함 수 를 선택 할 수 있 습 니 다.
하면,만약,만약...
element1.addEventListener('click',doSomething2,true)
element2.addEventListener('click',doSomething,false)
사용자 가 요소 2 를 누 르 면 다음 에 발생 합 니 다:
(사건 은 여기 서 관광객 처럼 밖에서 안 으로 유람 하고 촉발 되 는 주요 요소 에 점점 가 까 워 진 다음 에 반대로 떠난다)
element1.addEventListener('click',doSomething2,false)
element2.addEventListener('click',doSomething,false)
현재 사용자 가 요소 2 를 클릭 하면 발생 합 니 다:
호환성 과 전통 모델
w3c dom(문서 대상 모델)을 지원 하 는 브 라 우 저 에서 전통 적 인 이벤트 바 인 딩 방법 은?
element1.onclick = doSomething2;
기본 값 은 거품 단계 에 귀속 되 어 있 는 것 으로 간 주 됩 니 다
거품 형 이벤트 사용
거품 형 사건 이나 포획 형 사건 을 의식 적 으로 사용 하 는 개발 자 는 드물다.그들 이 오늘 만 든 홈 페이지 에 서 는 하나의 사건 이 거품 으로 인해 여러 함수 에 의 해 처리 되 게 할 필요 가 없다.그러나 사용자 들 은 마 우 스 를 한 번 만 클릭 한 후에 여러 가지 상황(여러 함수 가 실행 되 고 거품 이 생 겨 서)이 발생 했 기 때문에 의 심 스 러 울 때 가 있다.대부분의 경우 당신 의 처리 함수 가 서로 독립 되 기 를 바 랍 니 다.사용자 가 특정한 요 소 를 클릭 하면 무슨 일이 발생 하 는 지,다른 요 소 를 클릭 하면 무슨 일이 발생 하 는 지,서로 독립 되 고 거품 연쇄 때 문 이 아 닙 니 다.
계속 일어나 고 있어 요.
우선 사건 포착 이나 거품 이 계속 발생 하고 있다 는 것 을 알 아야 한다.전체 페이지 문서 에 일반적인 onclick 처리 함 수 를 정의 하면
document.onclick = doSomething;
if (document.captureEvents) document.captureEvents(Event.CLICK);
// , ,
페이지 에서 모든 요소 의 클릭 이 벤트 를 누 르 면 최종 적 으로 페이지 의 최고 문서 층 으로 거품 이 발생 합 니 다.따라서 일반적인 처리 함 수 를 촉발 합 니 다.이전 처리 함수 가 거품 을 중지 하 라 고 명확 하 게 지적 하지 않 아야 거품 이 전체 문서 차원 으로 전파 되 지 않 습 니 다.
용법(이 소절 은 번역 이 좋 지 않 습 니 다.실전 이 없 기 때문에 저도 잘 이해 하지 못 합 니 다.댓 글 에 보충 할 수 있 습 니 다.업데이트 하 겠 습 니 다)
모든 이벤트 전 파 는 페이지 문서(이 최고 층)에서 종료 되 기 때문에 기본 이벤트 처리 함수 가 가능 합 니 다.이러한 페이지 가 있다 고 가정 합 니 다.
------------------------------------
| document |
| --------------- ------------ |
| | element1 | | element2 | |
| --------------- ------------ |
| |
------------------------------------
element1.onclick = doSomething;
element2.onclick = doSomething;
document.onclick = defaultFunction;
현재 사용자 가 요소 1 이나 요소 2 를 누 르 면 doSomething()이 실 행 됩 니 다.만약 당신 이 원한 다 면,만약 당신 이 사건 을 default Function()을 실행 할 때 까지 거품 을 일 으 키 고 싶 지 않다 면,당신 은 여기에서 사건 의 거품 이 위로 퍼 지 는 것 을 막 을 수 있 습 니 다.그러나 사용자 가 페이지 의 다른 부 위 를 클릭 하면 defaultFunction()이 실 행 됩 니 다.이런 효 과 는 때때로 쓸 수 있 을 지도 모른다.
페이지 설정——처리 함 수 를 범위 가 넓 은 트리거 면적 으로'드래그 효과'스 크 립 트 에 필요 합 니 다.일반적으로 특정한 요소 층 에서 mousedown 사건 이 발생 한 것 은 이 요 소 를 선택 하고 mousemove 사건 에 응답 할 수 있 도록 하 는 것 을 의미한다.mousedown 은 브 라 우 저 bug 를 피하 기 위해 이 요소 층 에 연결 되 어 있 지만 다른 두 가지 이벤트 함수 의 범 위 는 전체 페이지(?)여야 합 니 다.
브 라 우 저 학 의 첫 번 째 법칙(First Law of Browserology)을 기억 하 세 요.모든 것 이 가능 합 니 다(anything can happen).그리고 최소한 준비 가 되 어 있 을 때 입 니 다.그래서 발생 할 수 있 는 것 은 사용자 가 끌 어 당 길 때 페이지 에서 마 우 스 를 대폭 이동 하지만 스 크 립 트 는 큰 폭 에서 반응 하지 못 해 마우스 도 요소 층 에 머 물 지 않 는 다 는 것 이다.
그래서 이 예 에서 사건 의 거품 은 매우 유용 합 니 다.왜냐하면 당신 의 처리 함 수 를 페이지 층 에 두 면 그들 이 계속 실 행 될 수 있 기 때 문 입 니 다.
꺼 버 렸 어.
그러나 일반적인 상황 에서 함수 간 에 상대방 을 방해 하지 않도록 모든 거품 과 포획 을 끄 고 싶 을 것 이다.그 밖 에 문서 구조 가 상당히 복잡 하 다 면 시스템 자원 을 절약 하기 위해 거품 을 닫 을 것 입 니 다.이 때 브 라 우 저 는 대상 요소 의 모든 조상 을 검사 하여 처리 함수 가 있 는 지 확인 해 야 합 니 다.하나 도 찾 지 못 하 더 라 도 방금 검색 하 는 데 도 많은 시간 이 걸 렸 다.
마이크로소프트 모델 에서 이벤트 의 cancelBubble 속성 을 true 로 설정 해 야 합 니 다.
window.event.cancelBubble = true
w3c 모델 에서 이벤트 의 stopPropagation()방법 을 호출 해 야 합 니 다.
e.stopPropagation()
이것 은 모든 거품 이 밖으로 전파 되 는 것 을 막 을 것 이다.크로스 브 라 우 저 솔 루 션 으로서 이렇게 해 야 합 니 다.
function doSomething(e)
{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
}
cancelBubble 속성 을 지원 하 는 브 라 우 저 에 cancelBubble 을 설정 하면 우아 함 을 해치 지 않 습 니 다.브 라 우 저 는 어깨 를 으쓱 하고 이 속성 을 만 듭 니 다.물론 거품 을 진정 으로 없 앨 수 는 없 지만,적어도 이 명령 이 안전 하고 정확 하 다 는 것 은 보장 할 수 있다.
currentTarget
앞에서 보 았 듯 이 하나의 사건 은 target 이나 srcElement 속성 으로 사건 이 어떤 목표 요소 에서 발생 했 는 지 나타 낸다(즉,사용자 가 최초 로 클릭 한 요소).우리 의 예 에서 요소 2 는 우리 가 그것 을 눌 렀 기 때문이다.
매우 중요 한 것 은 포획 이나 거품 단계 의 목표 요 소 는 변 하지 않 고 원소 2 와 관련 이 있다 는 것 을 알 아야 한다.
하지만 우리 가 다음 함 수 를 연결 했다 고 가정 하면
element1.onclick = doSomething;
element2.onclick = doSomething;
사용자 가 요소 2 를 누 르 면 doSomething()은 두 번 실 행 됩 니 다.그런데 어떤 html 요소 가 이 사건 에 응답 하고 있 는 지 어떻게 압 니까?target/srcElement 도 단 서 를 제시 하지 않 았 지만 사람들 은 항상 요소 2 를 선 호한 다.왜냐하면 이것 은 사건 을 일 으 키 는 원인 이기 때문이다.(사용자 가 클릭 한 것 은 그것 이기 때문이다.)
이 문 제 를 해결 하기 위해 w3c 는 currentTarget 이라는 속성 을 추 가 했 습 니 다.이 속성 은 사건 을 처리 하고 있 는 요 소 를 가리 키 고 있 습 니 다.이것 은 바로 우리 가 필요 로 하 는 것 입 니 다.불행 하 게 도 마이크로소프트 모델 에는 비슷 한 속성 이 없다.
너 도'this'키 워드 를 사용 할 수 있다.위의 예 에서 이 벤트 를 처리 하고 있 는 html 요소 에 해당 합 니 다.마치 currentTarget 과 같 습 니 다.
질문
그러나 마이크로소프트 이벤트 바 인 딩 모델 을 사용 할 때 this 키 워드 는 HTML 요소 에 해당 하지 않 습 니 다.currentTarget 속성 과 유사 한 마이크로소프트 모델(?)이 부족 한 것 을 연상 합 니 다.위의 코드 로 조작 하면 당신 이 이렇게 하 는 것 은:
element1.attachEvent('onclick',doSomething)
element2.attachEvent('onclick',doSomething)
어떤 HTML 요소 가 사건 을 처리 하고 있 는 지 정확히 알 수 없습니다.이것 은 마이크로소프트 이벤트 바 인 딩 모델 의 가장 심각 한 문제 입 니 다.저 에 게 이것 도 제 가 사용 하지 않 는 이유 입 니 다.Windows 에서 만 제공 되 는 IE 응용 프로그램 을 개발 하 더 라 도.
currentTarget 과 유사 한 속성 을 빨리 늘 리 거나 기준 을 따 르 고 싶 습 니 다.웹 개발 자 들 은 이 정보 가 필요 합 니 다.
후기:
자바 script 을 실전 해 본 적 이 없 기 때문에 이 글 은 제 가 잘 이해 하지 못 하고 억지로 번역 할 수 밖 에 없습니다.예 를 들 어 끌 어 당 기 는 효과 에 대해 이야기 하 는 부분 입 니 다.만약 에 여러분 이 보충 과 의문 이 있 으 면 저 에 게 메 시 지 를 남 겨 주 셔 서 감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.