안녕하세요! 이번 강의에서는 버블링과 이벤트 가로채기와 같은 중요한 개념에 대해 이야기하고자 합니다. 버블링은 자식 요소를 클릭하면 이벤트가 부모 요소로 전파되는 현상입니다.

큰 중첩 목록이나 테이블을 처리할 때 매우 유용할 수 있습니다. 각 요소에 이벤트 핸들러를 할당하지 않기 위해 각 요소당 하나의 핸들러를 할당할 수 있습니다. 부모 요소, 이벤트는 이미 상위 요소의 모든 중첩 요소에 전파됩니다. 예를 들어 보겠습니다.

이 핸들러는

중첩 태그를 클릭하면 작동합니다. 또는 :

EM을 클릭하면 DIV의 핸들러가 작동합니다.

보시다시피 중첩된 em 요소를 클릭하면 div의 핸들러가 트리거됩니다. 왜 이런 일이 발생합니까? 계속 읽고 알아보십시오.

오르막

따라서 상승의 기본 원리는 다음과 같습니다.

모든 이벤트의 경우 요소에서 마우스를 클릭해도 상관 없습니다. 이벤트는 먼저 상위 요소에서 작동한 다음 체인을 따라 중첩된 모든 요소로 퍼집니다.

예를 들어, 각각에 이벤트 핸들러가 있는 3개의 중첩된 FORM > DIV > P 요소가 있다고 가정해 보겠습니다.

형태
DIV

버블링은 내부 요소가 클릭되도록 합니다.

클릭 핸들러(있는 경우)를 먼저 호출합니다.

이러한 과정을 버블링이라고 합니다. 마치 기포가 물에 떠 있는 것처럼 이벤트가 내부 요소에서 부모를 통해 "떠다니기" 때문에 버블링의 정의도 찾을 수 있습니다. 음, 그냥 영어 단어 bubbling에서 - 뜨다.

대상 요소 접근 event.target

이 이벤트 또는 그 이벤트를 포착한 요소를 찾기 위해 event.target 메소드가 있습니다. (이벤트 객체에 대해 읽어보세요).

  • 이벤트.타겟- 이것은 이벤트가 발생한 원래 요소 자체입니다.
  • 이것- 이것은 항상 버블링이 도달한 현재 요소이고 핸들러가 현재 이 요소에서 실행 중입니다.

예를 들어, form.onclick 핸들러가 하나만 설치되어 있다면 폼 내부의 모든 클릭을 "캐치"합니다. 동시에 내부를 클릭하는 곳마다 여전히 요소에 팝업됩니다.

, 핸들러가 작동합니다.

여기서:

  • 이것(=event.currentTarget)은 핸들러가 작업했기 때문에 항상 양식 자체가 됩니다.
  • 이벤트.타겟클릭이 발생한 가장 중첩된 요소인 양식 내부의 특정 요소에 대한 링크가 포함됩니다.

원칙적으로 폼을 클릭하고 폼에 더 이상 요소가 없으면 event.target과 동일할 수 있습니다.

상승 중단

일반적으로 이벤트 버블링은 맨 위로 바로 이동하여 루트 창 개체에 도달합니다.

그러나 일부 중간 요소에서 상승을 멈출 수 있습니다.

버블링을 중지하려면 event.stopPropagation() 메서드를 호출하세요.

버튼을 클릭할 때 body.onclick 핸들러가 작동하지 않는 예를 살펴보겠습니다.

요소에 동일한 이벤트에 대한 여러 핸들러가 있는 경우 버블링이 중지되더라도 모두 실행됩니다.

따라서 stopPropagation은 이벤트가 더 이상 전파되는 것을 방지하지만 모든 핸들러는 요소에서 작동하지만 다음 요소에서는 더 이상 작동하지 않습니다.

현재 요소에 대한 처리를 중지하기 위해 브라우저는 event.stopImmediatePropagation() 메서드를 지원합니다. 이 방법은 버블링을 방지할 뿐만 아니라 현재 요소에 대한 이벤트 처리도 중지합니다.

담금

표준에는 이벤트의 "출현" 외에도 "몰입"도 있습니다.

상승과 달리 다이빙은 수요가 적지만 이에 대해 아는 것이 여전히 유용할 것입니다.

따라서 이벤트 패스에는 3단계가 있습니다.

  1. 이벤트는 위에서 아래로 진행됩니다. 이 단계를 "차단 단계"라고 합니다.
  2. 이벤트가 특정 요소에 도달했습니다. 목표 단계입니다.
  3. 결국 이벤트가 팝업되기 시작합니다. 이것은 "플로팅 스테이지"입니다.

이것은 다음과 같이 표준에 표시됩니다.

따라서 TD를 클릭하면 이벤트가 부모 체인을 통해 처음에는 요소("싱크")로 이동한 다음 위쪽("플로트")으로 이동하여 그에 따라 핸들러를 활성화합니다.

위에서 나는 상승에 대해서만 썼습니다. 다른 단계 자체는 사용되지 않고 우리가 알아차리지 못하기 때문입니다.

핸들러는 가로채기 단계에 대해 아무것도 모르지만 버블링부터 작업을 시작합니다.

차단 단계에서 이벤트를 포착하려면 다음을 사용해야 합니다.

  • 인수가 true이면 이벤트가 아래로 가로막힐 것입니다.
  • 인수가 거짓이면 버블링 시 이벤트가 포착됩니다.

에 대한 예에서 ,

,

이전과 동일한 핸들러가 있지만 이번에는 몰입 단계입니다. 차단이 작동하는 것을 보려면 그 안에 있는 요소를 클릭하십시오.

핸들러는 FORM → DIV → P의 하향식 순서로 작동합니다.

JS 코드는 다음과 같습니다.

varelems = document.querySelectorAll("양식,div,p"); // 각 요소에서 가로채기 단계에서 핸들러를 걸 것입니다. for (var i = 0; i< elems.length; i++) { elems[i].addEventListener("click", highlightThis, true); }


다음과 같이 두 단계 모두에 핸들러를 할당하는 것을 귀찮게 하는 사람은 아무도 없습니다.

varelems = document.querySelectorAll("양식,div,p"); (변수 i = 0; 나는< elems.length; i++) { elems[i].addEventListener("click", highlightThis, true); elems[i].addEventListener("click", highlightThis, false); }

내부 요소를 클릭하십시오.

이벤트가 전달되는 순서를 보려면:
FORM → DIV → P → P → DIV → FORM이어야 합니다. 요소

두 단계 모두에 참여할 것입니다.

결과

  • 이벤트가 발생하면 이벤트가 발생한 요소가 event.target으로 표시됩니다.
  • 이벤트는 먼저 문서 루트에서 event.target으로 이동하여 addEventListener(…., true)를 통해 제공되는 핸들러를 호출합니다.
  • 이벤트는 addEventListener(…., false)를 통해 제공된 핸들러를 호출하는 방식을 따라 event.target에서 문서의 시작 부분까지 이동합니다.

각 핸들러는 이벤트 속성에 액세스할 수 있습니다.

  • event.target은 이벤트가 실제로 발생한 가장 깊은 요소입니다.
  • event.currentTarget(=this)은 이 순간자체 처리기가 작동했습니다(이벤트가 "도달"됨).
  • event.eventPhase - 이벤트 핸들러가 실행한 단계(dive = 1, float = 3).

버블링은 event.stopPropagation() 메서드를 호출하여 중지할 수 있지만 예기치 않은 목적으로 이벤트가 필요할 수 있으므로 권장하지 않습니다.

이제 이벤트 객체로 작업할 때 버블링 및 가로채기, 이벤트 위임과 같은 고급 기능을 살펴보겠습니다.

이벤트 버블링

여러 개의 중첩 블록이 있다고 상상해보십시오.

가장 안쪽 블록

가장 안쪽 블록을 클릭하면 이벤트가 클릭 시먼저 발생하고 해당 태그에 도달할 때까지 부모, 부모의 부모 등에서 발생합니다. 신체그리고 태그에 HTML(그러면 문서그리고 전에 창문).

내부 블록을 클릭하면 모든 외부 블록을 동시에 클릭하기 때문에 이것은 논리적입니다.

다음 예제에서 이를 살펴보겠습니다. 3개의 블록이 있으며 각 블록에는 onclick 이벤트가 첨부되어 있습니다.

가장 안쪽에 있는 빨간색 블록을 클릭하면 빨간색 블록의 onclick이 먼저 작동한 다음 파란색 블록, 녹색 블록이 어떻게 작동하는지 확인할 수 있습니다.

이 동작을 표면화이벤트 - 바닥에서 기포가 상승하는 것과 유사합니다. 거품과 마찬가지로 내부 요소를 클릭하면 상위 블록에서 트리거될 때마다 맨 위로 떠 있는 것처럼 보입니다.

이벤트.타겟

div와 이 div 내부에 있는 단락 p의 두 가지 요소가 있다고 가정해 보겠습니다. onlick을 디바에 묶자:

이 div를 클릭하면 단락으로 이동하거나 이 단락이 존재하지 않는 곳으로 이동할 수 있습니다.

이것이 어떻게 가능합니까? 다음 예를 보십시오. 녹색은 div이고 파란색은 단락입니다.

녹색 부분을 클릭하면 div를 클릭하고 파란색 부분을 클릭하면 단락에서 먼저 클릭이 발생한 다음 div에서 클릭이 발생합니다. 그러나 onclick은 div에 특별히 첨부되어 있기 때문에 일반적으로 단락의 존재를 인식하지 못할 수 있습니다.

그러나 때때로 클릭이 div 또는 하위 단락에서 직접 발생했는지 알고 싶습니다. Event 객체와 그 속성이 이를 도와줄 것입니다. 이벤트.타겟- 클릭이 발생한 요소를 정확히 저장합니다.

다음 예에서 우리는 div, 그 안에 거짓말 , 그리고 그 안에 - 기간.

onclick 이벤트를 최상위 요소(div)에 바인딩하고 다른 요소(div, p, span)를 클릭해 보겠습니다. 사용하여 이벤트.타겟이벤트가 발생한 맨 아래 요소를 가져오고 tagName을 사용하여 이름을 표시합니다.

예를 들어 범위를 클릭하면 이벤트가 div를 포착하지만(결국 onclick이 여기에 첨부됨) 이벤트.타겟정확히 거짓말을 할 것이다 기간:

다른 블록을 클릭하면 결과가 표시됩니다.

상승 중단

따라서 모든 이벤트가 맨 위에 표시된다는 것을 이미 알고 있습니다(최대 HTML 태그그런 다음 문서로 이동한 다음 창으로 이동). 때때로 이 상승을 멈출 필요가 있습니다. 이는 이벤트가 팝업되는 모든 요소에서 수행할 수 있습니다. 이렇게 하려면 요소 코드에서 메서드를 호출합니다. event.stopPropagation().

다음 예에서 빨간색 블록을 클릭하면 자체적으로 작동한 다음 파란색 블록에서 작동합니다. 파란색 블록은 더 이상 상승을 멈추고 녹색 블록은 어떤 식으로든 반응하지 않습니다.

빨간색 블록을 클릭하면 결과가 표시됩니다.

담금

이벤트의 버블링 외에도 잠수(과학에 따르면 차단 단계). 즉, 이벤트가 먼저 위에서 아래로 이동하고(차단 단계), 요소에 도달한 다음(목표 단계), 그 다음에야 떠다니기 시작합니다(버블링 단계).

차단 단계를 고려하여 이벤트 핸들러를 중단할 수 있습니다. 추가 이벤트 리스너. 이를 위해 세 번째 매개변수가 있습니다. true이면 차단 단계에서 이벤트가 발생하고, false이면 버블링 단계에서 발생합니다(기본값).

Vargreen = document.getElementById("녹색"); green.addEventListener("클릭", func, true); 기능(이벤트) ( )

속성을 사용하여 이벤트가 발생한 단계를 확인할 수 있습니다. 이벤트.eventPhase. 1 - 차단 단계, 2 - 목표 단계, 3 - 상승 단계의 값을 사용할 수 있습니다.

위임 소개

상황을 상상해보십시오. 여러 . 다음 이벤트가 각 li에 첨부됩니다. li를 클릭하면 끝에 "!"가 추가됩니다.

위의 사항을 구현해 봅시다.

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5
var li = document.querySelectorAll("#ul li"); // 루프에서 우리는 각 li에 addSign 함수를 걸고: for (var i = 0; i

li를 클릭하면 끝에 "!"가 추가되는 것을 볼 수 있습니다.

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5

이제 ul 끝에 새 버튼이 추가되는 버튼도 있습니다. "항목"이라는 텍스트와 함께. 우리는 깜짝 놀랐습니다: 첨부된 이벤트가 작동하지 않습니다 새로운리! 다음을 확인합시다.

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5

버튼을 클릭하여 li를 추가한 다음 이 새 li에서 - 반응하지 않습니다.

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5
리 추가

문제를 해결하려면 새 li를 만들 때 함수를 걸어두십시오. 추가 서명 addEventListener를 통해. 이것을 구현해보자:

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5
var li = document.querySelectorAll("#ul li"); (변수 i = 0; 나는

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5
리 추가

문제를 해결하는 두 번째 방법인 이벤트 위임이 있습니다. 분석해 보겠습니다.

이벤트 위임

위임의 본질은 다음과 같습니다. 우리는 각 리가 아니라 부모에게 이벤트를 걸 것입니다. .

동시에 스크립트의 성능이 유지되어야 합니다. 이전과 같이 li를 클릭하면 스크립트 끝에 "!"가 추가됩니다. 새 버전의 이벤트만 ul:

var ul = document.getElementById("ul"); //ul 이벤트 중단: ul.addEventListener("click", addSign); 함수 addSign() ( )

어떻게 할까요? 이벤트가 ul에 걸려 있기 때문에 함수 내에서 li를 잡을 수 있습니다. 이벤트.타겟. event.target이 무엇인지 상기시켜 드리겠습니다. 이것은 정확히 클릭이 발생한 태그입니다. 우리의 경우에는 다음과 같습니다. .

위임을 통한 문제의 해결책은 다음과 같습니다.

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5

코드 실행 결과:

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5

이 경우 솔루션이 자동으로 작동합니다. 새로운 리에게도, 이벤트가 li가 아니라 ul에 매달려 있기 때문에:

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5
var ul = document.getElementById("ul"); ul.addEventListener("클릭", addSign); function addSign() ( event.target.innerHTML = event.target.innerHTML + "!"; ) //새 li를 추가하기 위한 버튼 구현: var button = document.getElementById("button"); button.addEventListener("클릭", addLi); 함수 addLi() ( var li = document.createElement("li"); li.innerHTML = "new li"; ul.appendChild(li); )

버튼을 클릭하여 li를 추가한 다음 이 새 li에 대해 다음과 같이 반응합니다.

  • 단락 1
  • 포인트 2
  • 포인트 3
  • 포인트 4
  • 포인트 5
리 추가

우리의 코드는 작동하지만 결함이 없는 것은 아닙니다. 이러한 단점을 분석하고 보다 보편적인 솔루션을 작성해 보겠습니다.

일반 이벤트 위임

코드의 단점은 li 내부에 일부 중첩 태그가 있을 때 나타납니다. 우리의 경우에는 태그를 지정합니다. :

이 경우 를 누르면 에 느낌표가 추가됩니다. i 태그의 끝, 태그가 아님 , 우리가 원하는 대로(기울임꼴 외부의 li를 클릭하면 모든 것이 정상입니다):

  • 기울임꼴 1
  • 기울임꼴 2
  • 기울임꼴 3
  • 기울임꼴 4
  • 기울임꼴 5
var ul = document.getElementById("ul"); ul.addEventListener("클릭", addSign); 함수 addSign() ( event.target.innerHTML = event.target.innerHTML + "!"; )

기울임꼴을 클릭하면 "!" 끝에 추가됩니다(기울임꼴 외부를 누르면 잘 작동함).

문제는 다음과 같이 수정됩니다(설명된 방법이 유일한 방법은 아니지만 가장 간단함). 가장 가까운 방법을 사용하여 다음과 같이 event.target의 부모인 가장 가까운 li를 찾습니다. event.target.closest("리").

작동 방식: 클릭이 켜져 있는 경우 , 다음에서 이벤트.타겟이것은 내가 거짓말을 하고 event.target.closest("리")- 이벤트가 발생해야 하는 우리의 리.

클릭이 , 다음에서 이벤트.타겟, 그리고 event.target.closest("리")우리의 리는 거짓말을 할 것입니다.

점검 해보자:

  • 기울임꼴 1
  • 기울임꼴 2
  • 기울임꼴 3
  • 기울임꼴 4
  • 기울임꼴 5
var ul = document.getElementById("ul"); ul.addEventListener("click", function(event) ( var li = event.target.closest("li"); if (li) ( //부모 li가 전혀 없는지 확인 li.innerHTML = li.innerHTML + "!"; ) )));

코드 실행 결과:

중첩이 아무리 깊어도: 태그 태그에있을 수 있습니다 , 그리고 태그에 있는 기간그리고 나서야 - 그것은 중요하지 않습니다 : 건설 event.target.closest("리")모든 중첩 수준에서 부모를 찾습니다.

이벤트가 발생하면 핸들러가 먼저 중첩된 요소 자체에서 실행된 다음 상위 요소에서 실행된 다음 중첩 체인 위쪽에서 실행됩니다.

예를 들어, 각각에 핸들러가 있는 3개의 중첩 요소 FORM > DIV > P가 있습니다.

코드: 형태

DIV

버블링은 내부의 클릭을 보장합니다.

onclick 핸들러(있는 경우)를 먼저 호출합니다.

따라서 위의 예에서 P를 클릭하면 경고가 순차적으로 표시됩니다. p → div → form.

이 과정을 버블링이라고 합니다. 마치 공기 방울이 물에 뜨는 것처럼 이벤트가 내부 요소에서 부모를 통해 위로 버블링되기 때문입니다.

이벤트.타겟

이벤트를 포착하는 요소가 무엇이든 항상 정확히 어디에서 이벤트가 발생했는지 알 수 있습니다.
이벤트를 발생시키는 가장 깊은 요소를 "target" 또는 "source" 요소라고 하며 event.target으로 사용할 수 있습니다.

이것과의 차이점(=event.currentTarget):

  • event.target은 이벤트가 발생한 소스 요소이며, 버블링 프로세스 동안 변경되지 않습니다.
  • 이것은 버블링이 도달한 현재 요소이며 핸들러가 현재 이 요소에서 실행 중입니다.

예를 들어 form.onclick 핸들러가 하나만 있는 경우 양식 내부의 모든 클릭을 "캐치"합니다. 내부 클릭이 있는 곳마다 - 요소에 팝업됩니다.

핸들러가 실행될 위치입니다.

여기서:

  • this(=event.currentTarget)는 핸들러가 실행되기 때문에 항상 양식 자체가 됩니다.
  • event.target은 클릭된 가장 중첩된 요소인 양식 내부의 특정 요소에 대한 링크를 포함합니다.

event.target과 이것이 동일한 요소일 수도 있습니다. 예를 들어 양식에 다른 태그가 없고 요소 자체를 클릭한 경우 .

이벤트 버블링 중지

오르막은 직진합니다. 일반적으로 이벤트는 요소가 나타날 때까지 버블링됩니다. , 그리고 document , 때로는 window 까지, 경로에 있는 모든 핸들러를 호출합니다.

그러나 모든 미들웨어는 이벤트가 완전히 처리되었다고 판단하고 버블링을 중지할 수 있습니다.

버블링을 멈추려면 메서드를 호출해야 합니다. event.stopPropagation().

예를 들어 여기에서 버튼을 클릭하면 핸들러가 body.onclick작동하지 않습니다:

코드:

이벤트 가로채기. event.stopImmediatePropagation()

요소에 하나의 이벤트에 대해 여러 핸들러가 있는 경우 버블링이 중지되더라도 모두 실행됩니다.

그건, 전파 중지이벤트가 더 이상 진행되는 것을 방지하지만 현재 요소에서 모든 핸들러가 작동합니다.

처리를 완전히 중지하려면 최신 브라우저지원 방법 event.stopImmediatePropagation(). 버블링을 방지할 뿐만 아니라 현재 요소에 대한 이벤트 처리를 중지합니다.

IE8 차이점

탐색을 더 쉽게 하기 위해 버블링과 관련된 IE8의 차이점을 한 섹션으로 모았습니다.

프레임워크 없이 순수 JS로 작성하기로 결정하고 IE8 지원이 필요한 경우 이들의 지식이 필요합니다.

event.currentTarget 속성이 없습니다.

on 속성을 통해 핸들러를 할당할 때 this 가 있으므로 event.currentTarget 은 일반적으로 필요하지 않지만 attachEvent 를 통해 할당되면 핸들러가 this 를 받지 않으므로 필요한 경우 현재 요소만 가져올 수 있습니다. 폐쇄.

Event.srcElement는 IE8에서 event.target 대신 사용됩니다.

IE8과 최신 브라우저를 모두 지원하는 핸들러를 작성하는 경우 다음과 같이 시작할 수 있습니다.

코드: elem.onclick = function(event) (
이벤트 = 이벤트 || 창.이벤트;
var 대상 = 이벤트.대상 || 이벤트.src요소;

// ... 이제 이벤트 개체와 대상이 있습니다.
...
}

버블링을 중지하려면 event.cancelBubble=true 코드를 사용하세요.

다음과 같이 브라우저 간 팝업을 중지할 수 있습니다.

코드: event.stopPropagation ? event.stopPropagation() : (event.cancelBubble=true);

  • 이벤트가 발생하면 발생한 요소를 "대상"(event.target)으로 표시합니다.
  • 다음으로 이벤트는 먼저 문서 루트에서 event.target으로 이동하여 addEventListener(...., true)를 통해 제공된 핸들러를 호출합니다.
  • 그런 다음 이벤트는 event.target에서 문서 루트까지 이동하여 on* 및 addEventListener(...., false)를 통해 제공되는 처리기를 호출합니다.
  • event.target은 이벤트가 발생한 가장 깊은 요소입니다.
  • event.currentTarget(=this) – 핸들러가 현재 트리거된 요소(이벤트가 "플로트"됨).
  • event.eventPhase - 작동한 단계(다이빙 = 1, 상승 = 3).

이벤트는 프로그래밍 중인 시스템에서 발생하는 동작 또는 발생이며 시스템이 이에 대해 알려줍니다. 당신은 할 수 있습니다원하는 경우 어떤 방식으로든 응답합니다. 예를 들어 사용자가 웹 페이지의 버튼을 클릭하면 정보 상자를 표시하여 해당 작업에 응답할 수 있습니다. 이 기사에서는 주변 이벤트의 몇 가지 중요한 개념에 대해 논의하고 브라우저에서 작동하는 방식을 살펴봅니다. 이것은 "철저한 연구가 될 것입니다. 이 단계에서 당신이 알아야 할 것입니다.

전제 조건: 기본 컴퓨터 활용 능력, HTML 및 CSS에 대한 기본 이해, JavaScript 첫 단계 .
목적: 이벤트의 기본 이론, 브라우저에서 작동하는 방식, 프로그래밍 환경에 따라 이벤트가 어떻게 다른지 이해합니다.

행운의 연속

위와 같이, 이벤트프로그래밍 중인 시스템에서 발생하는 작업 또는 발생입니다. 시스템은 이벤트가 발생할 때 일종의 신호를 생성(또는 "발화")하고 어떤 종류의 작업이 자동으로 수행될 수 있는 메커니즘을 제공합니다(즉, , 일부 코드 실행 중) 이벤트가 발생할 때. 예를 들어 공항에서 비행기가 이륙하기 위해 활주로가 비었을 때 조종사에게 신호가 전달되어 결과적으로 비행기 조종을 시작합니다.

웹의 경우 이벤트는 브라우저 창 내부에서 발생하고 그 안에 있는 특정 항목에 첨부되는 경향이 있습니다. 단일 요소, ​​요소 집합, 현재 탭에 로드된 HTML 문서 또는 전체 브라우저 창. 발생할 수 있는 다양한 유형의 이벤트가 있습니다. 예를 들면 다음과 같습니다.

  • 사용자가 특정 요소 위로 마우스를 클릭하거나 특정 요소 위에 커서를 놓는 것입니다.
  • 키보드에서 키를 누르는 사용자.
  • 사용자가 브라우저 창의 크기를 조정하거나 닫습니다.
  • 제출 중인 양식입니다.
  • 재생 중이거나 일시중지되거나 재생이 종료되는 동영상입니다.
  • 오류가 발생했습니다.

여기에서(그리고 MDN 이벤트 참조를 살펴봄으로써) 다음과 같은 정보를 수집할 수 있습니다. 많이대응할 수 있는 이벤트입니다.

사용 가능한 각 이벤트에는 이벤트 핸들러, 이벤트가 발생할 때 실행되는 코드 블록(일반적으로 프로그래머가 만드는 JavaScript 함수)입니다. 이러한 코드 블록이 이벤트 발생에 대한 응답으로 실행되도록 정의되면 우리는 다음과 같이 말합니다. 이벤트 핸들러 등록. 이벤트 핸들러는 때때로 이벤트 리스너- 엄밀히 말하면 함께 작동하지만 우리의 목적을 위해 거의 상호 교환 가능합니다. 리스너는 이벤트 발생을 수신 대기하고 핸들러는 이벤트 발생에 대한 응답으로 실행되는 코드입니다.

노트: 웹 이벤트는 핵심 JavaScript 언어의 일부가 아니며 브라우저에 내장된 API의 일부로 정의됩니다.

간단한 예

여기에서 의미하는 바를 설명하기 위해 간단한 예를 살펴보겠습니다. 이미 이 과정의 많은 예에서 사용된 이벤트 및 이벤트 핸들러를 보았지만 지식을 확고히 하기 위해 요약하겠습니다. 다음 예에서는 단일 , 누르면 배경이 임의의 색상으로 변경됩니다.

버튼(여백: 10px);

JavaScript는 다음과 같습니다.

Const btn = document.querySelector("버튼"); function random(number) ( return Math.floor(Math.random() * (숫자+1)); ) btn.onclick = function() ( const rndCol = "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")"; document.body.style.backgroundColor = rndCol; )

이 코드에서는 Document.querySelector() 함수를 사용하여 btn이라는 상수 내부에 버튼에 대한 참조를 저장합니다. 또한 난수를 반환하는 함수를 정의합니다. 코드의 세 번째 부분은 이벤트 핸들러입니다. btn 상수는 다음을 가리킵니다. 함수 bgChange() ( const rndCol = "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")"; document.body.style.backgroundColor = rndCol; )

관련된 웹에서 발견된 이벤트 핸들러를 등록하는 최초의 방법 이벤트 핸들러 HTML 속성(또는 인라인 이벤트 핸들러) 위에 표시된 것과 같이 - 속성 값은 말 그대로 이벤트가 발생할 때 실행하려는 JavaScript 코드입니다. 위의 예는 실행 코드를 포함하거나 참조하는 데 사용되는 요소 내부에 정의된 함수를 호출합니다. 이것은 일반적으로 JavaScript 코드를 포함하거나 참조하는 데 사용됩니다.">

대부분의 이벤트 핸들러에는 이벤트 개체에서 사용할 수 있는 표준 속성 및 기능(메서드) 집합이 있습니다. 전체 목록은 이벤트 개체 참조를 참조하십시오. 그러나 일부 고급 핸들러는 추가 데이터가 포함된 특수 속성을 추가합니다. 예를 들어 Media Recorder API에는 일부 오디오 또는 비디오가 녹음되고 작업(예: 저장 또는 재생)에 사용할 수 있을 때 발생하는 dataavailable 이벤트가 있습니다. "s event object 녹음된 오디오 또는 비디오 데이터를 포함하는 데이터 속성을 사용하여 액세스하고 작업을 수행할 수 있습니다.

기본 동작 방지

때로는 이벤트가 기본적으로 수행하는 작업을 수행하지 못하도록 하려는 상황이 발생합니다. 가장 일반적인 예는 웹 양식(예: 사용자 정의 등록 양식)입니다. 세부 정보를 입력하고 제출 버튼을 누르면 데이터가 처리를 위해 서버의 지정된 페이지로 제출되고 브라우저가 일종의 "성공 메시지" 페이지(또는 다른 페이지가 있는 경우 동일한 페이지)로 리디렉션되는 것이 자연스러운 동작입니다. 명시되지 않은.)

문제는 사용자가 데이터를 올바르게 제출하지 않았을 때 발생합니다. 개발자는 서버에 제출하는 것을 방지하고 무엇이 잘못되었으며 올바르게 처리하기 위해 무엇을 해야 하는지에 대한 오류 메시지를 제공하려고 합니다. 일부 브라우저는 지원합니다. 자동 양식 데이터 유효성 검사 기능이 있지만 많은 기능이 없으므로 이러한 기능에 의존하지 않고 자체 유효성 검사를 구현하는 것이 좋습니다. 간단한 예를 살펴보겠습니다.

먼저 이름과 성을 입력해야 하는 간단한 HTML 양식입니다.

div(여백-하단: 10px; )

이제 일부 JavaScript - 여기에서는 텍스트 필드가 비어 있는지 여부를 테스트하는 onsubmit 이벤트 핸들러(제출 이벤트가 제출될 때 양식에서 시작됨) 내부에서 매우 간단한 검사를 구현합니다. 그렇다면 이벤트 객체에서 preventDefault() 함수를 호출하여 양식 제출을 중지한 다음 양식 아래 단락에 오류 메시지를 표시하여 사용자에게 무엇이 잘못되었는지 알려줍니다.

Const 양식 = document.querySelector("양식"); const fname = document.getElementById("fname"); const lname = document.getElementById("이름"); const para = document.querySelector("p"); form.onsubmit = function(e) ( if (fname.value === "" || lname.value === "") ( e.preventDefault(); para.textContent = "두 이름을 모두 입력해야 합니다! "; ) )

분명히 이것은 매우 약한 양식 유효성 검사입니다 - 예를 들어 필드에 공백이나 숫자를 입력하여 사용자가 양식의 유효성을 검사하는 것을 중지하지는 않지만 예를 들면 괜찮습니다.출력은 다음과 같습니다.

이벤트 버블링 및 캡처

여기서 다룰 마지막 주제는 자주 접하게 되지는 않지만 이해하지 못한다면 정말 고통스러울 수 있습니다. 이벤트 버블링 및 캡처는 동일한 이벤트 유형의 두 핸들러가 한 요소에서 활성화될 때 어떤 일이 발생하는지 설명하는 두 가지 메커니즘입니다. 이 작업을 더 쉽게 하기 위해 예제를 살펴보겠습니다. show-video-box.html 예제를 새 탭(및 다른 탭)에서 엽니다. 아래에서 실시간으로 볼 수도 있습니다.

숨겨진 비디오 예
비디오 상자 예 표시

이것은 a )가 흐름 콘텐츠의 일반 컨테이너임을 보여주고 숨기는 매우 간단한 예입니다. CSS를 사용하여 스타일을 지정할 때까지 콘텐츠나 레이아웃에 영향을 주지 않습니다.">

a ) 문서에 비디오 재생을 지원하는 미디어 플레이어를 포함합니다. 당신이 사용할 수있는