수색…


매개 변수

매개 변수 기술
유형 String 은 청취 할 이벤트의 이름을 정의합니다.
경청자 이벤트가 발생할 때 Function 트리거됩니다.
옵션들 캡처를 설정할 Boolean Object 대해 다음 속성을 설정할 수 있으면 객체 옵션이 약하게 지원됩니다.
1. 캡처 이 유형의 이벤트가 등록 된 리스너에 전달되기 전에 DOM 트리의 해당 EventTarget에 전달되도록 지정하는 부울입니다.
2. 한 번 리스너가 추가 된 후 최대 한 번 호출되어야 함을 나타내는 부울입니다. 참이면 리스너는 호출 될 때 자동으로 제거됩니다.
3. 수동적 리스너가 preventDefault ()를 호출하지 않는다는 것을 나타내는 부울입니다. 그렇다면 사용자 에이전트는이를 무시하고 콘솔 경고를 생성해야합니다.

비고

사건의 기원

이벤트는 이벤트를 트리거하는 일부터 시작하지 않습니다.

이벤트는 이벤트를 트리거하는 것으로 시작하지 않습니다 (예 : 버튼).

대신

경로의 모든 요소에 닿아 이벤트가 발생하고 있음을 모든 요소에 알립니다. 이벤트는 목적지에 도달 한 후에 다시 돌아와 요소에 다시 발생 사실을 알립니다.

캡처 및 버블 링

우리가 배운 것처럼 이벤트는 DOM 트리의 맨 위에서 시작하여 경로의 모든 노드에 목적지까지 알려준 다음 대상에 도달하면 다시 돌아가고 발생하는 모든 요소에 대해 알려줍니다.

DOM 트리를 따라 내려가는 이벤트는 캡처 단계에 있고, DOM 트리를 올라가는 이벤트는 버블 링 단계에 있습니다.

기본적으로 이벤트는 버블 링 단계에서 들립니다. 이 값을 변경하려면 addEventListener 함수에서 세 번째 매개 변수를 지정하여 이벤트가 수신되는 단계를 지정할 수 있습니다. ( 캡처 섹션의 코드 예제)

소개

정의:

컴퓨팅에서 이벤트는 소프트웨어가 인식 할 수있는 작업 또는 발생으로 소프트웨어에서 처리 할 수 ​​있습니다. 컴퓨터 이벤트는 시스템에 의해, 사용자에 의해 또는 다른 방식으로 생성 또는 트리거 될 수 있습니다. 정의 출처

여기에 이미지 설명을 입력하십시오.

HTML 이벤트는 HTML 요소에 발생하는 "사물"입니다. JavaScript는 이러한 이벤트에 "반응"할 수 있습니다. Event Listeners 를 통해. 또한 사용자 정의 이벤트는 dispatchEvent 사용하여 트리거 될 수 있습니다. 그러나 이것은 단지 소개 일 뿐이므로 시작할 수 있습니다!

기본 이벤트 리스너

이벤트를 수신하려면 target.addEventListener(type, listener); 를 호출합니다 target.addEventListener(type, listener);

function loadImage() {
  console.log('image code here!');
}
var myButton = document.querySelector('#my-button');
myButton.addEventListener('click', loadImage);

my-button 을 클릭 할 때마다 loadImage가 트리거됩니다.

이벤트 리스너는 DOM 트리의 모든 노드에 연결할 수 있습니다. 브라우저에서 기본적으로 트리거 된 모든 이벤트의 전체 목록을 보려면 여기를 클릭 하십시오. 전체 이벤트 목록을 보려면 MDN 링크를 클릭하십시오.

이벤트 리스너 제거

removeEventListener () 메서드는 addEventListener () 메서드로 첨부 된 이벤트 핸들러를 제거합니다.

element.removeEventListener("mousemove", myFunction);

removeEventListener 모든 항목 (이벤트 이름, 함수 및 옵션)은 이벤트 리스너를 요소에 추가 할 때 설정된 항목과 일치해야합니다.

. remove removeener를 사용하여 바인딩

이벤트 리스너를 추가 할 때 함수에서 .bind 를 사용하면 함수를 제거 할 수 없으므로 실제로 작성할 수있는 eventListener를 제거 할 수 있습니다.

function onEvent() {
   console.log(this.name);
}

var bindingOnEvent = onEvent.bind(this);

document.addEventListener('click', bindingOnEvent);

...

document.removeEventListener('click', bindingOnEvent);

한 번만 이벤트를 듣다.

once 옵션이 광범위하게 지원 될 때까지 이벤트가 처음 실행되면 수동으로 리스너를 제거해야합니다.

이 작은 조력자는 우리가 이것을 성취하는 데 도움이 될 것입니다 :

Object.prototype.listenOnce = Object.prototype.listenOnce ||
  function listenOnce(eventName, eventHandler, options) {
      var target = this;
      target.addEventListener(eventName, function(e) {
          eventHandler(e);
          target.removeEventListener(eventName, eventHandler, options);
      }, options);
  }

var target = document.querySelector('#parent');
target.listenOnce("click", clickFunction, false);

* Object 프로토 타입에 함수를 연결하는 것은 좋지 않으므로이 코드의 첫 번째 행을 제거하고 첫 번째 매개 변수로 대상을 추가 할 수 있습니다.

문서가로드되기를 기다리는 중

가장 일반적으로 사용되는 이벤트 중 하나는 스크립트 파일과 이미지를 포함하여 문서가로드되기를 기다리는 것입니다. documentload 이벤트가이 작업에 사용됩니다.

document.addEventListener('load', function() {
   console.log("Everything has now loaded!");
});

때로는 DOM 객체가로드되기 전에 DOM 객체에 액세스하려고 시도하여 null 포인터가 발생합니다. 이들은 디버깅하기가 정말 어렵습니다. 이를 피하기 위해 documentDOMContentLoaded 이벤트를 대신 사용하십시오. DOMContentLoaded 는 다른 외부 리소스를 기다리지 않고 HTML 내용이로드되고 초기화되도록합니다.

document.addEventListener('DOMContentLoaded', function() {
   console.log("The document contents are now available!");
});

이벤트 객체

이벤트 객체에 액세스하려면 이벤트 리스너 콜백 함수에 event 매개 변수를 포함시킵니다.

var foo = document.getElementById("foo");
foo.addEventListener("click", onClick);

function onClick(event) {
  // the `event` parameter is the event object
  // e.g. `event.type` would be "click" in this case
};

e.stopPropagation ();

HTML :

<div id="parent">
   <div id="child"></div>
</div>

자바 스크립트 :

var parent = document.querySelector('#parent');
var child = document.querySelector('#child');

child.addEventListener('click', function(e) {
   e.stopPropagation();
   alert('child clicked!');
});

parent.addEventListener('click', function(e) {
   alert('parent clicked!');
});

자식은 이벤트 전파를 중지하고 버블 링 단계에서 이벤트를 수신하므로 자식을 클릭하면 자식 만 트리거됩니다. 전달을 중지하지 않고 두 이벤트가 모두 트리거됩니다.


e.preventDefault ();

event.preventDefault() 메서드는 요소의 기본 동작을 중지합니다.

예 :

  • 제출 단추가 양식을 제출하지 못하도록 방지
  • 링크가 URL을 따르지 않도록 방지
var allAnchorTags = document.querySelector('a');

allAnchorTags.addEventListener('click', function(e){
    e.preventDefault();
    console.log('anchor tags are useless now! *evil laugh*');
});

e.target 대 e.currentTarget

e.currentTarget 이벤트가 DOM을 통과 할 때 이벤트의 현재 대상을 식별합니다. 이벤트가 발생한 요소를 식별하는 event.target과 대조적으로 이벤트 처리기가 연결된 요소를 항상 참조합니다.

다른 말로

e.target 은 이벤트 디스패처를 트리거 할 트리거를 반환합니다.

e.currentTarget 은 청취자에게 할당 한 것을 반환합니다.

HTML :

<body>
   <button id="my-button"></button>
</body>

자바 스크립트 :

var body = document.body;
body.addEventListener( 'click', function(e) {
    console.log('e.target', e.target);
    console.log('e.currentTarget', e.currentTarget);
});

my-button 하면

  • e.targetmy-button 이 될 것입니다.
  • e.currentTargetbody

이벤트 버블 링 및 캡처

DOM 요소에서 발생한 이벤트는 대상 요소에만 영향을 미치지 않습니다. DOM에있는 대상의 조상 중 누구라도 이벤트에 반응 할 수 있습니다. 다음 문서를 고려하십시오.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
  <p id="paragraph">
    <span id="text">Hello World</span>
  </p>
</body>
</html>

옵션없이 각 요소에 리스너를 추가하면 범위에 대한 클릭이 트리거됩니다.

document.body.addEventListener('click', function(event) {
  console.log("Body clicked!");
});
window.paragraph.addEventListener('click', function(event) {
  console.log("Paragraph clicked!");
});
window.text.addEventListener('click', function(event) {
  console.log("Text clicked!");
});

window.text.click();

... 그러면 이벤트가 각 조상을 통해 거품 을 내며 진행되는 동안 각 클릭 핸들러를 트리거합니다.

Text clicked!
Paragraph clicked!
Body clicked!

핸들러 중 하나가 더 이상 핸들러를 트리거하지 못하게하려면, event.stopPropagation() 메소드를 호출 할 수 있습니다. 예를 들어 두 번째 이벤트 핸들러를 다음과 같이 바꾸면 :

window.paragraph.addEventListener('click', function(event) {
  console.log("Paragraph clicked, and that's it!");
  event.stopPropagation();
});

bodyclick 핸들러가 트리거되지 않은 채로 다음 출력이 표시됩니다.

Text clicked!
Paragraph clicked, and that's it!

마지막으로 버블 링 대신 " 캡처 "중에 트리거되는 이벤트 리스너를 추가 할 수있는 옵션이 있습니다. 이벤트가 조상을 통해 요소에서 시작하기 전에 먼저 조상을 통해 요소로 "캡처"됩니다. 캡처 리스너는 addEventListener 의 선택적 세 번째 인수로 true 또는 {capture: true} 를 지정하여 추가됩니다. 위의 첫 번째 예제에 다음 리스너를 추가하면 :

document.body.addEventListener('click', function(event) {
  console.log("Body click captured!");
}, true);
window.paragraph.addEventListener('click', function(event) {
  console.log("Paragraph click captured!");
}, true);
window.text.addEventListener('click', function(event) {
  console.log("Text click captured!");
}, true);

우리는 다음 결과를 얻을 것이다 :

Body click captured!
Paragraph click captured!
Text click captured!
Text clicked!
Paragraph clicked!
Body clicked!

기본적으로 이벤트는 버블 링 단계에서 들립니다. 이 값을 변경하려면 addEventListener 함수에서 세 번째 매개 변수를 지정하여 이벤트가 수신되는 단계를 지정할 수 있습니다. (캡처 및 버블 링에 대해 알아 보려면 비고란에 표시하십시오 )

element.addEventListener(eventName, eventHandler, useCapture)

useCapture : true 는 DOM 트리를 사용할 때 이벤트를 수신하는 것을 의미합니다. false 는 DOM 트리를 올라가는 동안 이벤트를 수신하는 것을 의미합니다.

window.addEventListener("click", function(){alert('1: on bubble')}, false);
window.addEventListener("click", function(){alert('2: on capture')}, true);

경고 상자가 다음 순서로 나타납니다.

  • 2 : 캡처 중
  • 1 : 거품에

실제 사용 사례

캡처 이벤트는 버블 이벤트 전에 디스패치되므로 캡처 단계에서 이벤트를 청취하면 이벤트가 먼저 들리는 것을 보장 할 수 있습니다.

부모 요소에서 click 이벤트를 청취하고 자식에서 click 이벤트를 수신하는 경우 useCapture 매개 변수를 변경하는 방법에 따라 먼저 자식 또는 부모를 먼저 청취 할 수 있습니다.

버블 링에서 하위 이벤트는 캡처에서 먼저 호출되고 부모는 먼저 호출됩니다.

버블 링에서 하위 이벤트는 캡처에서 먼저 호출되고 부모는 먼저 호출됩니다.

HTML :

<div id="parent">
   <div id="child"></div>
</div>

자바 스크립트 :

child.addEventListener('click', function(e) {
   alert('child clicked!');
});

parent.addEventListener('click', function(e) {
   alert('parent clicked!');
}, true);

부모 eventListener를 true로 설정하면 부모 수신기가 먼저 트리거됩니다.

e.stopPropagation ()과 결합하면 이벤트가 하위 이벤트 수신기 또는 부모를 트리거하지 못하게 할 수 있습니다. (다음 예제에서 자세히 설명)

이벤트 위임

이벤트 위임은 특정 노드에 이벤트 리스너를 추가하지 않아도되는 프로세스입니다. 대신 이벤트 리스너가 상위 노드에 추가됩니다. 이 메커니즘은 이벤트 전파 / 버블 링을 사용하여 이벤트가 발생한 요소를 사용하는 대신 DOM의 상위 요소 / 노드에서 이벤트를 처리합니다. 예를 들어 다음 목록 요소에 대한 이벤트를 추가해야한다고 생각합니다.

<ul id="container">
    <li id="item-1" class="new">Item 1</li>
    <li id="item-2">Item 2</li>
    <li id="item-3">Item 3</li>
</ul>

click 핸들러를 추가해야하며 기본적으로 루프를 사용하여 각 요소에 리스너를 추가 할 수 있지만 요소를 동적으로 추가하려고한다고 가정합니다. 따라서 DOM이로드되고 DOM이 초기화되고 각 요소에 대한 모든 이벤트 핸들러를 등록한 후 위의 UL 새로 삽입 된 요소는 해당 요소가 DOM에 없으므로 클릭시 응답하지 않습니다. 우리가 클릭 이벤트 리스너를 등록했을 때.

따라서이 문제를 극복하기 위해 이벤트 위임을 활용할 수 있습니다. 즉, 각 li 요소 자체에 리스너를 등록하는 대신 이벤트 리스너를 부모 UL 요소에 바인딩 할 수 있습니다. 예를 들면 다음과 같습니다.

document.getElementById("container").addEventListener("click", function(e) {
    console.log("List item " e.target.id, " was clicked!");
});

이벤트는 기본적으로 전파되므로 (거품이 위로 향함) LI 요소를 클릭하면 UL 요소가 동일한 이벤트를 발생시킵니다. 이 경우 함수에서 e 매개 변수를 사용할 수 있습니다.이 매개 변수는 실제로 이벤트 객체이며 이벤트를 시작한 원래 요소를 포함하여 이벤트에 대한 유용한 정보를 전달합니다. 예를 들어 다음과 같이 사용할 수 있습니다.

document.getElementById("container").addEventListener("click", function(e) {

    // If UL itself then no action is require
    if(e.target.nodeName == 'UL') return false;

    if(e.target.classList.contains('new')) {
        console.log("List item " e.target.id, " was clicked and it's new!");
    }
});

따라서 e (Event Object)를 사용하면 소스 요소 (e.target)를 검사 할 수 있으며 DOM을로드 한 후 새 요소를 UL 쉽게 주입 할 수 있으며 위임 된 이벤트 핸들러 만 모든 클릭 이벤트를 처리합니다. 모든 요소에 대해 하나의 함수 만 선언했기 때문에 부모 UL 내에서 메모리 소비가 적습니다.

맞춤 이벤트 트리거

CustomEvent API를 사용하면 개발자가 맞춤 이벤트를 만들고 DOM 노드에서 트리거하여 데이터를 전달할 수 있습니다.

event = new CustomEvent(typeArg, customEventInit);

typeArg - 이벤트의 이름을 나타내는 DOMString

customEventInit - 선택적 매개 변수입니다 (다음 예에서는 e 로 전달됩니다).

당신은 첨부 할 수 있습니다 eventListenersdocument 또는 HTML 요소.

맞춤 이벤트가 추가되고 요소 (또는 문서)에 바인딩되면 자바 스크립트에서 수동으로 이벤트를 발생시킬 수 있습니다.

document.addEventListener("event-name", function(e) {
  console.log(e.detail); // logs custom object passed from the event.
});

var event = new CustomEvent("event-name", { "param-name": "param-value" });
document.dispatchEvent(event);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow