댓글 검색 목록

[javascript] 브라우저 이벤트 처리 안내서

페이지 정보

작성자 운영자 작성일 20-03-17 12:50 조회 882 댓글 0

대부분의 웹 페이지는 대화식이며 사용자는 웹 페이지에서 작업을 수행 할 수 있습니다. 

동작의 예는 링크를 클릭하거나 양식을 제출하거나 웹 페이지를 스크롤 하는 것입니다.


사용자가 특정 작업을 수행 할 때 페이지가 특정 방식으로 작동하기를 원하는 경우가 있습니다. 

예를 들어, 사용자가 버튼을 클릭하면 모달을 표시 할 수 있습니다. 또는 사용자가 페이지에서 양식을 채울 때 입력이 유효한 경우 사용자에게 표시 할 수 있습니다. 이러한 동작은 브라우저 이벤트입니다.


https://sarahchima.com/blog/event-handlers/ 


이 기사에서는 브라우저에서 발생하는 이벤트를 처리하는 방법에 대해 설명합니다. 또한 기본 동작을 방지하는 방법과 이벤트 전파에 대해 설명합니다. 바로 시작하자.


이벤트 핸들러 소개 


이벤트가 발생하면 이벤트 핸들러를 사용하여 응답하는 방법을 브라우저에 알릴 수 있습니다. 

이벤트 핸들러는 이벤트가 발생할 때 실행되는 함수입니다. 이벤트 핸들러를 추가하는 세 가지 방법이 있습니다.

  • HTML 속성을 사용하는 인라인 이벤트 핸들러
  • DOM 속성
  • addEventListener 메소드 사용

인라인 이벤트 핸들러 


핸들러는 HTML 속성을 사용하여 설정할 수 있습니다. 예를 들어, 사용자가 버튼을 클릭 할 때마다 버튼에 'hi'를 알리려면 다음과 같이하십시오.

<button onclick="alert('hi')">Say Hi</button>


동일한 구문을 사용하여 다른 많은 이벤트에 대해서도 이 작업을 수행 할 수 있습니다.


HTML 요소에 많은 코드를 작성하는 것은 편리하지 않을 수 있습니다. 스크립트에서 함수를 작성하고 on <event> 속성에서 함수를 호출 할 수도 있습니다.

<button onclick="sayHi()">Say Hi</button>

<script>
    function sayHi() {
        console.log('Hi')
    }
</script>


DOM 속성 


이벤트를 처리하는 또 다른 방법은 DOM 속성을 사용하는 것입니다. 이를 위해 위의 예를 사용하십시오.


<button>Say Hi</button>

<script>
    var button = document.querySelector('button');
    button.onclick = () => {
        console.log('hi')
    }
</script>


이것은 이전 방법과 동일한 결과를 생성합니다.


인라인 이벤트 핸들러와 JavaScript 핸들러를 동일한 요소에 적용하면 어떻게 됩니까?

<button onclick="console.log('hi')">Say Hi</button>

<script>
    var button = document.querySelector('button');
    button.onclick = () => {
        console.log('no')
    }
</script>


JavaScript 핸들러는 인라인 핸들러보다 우선하므로 'no'가 기록됩니다.


addEventListener 메소드 


addEventListener 메소드를 사용하여 특정 DOM 요소에서 이벤트를 청취 할 수 있습니다. 

이 방법을 사용하여 이러한 이벤트를 처리하는 방법을 제공합니다. 이 방법의 한 가지 장점은 요소에 가능한 많은 이벤트를 등록 할 수 있다는 것입니다.


이것은 addEventListener 메소드의 구문입니다.

target.addEventListener(type, function, useCapture)


대상은 이벤트를 수신하려는 요소입니다.


Type은 수신하려는 이벤트 유형입니다. 예를 들어 버튼 인 경우 클릭 이벤트를 수신 할 수 있습니다.


함수는 이벤트 핸들러입니다. 이벤트 발생시 기능이 수행되도록 지정합니다.


useCapture는 선택 사항입니다. 이벤트를 캡처 또는 버블링 단계에서 사용해야 하는지 여부를 지정하는 부울입니다. 

그것이 true라면, 그것은 캡처 단계에서 사용됩니다. false (기본값) 인 경우 버블링 단계에서 사용됩니다. 우리는 나중에 이것에 대해 더 많이 만질 것입니다.


이 방법을 사용하는 예는 다음과 같습니다.

<button>Say Hi</button>

<script>
    let button = document.querySelector('button');
    button.addEventListener('click', () => {
        console.log('Hi') //Hi
    })
</script>


이 경우 버튼은 내 목표이고 이벤트 유형은 클릭이며 화살표 함수는 이 코드가 실행될 때 실행되는 함수입니다. 이 코드를 실행하면 버튼을 클릭 할 때마다 콘솔에 'Hi'가 표시됩니다.


명명된 함수는 콜백 함수로 전달 될 수도 있습니다.


이벤트 객체 


이벤트가 발생하면 브라우저는 이벤트 오브젝트를 작성하고 이를 이벤트 핸들러에 인수로 전달합니다. 

이 이벤트 객체에는 이벤트 세부 정보가 포함됩니다. 

예를 들어, 어떤 버튼을 클릭했는지, 어떤 키를 눌렀는지 또는 이벤트가 발생했을 때 마우스가 좌표를 알고 싶어 할 수 있습니다. 

이벤트 객체에서 이 모든 것을 얻을 수 있습니다.


위의 예를 사용하여 다음을 수행 할 수 있습니다.

<button>Say Hi</button>

<script>
    let button = document.querySelector('button');
    button.addEventListener('click', (event) => {
        console.log(event.clientX) //41
        console.log(event.clientY) //19
    })
</script>


이벤트가 발생한 위치의 y 좌표 (이 경우 각각 41 및 19)를 x로 인쇄합니다.


이벤트에 저장된 정보는 발생한 이벤트 유형에 따라 다릅니다. 

이벤트 오브젝트의 전체 세부 사항을 얻으려면 이벤트 오브젝트를 콘솔 console.log (event)에 로그 할 수 있습니다. 어쨌든 항상 발생한 이벤트 유형을 알려주는 type 속성이 있습니다.


기본 동작 


일부 요소에서 이벤트가 발생하면 기본적으로 수행되는 조치가 있습니다. 

예를 들어, 링크를 클릭하면 링크의 대상으로 이동합니다. 양식 내부의 버튼을 클릭하면 양식이 제출됩니다. 이것이 브라우저의 기본 동작입니다.


기본값이 발생하기 전에 대부분의 이벤트에 대해 이벤트 핸들러가 호출됩니다. event.preventDefault() 메소드를 사용하여 기본 조치를 막을 수 있습니다. 

이 메소드는 기본 조치가 발생하지 않도록 합니다. 예를 들면 다음과 같습니다.

<a href="https://sarahchima.com">Sarah Chima</a>

<script>
    let link = document.querySelector('a');
    link.addEventListener('click', (event) => {
        console.log("Nope, you ain't visiting her today")
        event.preventDefault()
    })
</script>


이 링크를 클릭하면 예상 URL로 이동하지 않고 명령문을 콘솔에 기록합니다.


페이지 또는 컨텍스트 메뉴에서 키보드 단축키를 구현하는 데에도 사용할 수 있습니다.


그러나 좋은 사용자 경험을 위해서는 요소의 예상 동작을 가로 채지 않는 것이 가장 좋습니다. 이러한 조치로 인해 사용자는 귀하의 웹 사이트가 고장 났다고 생각할 수 있습니다.


이벤트 및 전파 


요소에서 이벤트가 발생하면 대상 요소의 이벤트 핸들러가 먼저 실행됩니다. 

그런 다음 직계 부모 (있는 경우)의 처리기가 실행되고 해당 부모의 부모 처리기는 처리기가 있는 가장 바깥 쪽 요소까지 실행됩니다. 이것을 전파라고 합니다.


여기에 좋은 예가 있습니다.

<style>
    * {
        border: 1px solid green;
        margin: 15px
    }
</style>
<div onclick="alert('div')"> DIV
    <p onclick="alert('p')"> P 
        <span onclick="alert('span')"> SPAN</span>
    </p>
</div>


요소를 차별화하기 위해 약간의 스타일을 추가했습니다. 이 HTML 코드를 실행하고 span 요소를 클릭하면 세 개의 핸들러가 시작됩니다. 먼저, 범위에 있는 것, 다음에 p 태그에 있는 것, div 태그에 있는 것. 이벤트가 발생하면 외부 요소로 전파되고 해당 핸들러도 트리거 되기 때문입니다.


요소에서 발생할 수 있는 전파에는 버블링과 캡처라는 두 가지 유형이 있습니다. addEventListener 메소드의 구문에 대해 논의하기 전에 이것을 보았습니다.


버블링과 캡처의 차이점은 버블 링 단계에서 이벤트가 외부로 전파된다는 것입니다. 즉, 가장 안쪽 요소의 핸들러가 먼저 트리거 된 다음 부모가 끝까지 트리거 됩니다.


캡처에서 그 반대가 발생합니다. 가장 바깥 쪽 요소의 처리기가 먼저 트리거 된 다음 자식 처리기가 이벤트가 발생한 요소까지 끝까지 처리됩니다. 이것은 우리 예제에서 일어난 것과 반대입니다.


이벤트 핸들러의 경우 버블링이 기본값이지만 캡처 인수가 true로 설정되면 캡처가 발생합니다. 이에 대한 자세한 내용은 이 기사를 참조하십시오.


요소를 클릭 할 때 이 전파 동작이 발생하지 않도록 할 수 있습니다. 고맙게도 JavaScript는 그렇게 할 수 있는 방법을 제공합니다. 전파를 중지하려면 event.stopPropagation() 메소드를 호출하면 됩니다. 이 방법은 이벤트가 전파되는 것을 방지합니다.


이전 예제에서 다음을 수행 할 수 있습니다.

<div onclick="alert('div')"> DIV
    <p onclick="alert('p')"> P 
        <span> SPAN</span>
    </p>
</div>

<script>
    var span = document.querySelector('span');
    span.addEventListener('click', (event) => {
        alert('span')
        event.stopPropagation();
    }
</script>

이 코드를 실행하면 범위의 핸들러만 트리거 됩니다.


모든 기본 동작과 마찬가지로 전파 방지는 필요할 때만 수행해야 합니다.


우리가 가기 전에 한 가지 마지막.


이벤트 리스너 제거 


removeEventListener 메소드를 사용하여 이벤트 리스너를 제거 할 수 있습니다. 

addEventListener 메소드를 사용하는 것과 같은 방식으로 사용합니다. 우리는 타입과 함수를 같은 방식으로 전달합니다. 

그러나 함수가 작동하려면 변수에 함수를 저장해야 합니다.


여기에 예가 있습니다

<button>Say Hi</button>

<script>
    let button = document.querySelector('button');

    function sayHi() {
        console.log('Hi')
    }
    button.addEventListener('click', sayHi)
    button.removeEventListener('click', sayHi)
</script>


이 코드를 실행하고 이벤트 리스너 기능이 실행되지 않는 것을 확인하십시오. eventListener가 제거 되었기 때문입니다.


아래 예제와 같이 변수에 함수를 저장하지 않으면 removeEventListener가 작동하지 않습니다.

<button>Say Hi</button>

<script>
    let button = document.querySelector('button');
    button.addEventListener('click', () => {
        console.log('hi')
    })
    button.removeEventListener('click',  () => {
        console.log('hi')
    })
</script>


결론 


HTML 속성, DOM 속성 및 addEventListener 메서드를 사용하여 이벤트를 처리하는 방법에 대해 설명했습니다. 

event.preventDefault 메소드를 사용하여 기본 조치를 막을 수 있음을 알았습니다. 이벤트 전파에 대해서도 배웠습니다.


이벤트 처리는 브라우저가 사용자 조치에 응답하는 방식을 제어하는 ​​데 도움이 되며 이를 수행하는 방법에 대해 논의했습니다. 

다음 기사에서는 브라우저에서 발생할 수 있는 10 가지 일반적인 이벤트에 대해 설명합니다.



댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.