事件周期:捕获=>目标触发=>冒泡

本文深入解析DOM事件模型的三阶段:捕获、目标触发及冒泡,对比IE8的两阶段模型。阐述事件对象的使用,包括如何获取、取消冒泡及优化事件监听器的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

***事件周期: 
   DOM标准: 3阶段
      1. 捕获(capture): 由外向内依次记录各级元素绑定的相同事件处理函数
      2. 目标触发: 执行实际触发事件的元素上的处理函数
      3. 冒泡: 由目标元素向外,出发各级父元素上绑定的相同事件处理函数
        目标元素(target): 实际触发事件的元素     

   IE8: 2个阶段: 没有捕获阶段   

   事件对象: event: 在事件发生时,自动创建的封装所有事件信息的对象
       event对象提供了操控事件的方法: 阻止事件, 取消冒泡....
   何时: 1. 为了获得事件相关的数据
            2. 操控事件
   如何: 
      获取: DOM标准: 事件对象,默认作为事件处理函数的第一个参数传入: 
               IE8: 事件对象自动保存在全局变量event中
         兼容: function eventHandler(e){
         e=e||window.event;
                  }
      
   取消冒泡: e.stopPropagation();
   利用冒泡: 
   优化: 尽量少的添加EventListener
       为什么: 每个EventListener都是一个对象
          浏览器触发事件时,会轮询每个EventListener对象
          添加的EventListener越多,页面响应速度越低
   解决: 当多个平级子元素绑定相同的事件处理函数时
           其实,只要在父元素绑定一次,所有子元素共用即可!
   难题: 1. 如何获得目标元素:
              this->父元素 X
              DOM: e.target ->目标元素
              IE8: e.srcElement
                  兼容: var target=e.target||e.srcElement;
            2. 鉴别目标元素是否想要: 
              判断元素的名称或属性

以下代碼點選toolbar某些選項時會跳出選單,當點擊toolbar之外其他區域時,將這些選單收回: <template> <div style="border: 1px solid #ccc" class="editor-container"> <div class="container"> <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" class="toolbar" /> <Editor style="height: 210px;" v-model="valueHtml" :defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" class="editor" /> </div> </div> </template> <script> import '@wangeditor/editor/dist/css/style.css' import { onBeforeUnmount, onMounted, ref, watch } from 'vue' import { Editor, Toolbar } from '@wangeditor/editor-for-vue' // 接收來自父組件的 v-model 值 export default { components: { Editor, Toolbar }, props: { modelValue: String }, emits: ['update:modelValue', 'response'], setup(props, { emit }) { const valueHtml = ref(props.modelValue || '<p>hello</p>') const editorRef = ref(null) onMounted(() => { setTimeout(() => { valueHtml.value = '' }, 1500) }) // 監聽 valueHtml 變化,同步給父組件 // 同時發送 response 事件 watch(valueHtml, (newVal) => { if (newVal !== props.modelValue) { emit('update:modelValue', newVal) emit('response', newVal) } }) // 同步父組件的 modelValue 到 valueHtml watch(() => props.modelValue, (newVal) => { if (newVal !== valueHtml.value) { valueHtml.value = newVal } }) onBeforeUnmount(() => { if (editorRef.value) editorRef.value.destroy() }) const handleCreated = (editor) => { editorRef.value = editor } return { valueHtml, editorRef, toolbarConfig: {}, editorConfig: { placeholder: '請輸入內容...' }, mode: 'default', handleCreated } } } </script> <style scoped> .editor-container { position: fixed; top: 56px; bottom: 45px; left: 0; width: 50%; height: 40%; z-index: 999; background-color: #b60000; overflow-y: auto; } .container { display: flex; flex-direction: column; width: 100%; /* 保持原宽度 */ border: 1px solid #ccc; /* 可选:保留容器边框 */ } .toolbar { } .editor { } </style>
08-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值