웹 프론트엔드 JS 튜토리얼 웹 개발에서 이벤트 처리 규칙은 무엇입니까?

웹 개발에서 이벤트 처리 규칙은 무엇입니까?

Jun 04, 2018 am 10:14 AM
web 어느

이번에는 웹 개발 시 이벤트 처리규칙과 웹 개발 시 이벤트 처리 시 주의사항에 대해 알려드리겠습니다. 실제 사례를 살펴보겠습니다.

이벤트 처리

이벤트가 트리거되면 이벤트 object(이벤트 개체)가 콜백 매개변수로 이벤트 핸들러에 전달된다는 것을 알고 있습니다. 예:

// 不好的写法function handleClick(event) {  var pop = 
document
.getElementById('popup');
  popup.style.left = event.clientX + 'px';
  popup.style.top = event.clientY + 'px';
  popup.className = 'reveal';
}// 你应该明白addListener函数的意思addListener(element, 'click', handleClick);
로그인 후 복사

이 코드는 의 두 가지 속성만 사용합니다. 이벤트 객체: clientX 및 clientY. 페이지에 요소를 표시하기 전에 요소의 위치를 ​​지정하려면 이 두 가지 특성을 사용하세요. 이 코드는 매우 간단하고 문제가 없어 보이지만 이 접근 방식에는 한계가 있으므로 실제로 작성하는 것은 좋지 않은 방법입니다.

규칙 1: 애플리케이션 로직 분리

위 예제 코드의 첫 번째 문제는 이벤트 핸들러에 애플리케이션 로직이 포함되어 있다는 것입니다. 애플리케이션 로직은 사용자 행동이 아닌 애플리케이션과 관련된 기능 코드입니다. 위 예제 코드의 애플리케이션 로직은 특정 위치에 팝업 상자를 표시하는 것입니다. 이러한 상호작용은 사용자가 특정 요소를 클릭할 때 발생해야 하지만 항상 그런 것은 아닙니다.

동일한 로직이 다른 곳에서 트리거될 수 있으므로 모든 이벤트 핸들러에서 애플리케이션 로직을 분리하는 것이 가장 좋습니다. 예를 들어 사용자가 요소 위로 마우스를 이동할 때 팝업 상자를 표시할지, 키보드의 특정 키를 누를 때 동일한 논리적 판단을 내릴지 결정해야 하는 경우가 있습니다. 이러한 방식으로 여러 이벤트 핸들러가 동일한 논리를 실행하지만 코드가 실수로 여러 번 복사됩니다.

이벤트 핸들러에 애플리케이션 로직을 배치할 때의 또 다른 단점은 테스트와 관련이 있습니다. 테스트할 때 요소 클릭을 시뮬레이션하는 대신 함수 코드를 직접 트리거해야 합니다. 애플리케이션 로직이 이벤트 핸들러에 배치된 경우 이를 테스트하는 유일한 방법은 이벤트가 발생하도록 하는 것입니다. 일부 테스트 프레임워크에서는 트리거링 이벤트를 시뮬레이션할 수 있지만 실제로 이는 테스트에 대한 최선의 접근 방식은 아닙니다. 기능 코드를 호출하는 가장 좋은 방법은 단일 함수 호출을 사용하는 것입니다.

항상 애플리케이션 로직과 이벤트 처리 코드를 분리해야 합니다. 이전 예제 코드를 리팩터링하려는 경우 첫 번째 단계는 팝업 상자 논리를 처리하는 코드를 별도의 함수에 넣는 것입니다. 이 함수는 애플리케이션에 정의된 전역 개체에 탑재될 가능성이 높습니다. 이벤트 핸들러는 항상 동일한 전역 개체에 있어야 하므로 두 가지 메서드가 있습니다.

// 好的写法 - 拆分应用逻辑var MyApplication = {  handleClick: function (event) {    this.showPopup(event);
  },  showPopup: function (event) {    var pop = document.getElementById('popup');
    popup.style.left = event.clientX + 'px';
    popup.style.top = event.clientY + 'px';
    popup.className = 'reveal';
  }
};
addListener(element, 'click', function (event) {
  MyApplication.handleClick(event);
});
로그인 후 복사

이전에는 이벤트 핸들러에 포함되었던 모든 애플리케이션 로직이 이제 MyApplication.showPopup() 메서드로 이동되었습니다. 이제 MyApplication.handleClick() 메서드는 MyApplication.showPopup()을 호출하는 한 가지 작업만 수행합니다. 애플리케이션 로직이 제거되면 동일한 기능 코드에 대한 호출이 여러 지점에서 발생할 수 있으며 특정 이벤트의 트리거링에 의존할 필요가 없으므로 확실히 더 편리합니다. 그러나 이는 이벤트 핸들러 코드를 분석하는 첫 번째 단계일 뿐입니다.

Rule 2: 이벤트 객체를 배포하지 마세요

애플리케이션 로직을 제거한 후에도 위의 예제 코드에는 여전히 문제가 있습니다. 즉, 이벤트 객체가 통제할 수 없게 배포된다는 것입니다. 익명 이벤트 핸들러에서 MyApplication.handleClick()을 전달한 다음 이를 MyApplication.showPopup()에 전달합니다. 위에서 언급했듯이 이벤트 객체에는 이벤트와 관련된 추가 정보가 많이 포함되어 있으며, 이 코드에서는 그 중 두 가지만 사용합니다. 애플리케이션 로직은 다음과 같은 이유로 기능을 올바르게 완료하기 위해 이벤트 객체에 의존해서는 안 됩니다.

메서드 인터페이스는 어떤 데이터가 필요한지 나타내지 않습니다. 좋은 API는 기대치와 종속성에 대해 투명해야 합니다. 이벤트 객체를 매개변수로 취한다고 해서 이벤트의 어떤 속성이 유용하고 무엇에 사용되는지 알 수는 없습니다.

그러면 이 방법을 테스트하려면 이벤트 객체를 다시 생성하여 매개변수로 전달해야 합니다. . 따라서 이 메소드가 어떤 정보를 사용하는지 정확히 알아야 테스트 코드를 올바르게 작성할 수 있습니다.

이러한 문제(불분명한 인터페이스 형식 및 테스트를 위해 자체 생성된 이벤트 개체 참조)는 대규모 웹 응용 프로그램에서는 권장되지 않습니다. 코드의 명확성이 부족하면 버그가 발생할 수 있습니다.

가장 좋은 방법은 이벤트 핸들러가 이벤트 개체를 사용하여 이벤트를 처리하도록 한 다음 필요한 모든 데이터를 가져와 애플리케이션 로직에 전달하는 것입니다. 예를 들어 MyApplication.showPopup() 메서드에는 x 좌표와 y 좌표라는 두 가지 데이터만 필요합니다. 이러한 방식으로 이 두 매개변수를 수신하도록 메소드를 다시 작성합니다.

// 好的写法var MyApplication = {  handleClick: function (event) {    this.showPopup(event.clientX, event.clientY);
  },  showPopup: function (x, y) {    var pop = document.getElementById('popup');
    popup.style.left = x + 'px';
    popup.style.top = y + 'px';
    popup.className = 'reveal';
  }
};
addListener(element, 'click', function (event) {
  MyApplication.handleClick(event);
});
로그인 후 복사

在这段新重写的代码中,MyApplication.handleClick()将x坐标和y坐标传入了MyApplication.showPopup(),代替了之前传入的事件对象。可以很清晰地看到MyApplication.showPopup()所期望传入的参数,并且在测试或代码的任意位置都可以很轻易地直接调用这段逻辑,比如:

// 这样调用非常棒MyApplication.showPopup(10, 10);

当处理事件时,最好让事件处理程序成为接触到event对象的唯一的函数。事件处理程序应当在进入应用逻辑之前针对event对象执行任何必要的操作,包括阻止默认事件或阻止事件冒泡,都应当直接包含在事件处理程序中。比如:

// 好的写法var MyApplication = {  handleClick: function (event) {    // 假设事件支持DOM Level2
    event.preventDefault();
    event.stopPropagation();    // 传入应用逻辑
    this.showPopup(event.clientX, event.clientY);
  },  showPopup: function (x, y) {    var pop = document.getElementById('popup');
    popup.style.left = x + 'px';
    popup.style.top = y + 'px';
    popup.className = 'reveal';
  }
};
addListener(element, 'click', function (event) {
  MyApplication.handleClick(event);
});
로그인 후 복사

在这段代码中,MyApplication.handleClick()是事件处理程序,因此它在将数据传入应用逻辑之前调用了event.preventDefault()和event.stopPropagation(),这清除地展示了事件处理程序和应用逻辑之间的分工。因为应用逻辑不需要对event产生依赖,进而在很多地方都可以轻松地使用相同的业务逻辑,包括写测试代码。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

怎样利用JS做出引用传递与值传递

如何做出node.js界面

위 내용은 웹 개발에서 이벤트 처리 규칙은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python+Flask를 사용하여 웹 페이지의 실시간 업데이트 및 로그 표시를 구현하는 방법 Python+Flask를 사용하여 웹 페이지의 실시간 업데이트 및 로그 표시를 구현하는 방법 May 17, 2023 am 11:07 AM

1. 모듈을 사용하여 파일에 로그 출력: 로깅은 사용자 정의 수준 로그를 생성하고 지정된 경로에 로그를 출력할 수 있습니다. 로그 수준: 디버그(디버그 로그) = 5) {clearTimeout(시간) // 한 번에 모두 10번 획득한 경우 행이 비어 있음 로그 지우기 예약 작업}return}if(data.log_type==2){//(i=0;i에 대해 새 로그를 얻은 경우)

Nginx 웹 서버 캐디를 사용하는 방법 Nginx 웹 서버 캐디를 사용하는 방법 May 30, 2023 pm 12:19 PM

Caddy 소개 Caddy는 현재 Github에 38,000개 이상의 별이 있는 강력하고 확장성이 뛰어난 웹 서버입니다. Caddy는 Go 언어로 작성되었으며 정적 리소스 호스팅 및 역방향 프록시에 사용할 수 있습니다. Caddy에는 다음과 같은 주요 기능이 있습니다. Nginx의 복잡한 구성에 비해 원래 Caddyfile 구성은 매우 간단합니다. 기본적으로 자동화된 HTTPS 구성을 지원하고 HTTPS 인증서를 자동으로 적용할 수 있습니다. 수만 개의 사이트를 Go 언어로 작성하여 어디서나 실행할 수 있으며 메모리 안전성이 더욱 보장됩니다. 우선 CentO에 직접 설치해보겠습니다.

i34150 및 1G 독립 그래픽으로 플레이하기에 적합한 게임은 무엇입니까(i34150에 적합한 게임은 무엇입니까) i34150 및 1G 독립 그래픽으로 플레이하기에 적합한 게임은 무엇입니까(i34150에 적합한 게임은 무엇입니까) Jan 05, 2024 pm 08:24 PM

1G 독립 그래픽을 탑재한 i34150으로 어떤 게임을 할 수 있나요? LoL 같은 소규모 게임도 할 수 있나요? GTX750 및 GTX750TI는 매우 적합한 그래픽 카드 선택입니다. 작은 게임만 하거나 게임을 하지 않는다면 i34150 통합 그래픽 카드를 사용하는 것이 좋습니다. 일반적으로 그래픽 카드와 프로세서의 가격 차이는 그리 크지 않기 때문에 합리적인 조합을 선택하는 것이 중요합니다. 2G의 비디오 메모리가 필요한 경우 GTX750TI를 선택하는 것이 좋습니다. 1G의 비디오 메모리만 필요한 경우 GTX750을 선택하면 됩니다. GTX750TI는 오버클럭 기능을 갖춘 GTX750의 향상된 버전으로 볼 수 있습니다. i34150과 페어링할 수 있는 그래픽 카드는 필요에 따라 다릅니다. 독립형 게임을 플레이할 계획이라면 그래픽 카드 변경을 고려하는 것이 좋습니다. 당신은 선택할 수 있습니다

Java API 개발에서 웹 서버 처리를 위해 Jetty7 사용 Java API 개발에서 웹 서버 처리를 위해 Jetty7 사용 Jun 18, 2023 am 10:42 AM

JavaAPI 개발에서 웹 서버 처리를 위해 Jetty7 사용 인터넷의 발전과 함께 웹 서버는 애플리케이션 개발의 핵심 부분이 되었으며 많은 기업의 초점이기도 합니다. 증가하는 비즈니스 요구를 충족하기 위해 많은 개발자가 웹 서버 개발에 Jetty를 사용하기로 선택했으며 그 유연성과 확장성은 널리 인정받고 있습니다. 이 기사에서는 We 용 JavaAPI 개발에서 Jetty7을 사용하는 방법을 소개합니다.

웹상의 얼굴 차단 공격에 대한 실시간 보호(머신러닝 기반) 웹상의 얼굴 차단 공격에 대한 실시간 보호(머신러닝 기반) Jun 10, 2023 pm 01:03 PM

얼굴 차단 사격은 영상 속 인물을 가리지 않고 다수의 사격이 떠다니는 것처럼 보이도록 하여 마치 인물 뒤에서 떠다니는 것처럼 보이게 하는 것을 의미합니다. 기계 학습은 몇 년 동안 널리 사용되었지만 많은 사람들은 이러한 기능을 브라우저에서도 실행할 수 있다는 사실을 모릅니다. 이 기사에서는 기사 마지막 부분에 적용 가능한 몇 가지 시나리오를 소개합니다. 이 솔루션을 통해 몇 가지 아이디어를 얻을 수 있기를 바랍니다. mediapipeDemo(https://google.github.io/mediapipe/)는 주류 얼굴 차단 공세 주문형 업로드의 구현 원리를 보여줍니다. 비디오 서버 백그라운드 계산은 비디오 화면의 세로 영역을 추출하고 이를 svg로 변환합니다. 클라이언트가 비디오를 재생하는 동안 서버에서 svg를 다운로드하고 사격, 초상화와 결합합니다.

frps 서버와 웹이 포트 80을 공유하도록 nginx를 구성하는 방법 frps 서버와 웹이 포트 80을 공유하도록 nginx를 구성하는 방법 Jun 03, 2023 am 08:19 AM

우선, frp가 무엇인지에 대해 의문이 생길 것입니다. 간단히 말해서, frp는 인트라넷 침투 도구입니다. 클라이언트를 구성한 후 서버를 통해 인트라넷에 액세스할 수 있습니다. 이제 내 서버는 nginx를 웹 사이트로 사용했으며 포트 80은 하나만 있습니다. FRP 서버도 포트 80을 사용하려면 어떻게 해야 합니까? 쿼리 후에는 nginx의 역방향 프록시를 사용하여 이를 수행할 수 있습니다. 추가하려면: frps는 서버이고 frpc는 클라이언트입니다. 1단계: 서버에서 nginx.conf 구성 파일을 수정하고 nginx.conf의 http{}에 다음 매개변수를 추가합니다. server{listen80

Golang을 사용하여 웹 애플리케이션에 대한 양식 유효성 검사를 구현하는 방법 Golang을 사용하여 웹 애플리케이션에 대한 양식 유효성 검사를 구현하는 방법 Jun 24, 2023 am 09:08 AM

양식 유효성 검사는 웹 애플리케이션 개발에서 매우 중요한 링크로, 애플리케이션의 보안 취약성과 데이터 오류를 방지하기 위해 양식 데이터를 제출하기 전에 데이터의 유효성을 확인할 수 있습니다. Golang을 사용하여 웹 애플리케이션에 대한 양식 유효성 검사를 쉽게 구현할 수 있습니다. 이 기사에서는 Golang을 사용하여 웹 애플리케이션에 대한 양식 유효성 검사를 구현하는 방법을 소개합니다. 1. 폼 유효성 검사의 기본 요소 폼 유효성 검사를 구현하는 방법을 소개하기 전에 먼저 폼 유효성 검사의 기본 요소가 무엇인지 알아야 합니다. 양식 요소: 양식 요소는

조종석 웹 UI에서 관리 액세스를 활성화하는 방법 조종석 웹 UI에서 관리 액세스를 활성화하는 방법 Mar 20, 2024 pm 06:56 PM

Cockpit은 Linux 서버용 웹 기반 그래픽 인터페이스입니다. 이는 주로 신규/전문가 사용자가 Linux 서버를 보다 쉽게 ​​관리할 수 있도록 하기 위한 것입니다. 이 문서에서는 Cockpit 액세스 모드와 CockpitWebUI에서 Cockpit으로 관리 액세스를 전환하는 방법에 대해 설명합니다. 콘텐츠 항목: Cockpit 입장 모드 현재 Cockpit 액세스 모드 찾기 CockpitWebUI에서 Cockpit에 대한 관리 액세스 활성화 CockpitWebUI에서 Cockpit에 대한 관리 액세스 비활성화 결론 조종석 입장 모드 조종석에는 두 가지 액세스 모드가 있습니다. 제한된 액세스: 이는 조종석 액세스 모드의 기본값입니다. 이 액세스 모드에서는 조종석에서 웹 사용자에 액세스할 수 없습니다.

See all articles