이번에는 웹 개발 시 이벤트 처리규칙과 웹 개발 시 이벤트 처리 시 주의사항에 대해 알려드리겠습니다. 실제 사례를 살펴보겠습니다.
이벤트 처리
이벤트가 트리거되면 이벤트 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中文网其它相关文章!
推荐阅读:
위 내용은 웹 개발에서 이벤트 처리 규칙은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

译者 | 李睿审校 | 孙淑娟Web Speech API是一种Web技术,允许用户将语音数据合并到应用程序中。它可以通过浏览器将语音转换为文本,反之亦然。Web Speech API于2012年由W3C社区引入。而在十年之后,这个API仍在开发中,这是因为浏览器兼容性有限。该API既支持短时输入片段,例如一个口头命令,也支持长时连续的输入。广泛的听写能力使它非常适合与Applause应用程序集成,而简短的输入很适合语言翻译。语音识别对可访问性产生了巨大的影响。残疾用户可以使用语音更轻松地浏览

docker部署javaweb系统1.在root目录下创建一个路径test/appmkdirtest&&cdtest&&mkdirapp&&cdapp2.将apache-tomcat-7.0.29.tar.gz及jdk-7u25-linux-x64.tar.gz拷贝到app目录下3.解压两个tar.gz文件tar-zxvfapache-tomcat-7.0.29.tar.gztar-zxvfjdk-7u25-linux-x64.tar.gz4.对解

web端指的是电脑端的网页版。在网页设计中我们称web为网页,它表现为三种形式,分别是超文本(hypertext)、超媒体(hypermedia)和超文本传输协议(HTTP)。

怎么解决高并发大流量问题?下面本篇文章就来给大家分享下高并发大流量web解决思路及方案,希望对大家有所帮助!

区别:1、前端指的是用户可见的界面,后端是指用户看不见的东西,考虑的是底层业务逻辑的实现,平台的稳定性与性能等。2、前端开发用到的技术包括html5、css3、js、jquery、Bootstrap、Node.js、Vue等;而后端开发用到的是java、php、Http协议等服务器技术。3、从应用范围来看,前端开发不仅被常人所知,且应用场景也要比后端广泛的太多太多。

web前端打包工具有:1、Webpack,是一个模块化管理工具和打包工具可以将不同模块的文件打包整合在一起,并且保证它们之间的引用正确,执行有序;2、Grunt,一个前端打包构建工具;3、Gulp,用代码方式来写打包脚本;4、Rollup,ES6模块化打包工具;5、Parcel,一款速度极快、零配置的web应用程序打包器;6、equireJS,是一个JS文件和模块加载器。

和它本身的轻便一样,Bottle库的使用也十分简单。相信在看到本文前,读者对python也已经有了简单的了解。那么究竟何种神秘的操作,才能用百行代码完成一个服务器的功能?让我们拭目以待。1. Bottle库安装1)使用pip安装2)下载Bottle文件https://github.com/bottlepy/bottle/blob/master/bottle.py2.“HelloWorld!”所谓万事功成先HelloWorld,从这个简单的示例中,了解Bottle的基本机制。先上代码:首先我们从b

web浏览器是指“网页浏览器”,是一种用来检索、展示以及传递Web信息资源的应用程序;简单来说就是是用来浏览网络页面的软件。web浏览器主要通过HTTP协议与网页服务器交互并获取网页,这些网页由URL指定,文件格式通常为HTML,并由MIME在HTTP协议中指明。一个网页中可以包括多个文档,每个文档都是分别从服务器获取的。


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Dreamweaver Mac版
시각적 웹 개발 도구

뜨거운 주제



