登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
3月21日 深圳|OpenClaw 线下实战沙龙:招聘、资讯、项目协同三大场景实操,VS ZeroClaw 横向对比评测,别再只会装,来现场跑通真实业务!
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
47
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
JavaScript中的事件模型有哪些
待办的
#IAG9PK
陌生人
拥有者
创建于
2024-07-29 16:07
<h2>一、事件与事件流</h2> <p><code>javascript</code>中的事件,可以理解就是在<code>HTML</code>文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件、鼠标事件、自定义事件等</p> <p>由于<code>DOM</code>是一个树结构,如果在父子节点绑定事件时候,当触发子节点的时候,就存在一个顺序问题,这就涉及到了事件流的概念</p> <p>事件流都会经历三个阶段:</p> <ul> <li>事件捕获阶段(capture phase)</li> <li>处于目标阶段(target phase)</li> <li> <p>事件冒泡阶段(bubbling phase)</p> <p><img src="https://static.ecool.fun//article/cda1838d-f839-4588-9787-bbaa0bec65ea.png" alt="" /></p> </li> </ul> <p>事件冒泡是一种从下往上的传播方式,由最具体的元素(触发节点)然后逐渐向上传播到最不具体的那个节点,也就是<code>DOM</code>中最高层的父节点</p> <pre><code class="language-html"><!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Event Bubbling</title> </head> <body> <button id="clickMe">Click Me</button> </body> </html></code></pre> <p>然后,我们给<code>button</code>和它的父元素,加入点击事件</p> <pre><code class="language-js">var button = document.getElementById('clickMe'); button.onclick = function() { console.log('1.Button'); }; document.body.onclick = function() { console.log('2.body'); }; document.onclick = function() { console.log('3.document'); }; window.onclick = function() { console.log('4.window'); };</code></pre> <p>点击按钮,输出如下</p> <pre><code class="language-js">1.button 2.body 3.document 4.window</code></pre> <p>点击事件首先在<code>button</code>元素上发生,然后逐级向上传播</p> <p>事件捕获与事件冒泡相反,事件最开始由不太具体的节点最早接受事件, 而最具体的节点(触发节点)最后接受事件</p> <h2>二、事件模型</h2> <p>事件模型可以分为三种:</p> <ul> <li>原始事件模型(DOM0级)</li> <li>标准事件模型(DOM2级)</li> <li>IE事件模型(基本不用)</li> </ul> <h3>原始事件模型</h3> <p>事件绑定监听函数比较简单, 有两种方式:</p> <ul> <li>HTML代码中直接绑定</li> </ul> <pre><code class="language-js"><input type="button" onclick="fun()"></code></pre> <ul> <li>通过<code>JS</code>代码绑定</li> </ul> <pre><code class="language-js">var btn = document.getElementById('.btn'); btn.onclick = fun;</code></pre> <h4>特性</h4> <ul> <li>绑定速度快</li> </ul> <p><code>DOM0</code>级事件具有很好的跨浏览器优势,会以最快的速度绑定,但由于绑定速度太快,可能页面还未完全加载出来,以至于事件可能无法正常运行</p> <ul> <li> <p>只支持冒泡,不支持捕获</p> </li> <li> <p>同一个类型的事件只能绑定一次</p> </li> </ul> <pre><code class="language-js"><input type="button" id="btn" onclick="fun1()"> var btn = document.getElementById('.btn'); btn.onclick = fun2;</code></pre> <p>如上,当希望为同一个元素绑定多个同类型事件的时候(上面的这个<code>btn</code>元素绑定2个点击事件),是不被允许的,后绑定的事件会覆盖之前的事件</p> <p>删除 <code>DOM0</code> 级事件处理程序只要将对应事件属性置为<code>null</code>即可</p> <pre><code class="language-js">btn.onclick = null;</code></pre> <h3>标准事件模型</h3> <p>在该事件模型中,一次事件共有三个过程:</p> <ul> <li>事件捕获阶段:事件从<code>document</code>一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行</li> <li>事件处理阶段:事件到达目标元素, 触发目标元素的监听函数</li> <li>事件冒泡阶段:事件从目标元素冒泡到<code>document</code>, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行</li> </ul> <p>事件绑定监听函数的方式如下:</p> <pre><code>addEventListener(eventType, handler, useCapture)</code></pre> <p>事件移除监听函数的方式如下:</p> <pre><code>removeEventListener(eventType, handler, useCapture)</code></pre> <p>参数如下:</p> <ul> <li><code>eventType</code>指定事件类型(不要加on)</li> <li><code>handler</code>是事件处理函数</li> <li><code>useCapture</code>是一个<code>boolean</code>用于指定是否在捕获阶段进行处理,一般设置为<code>false</code>与IE浏览器保持一致</li> </ul> <p>举个例子:</p> <pre><code class="language-js">var btn = document.getElementById('.btn'); btn.addEventListener(‘click’, showMessage, false); btn.removeEventListener(‘click’, showMessage, false);</code></pre> <h4>特性</h4> <ul> <li>可以在一个<code>DOM</code>元素上绑定多个事件处理器,各自并不会冲突</li> </ul> <pre><code class="language-js">btn.addEventListener(‘click’, showMessage1, false); btn.addEventListener(‘click’, showMessage2, false); btn.addEventListener(‘click’, showMessage3, false);</code></pre> <ul> <li>执行时机</li> </ul> <p>当第三个参数(<code>useCapture</code>)设置为<code>true</code>就在捕获过程中执行,反之在冒泡过程中执行处理函数</p> <p>下面举个例子:</p> <pre><code class="language-js"><div id='div'> <p id='p'> <span id='span'>Click Me!</span> </p > </div></code></pre> <p>设置点击事件</p> <pre><code class="language-js">var div = document.getElementById('div'); var p = document.getElementById('p'); function onClickFn (event) { var tagName = event.currentTarget.tagName; var phase = event.eventPhase; console.log(tagName, phase); } div.addEventListener('click', onClickFn, false); p.addEventListener('click', onClickFn, false);</code></pre> <p>上述使用了<code>eventPhase</code>,返回一个代表当前执行阶段的整数值。1为捕获阶段、2为事件对象触发阶段、3为冒泡阶段</p> <p>点击<code>Click Me!</code>,输出如下</p> <pre><code class="language-js">P 3 DIV 3</code></pre> <p>可以看到,<code>p</code>和<code>div</code>都是在冒泡阶段响应了事件,由于冒泡的特性,裹在里层的<code>p</code>率先做出响应</p> <p>如果把第三个参数都改为<code>true</code></p> <pre><code class="language-js">div.addEventListener('click', onClickFn, true); p.addEventListener('click', onClickFn, true);</code></pre> <p>输出如下</p> <pre><code class="language-js">DIV 1 P 1</code></pre> <p>两者都是在捕获阶段响应事件,所以<code>div</code>比<code>p</code>标签先做出响应</p> <h3>IE事件模型</h3> <p>IE事件模型共有两个过程:</p> <ul> <li>事件处理阶段:事件到达目标元素, 触发目标元素的监听函数。</li> <li>事件冒泡阶段:事件从目标元素冒泡到<code>document</code>, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行</li> </ul> <p>事件绑定监听函数的方式如下:</p> <pre><code>attachEvent(eventType, handler)</code></pre> <p>事件移除监听函数的方式如下:</p> <pre><code>detachEvent(eventType, handler)</code></pre> <p>举个例子:</p> <pre><code class="language-js">var btn = document.getElementById('.btn'); btn.attachEvent(‘onclick’, showMessage); btn.detachEvent(‘onclick’, showMessage);</code></pre>
<h2>一、事件与事件流</h2> <p><code>javascript</code>中的事件,可以理解就是在<code>HTML</code>文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件、鼠标事件、自定义事件等</p> <p>由于<code>DOM</code>是一个树结构,如果在父子节点绑定事件时候,当触发子节点的时候,就存在一个顺序问题,这就涉及到了事件流的概念</p> <p>事件流都会经历三个阶段:</p> <ul> <li>事件捕获阶段(capture phase)</li> <li>处于目标阶段(target phase)</li> <li> <p>事件冒泡阶段(bubbling phase)</p> <p><img src="https://static.ecool.fun//article/cda1838d-f839-4588-9787-bbaa0bec65ea.png" alt="" /></p> </li> </ul> <p>事件冒泡是一种从下往上的传播方式,由最具体的元素(触发节点)然后逐渐向上传播到最不具体的那个节点,也就是<code>DOM</code>中最高层的父节点</p> <pre><code class="language-html"><!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Event Bubbling</title> </head> <body> <button id="clickMe">Click Me</button> </body> </html></code></pre> <p>然后,我们给<code>button</code>和它的父元素,加入点击事件</p> <pre><code class="language-js">var button = document.getElementById('clickMe'); button.onclick = function() { console.log('1.Button'); }; document.body.onclick = function() { console.log('2.body'); }; document.onclick = function() { console.log('3.document'); }; window.onclick = function() { console.log('4.window'); };</code></pre> <p>点击按钮,输出如下</p> <pre><code class="language-js">1.button 2.body 3.document 4.window</code></pre> <p>点击事件首先在<code>button</code>元素上发生,然后逐级向上传播</p> <p>事件捕获与事件冒泡相反,事件最开始由不太具体的节点最早接受事件, 而最具体的节点(触发节点)最后接受事件</p> <h2>二、事件模型</h2> <p>事件模型可以分为三种:</p> <ul> <li>原始事件模型(DOM0级)</li> <li>标准事件模型(DOM2级)</li> <li>IE事件模型(基本不用)</li> </ul> <h3>原始事件模型</h3> <p>事件绑定监听函数比较简单, 有两种方式:</p> <ul> <li>HTML代码中直接绑定</li> </ul> <pre><code class="language-js"><input type="button" onclick="fun()"></code></pre> <ul> <li>通过<code>JS</code>代码绑定</li> </ul> <pre><code class="language-js">var btn = document.getElementById('.btn'); btn.onclick = fun;</code></pre> <h4>特性</h4> <ul> <li>绑定速度快</li> </ul> <p><code>DOM0</code>级事件具有很好的跨浏览器优势,会以最快的速度绑定,但由于绑定速度太快,可能页面还未完全加载出来,以至于事件可能无法正常运行</p> <ul> <li> <p>只支持冒泡,不支持捕获</p> </li> <li> <p>同一个类型的事件只能绑定一次</p> </li> </ul> <pre><code class="language-js"><input type="button" id="btn" onclick="fun1()"> var btn = document.getElementById('.btn'); btn.onclick = fun2;</code></pre> <p>如上,当希望为同一个元素绑定多个同类型事件的时候(上面的这个<code>btn</code>元素绑定2个点击事件),是不被允许的,后绑定的事件会覆盖之前的事件</p> <p>删除 <code>DOM0</code> 级事件处理程序只要将对应事件属性置为<code>null</code>即可</p> <pre><code class="language-js">btn.onclick = null;</code></pre> <h3>标准事件模型</h3> <p>在该事件模型中,一次事件共有三个过程:</p> <ul> <li>事件捕获阶段:事件从<code>document</code>一直向下传播到目标元素, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行</li> <li>事件处理阶段:事件到达目标元素, 触发目标元素的监听函数</li> <li>事件冒泡阶段:事件从目标元素冒泡到<code>document</code>, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行</li> </ul> <p>事件绑定监听函数的方式如下:</p> <pre><code>addEventListener(eventType, handler, useCapture)</code></pre> <p>事件移除监听函数的方式如下:</p> <pre><code>removeEventListener(eventType, handler, useCapture)</code></pre> <p>参数如下:</p> <ul> <li><code>eventType</code>指定事件类型(不要加on)</li> <li><code>handler</code>是事件处理函数</li> <li><code>useCapture</code>是一个<code>boolean</code>用于指定是否在捕获阶段进行处理,一般设置为<code>false</code>与IE浏览器保持一致</li> </ul> <p>举个例子:</p> <pre><code class="language-js">var btn = document.getElementById('.btn'); btn.addEventListener(‘click’, showMessage, false); btn.removeEventListener(‘click’, showMessage, false);</code></pre> <h4>特性</h4> <ul> <li>可以在一个<code>DOM</code>元素上绑定多个事件处理器,各自并不会冲突</li> </ul> <pre><code class="language-js">btn.addEventListener(‘click’, showMessage1, false); btn.addEventListener(‘click’, showMessage2, false); btn.addEventListener(‘click’, showMessage3, false);</code></pre> <ul> <li>执行时机</li> </ul> <p>当第三个参数(<code>useCapture</code>)设置为<code>true</code>就在捕获过程中执行,反之在冒泡过程中执行处理函数</p> <p>下面举个例子:</p> <pre><code class="language-js"><div id='div'> <p id='p'> <span id='span'>Click Me!</span> </p > </div></code></pre> <p>设置点击事件</p> <pre><code class="language-js">var div = document.getElementById('div'); var p = document.getElementById('p'); function onClickFn (event) { var tagName = event.currentTarget.tagName; var phase = event.eventPhase; console.log(tagName, phase); } div.addEventListener('click', onClickFn, false); p.addEventListener('click', onClickFn, false);</code></pre> <p>上述使用了<code>eventPhase</code>,返回一个代表当前执行阶段的整数值。1为捕获阶段、2为事件对象触发阶段、3为冒泡阶段</p> <p>点击<code>Click Me!</code>,输出如下</p> <pre><code class="language-js">P 3 DIV 3</code></pre> <p>可以看到,<code>p</code>和<code>div</code>都是在冒泡阶段响应了事件,由于冒泡的特性,裹在里层的<code>p</code>率先做出响应</p> <p>如果把第三个参数都改为<code>true</code></p> <pre><code class="language-js">div.addEventListener('click', onClickFn, true); p.addEventListener('click', onClickFn, true);</code></pre> <p>输出如下</p> <pre><code class="language-js">DIV 1 P 1</code></pre> <p>两者都是在捕获阶段响应事件,所以<code>div</code>比<code>p</code>标签先做出响应</p> <h3>IE事件模型</h3> <p>IE事件模型共有两个过程:</p> <ul> <li>事件处理阶段:事件到达目标元素, 触发目标元素的监听函数。</li> <li>事件冒泡阶段:事件从目标元素冒泡到<code>document</code>, 依次检查经过的节点是否绑定了事件监听函数,如果有则执行</li> </ul> <p>事件绑定监听函数的方式如下:</p> <pre><code>attachEvent(eventType, handler)</code></pre> <p>事件移除监听函数的方式如下:</p> <pre><code>detachEvent(eventType, handler)</code></pre> <p>举个例子:</p> <pre><code class="language-js">var btn = document.getElementById('.btn'); btn.attachEvent(‘onclick’, showMessage); btn.detachEvent(‘onclick’, showMessage);</code></pre>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Html/JS/CSS
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册