• .onsubmit과 .addEventListener의 차이
    Frontend/JavaScript 2023. 2. 27. 16:57
    반응형

    다음 두 예제 코드를 봅시다.

    예시 1 : .onsubmit

    <form id="foo">
      <input name="bar" />
      <button type="submit">제출</button>
    </form>
    const form = document.getElementById('foo');
    form.onsubmit = function (event) {
      event.preventDefault();
        console.log(event.target.bar.value);
    };

    예시 2 : .addEventListener

    <form id="foo">
      <input name="bar" />
      <button type="submit">제출</button>
    </form>
    const form = document.getElementById('foo');
    form.addEventListener("submit", function (event) {
      event.preventDefault();
      console.log(event.target.bar.value);
    });

    이 코드들의 실행 결과를 예상해보면, form 태그 내의 input의 value값을 읽어들여 출력할 것이라는 사실을 알 수 있습니다.

    실제로 두 코드 모두 같은 결과를 보입니다.

    그렇다면 js는 왜 .onsubmit.addEventListener로 나누어 놨을까요?

    이 둘의 차이는 무엇일까요?

    .onsubmit.addEventListener('submit', () => { /* ... */ })의 차이는 다음과 같은 상황에서 발생합니다.

    차이점

    앞서 보여드린 예제처럼 위 기능 둘 다 자바스크립트의 form 이벤트 발생을 핸들링할 때 사용됩니다.

    하지만 이 기능들은 다중 이벤트 핸들링 상황에서 큰 차이를 보이는데요,

    .onsubmit은 form엘리먼트를 나타내는 DOM 객체의 프로퍼티입니다. 따라서 해당 객체의 단일 이벤트 핸들러로 submit을 할 수 있게 도와줍니다.

    예를 들면 .onsubmit 예제를 봅시다.

    <form id="foo">
      <input name="bar" />
      <button type="submit">제출</button>
    </form>
    const form = document.getElementById('foo');
    form.onsubmit = function (event) {
      event.preventDefault();
      alert('1');
      console.log(event.target.bar.value);
    };
    form.onsubmit = function (event) {
      event.preventDefault();
      alert('2');
      console.log(event.target.bar.value);
    };

    .onsubmit은 앞서 언급했듯, .onsubmit은 DOM 객체의 프로퍼티이자, 단일 이벤트 핸들러이므로 첫 번째 핸들러가 등록된 이후, 곧이어 두 번째 핸들러가 덮어 쓰게 됩니다.

    즉, alert(’2’);이 있는 핸들러만 동작하게 된다는 것 입니다.

    반면에 .addEventListener는 form엘리먼트를 나타내는 DOM 객체의 메서드 입니다. 따라서 하나 이상의 이벤트 리스너를 함수로서 submit 이벤트로 form에 등록할 수 있습니다.

    프로퍼티와 달리 메서드는 체이닝이 가능하다.

    다음 예제인 .addEventListener를 봅시다

    <form id="foo">
      <input name="bar" />
      <button type="submit">제출</button>
    </form>
    const form = document.getElementById('foo');
    form.addEventListener("submit", function (event) {
      event.preventDefault();
      alert('1');
      console.log(event.target.bar.value);
    });
    form.addEventListener("submit", function (event) {
      event.preventDefault();
      alert('2');
      console.log(event.target.bar.value);
    });

    .addEventListener는 메서드이므로, form에 붙일 수가 있습니다. 따라서 사용자가 해당 form 태그를 통해 제출했을 때, .addEventListener로 등록한 모든 함수들이 동작하게 됩니다.

    따라서 위 코드의 실행 결과는 등록한 모든 이벤트를 실행하게 되므로, alert('1');alert('2'); 를 모두 실행하게 됩니다.

    이벤트를 다중으로 등록할 수 있으므로 캡처와 버블링을 사용할 수 있다는 특징도 있습니다.

    반응형

    댓글