DOM事件

DOM级别与DOM事件

DOM级别:DOM0级,DOM1级,DOM2级和DOM3级
DOM事件:DOM0级事件处理,DOM2级事件处理和DOM3级事件处理
(1级DOM标准中没有定义事件相关内容)
目前最广泛标准是 DOM2。

DOM level 0

<button id=X onclick="print"></button>
<button id=Y onclick="print()"></button> 
<button id=Z onclick="print.call()"></button> 

<script>
   function print(){
     console.log('hi')
   }
   
    X.onclick = print 
    Y.onclick = print()
    Z.onclick = print.call()
</script>

请问上面哪几个能打印出 ‘hi’

<button id=Y onclick="print()"></button> 
<button id=Z onclick="print.call()"></button> 

X.onclick = print 

onclick = "要执行的代码”
用户一旦点击,浏览器就 eval("要执行的代码") 即 eval("print")

function print(){
    console.log('hi')
}
eval('print') // ƒ print(){console.log('hi')}
eval('print()') // hi
eval('print.call()') // hi
X.onclick = print // 类型为 函数对象
// 一旦用户点击,浏览器就执行 X.onclick.call(X,{})  
// X.onclick 需要一个函数

DOM level 2

<button id=X >X</button>

<script>
  X.addEventListener('click',function(){console.log('1)}) // 1
  X.onclick = function(){console.log('2')} 
  
// 两者的区别,后面的是一个属性,是唯一的,后面的会覆盖前面的
// 前者是一个队列模型,先进先出,函数会依次触发

</script>
function f1(){console.log(1)}
function f2(){console.log(2)}

X.addEventListener('click',f1)
X.addEventListener('click',f2)
// 1
// 2
X.removeEventListener('click',f1)
// 2

DOM事件流

addEventListener的第三个参数为指定事件是否在捕获阶段执行,设置为true表示事件在捕获阶段执行,而设置为false表示事件在冒泡阶段执行。

<div class="grand1">
  爷爷
  <div class="parent">
    爸爸
    <div class="child">
      儿子
    </div>
  </div>
</div>

<script>
// 当点击了儿子之后,是否点击了爸爸和爷爷
// yes

// 当点击儿子之后,三个函数是否调用
grand1.addEventListener('click',function f1(){
  console.log('爷爷')
})
parent1.addEventListener('click',function f2(){
  console.log('爸爸')
})
child1.addEventListener('click',function f3(){
  console.log('儿子')
})

// 请问 f1 f2 f3执行顺序
// 1 2 3 or 3 2 1

// 都可以
// 传第三个参数值为 false / null / NaN / '' / 0 / undefined / 或者默认不传值
grand1.addEventListener('click',function f1(){
  console.log('爷爷')
})
parent1.addEventListener('click',function f2(){
  console.log('爸爸')
})
child1.addEventListener('click',function f3(){
  console.log('儿子')
})
// 执行顺序为 3 2 1
// 儿子 爸爸 爷爷

// 传第三个参数为 ture
grand1.addEventListener('click',function f1(){
  console.log('爷爷')
},true)
parent1.addEventListener('click',function f2(){
  console.log('爸爸')
},true)
child1.addEventListener('click',function f3(){
  console.log('儿子')
},true)
// 执行顺序为 1 2 3
// 爷爷 爸爸 儿子
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 事件流 JavaScript与HTML之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互...
    DHFE阅读 855评论 0 3
  • 在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件、敲击键盘事件等。这样的事...
    劳卜阅读 5,022评论 8 42
  • 什么是DOM? 文档对象模型,HTML 是一棵树,DOM 也是一棵树。对 DOM 的理解,可以暂时先抛开浏览器的内...
    209bd3bc6844阅读 339评论 0 0
  • 什么是DOM? DOM全称为The Document Object Model,应该理解为是一个规范,定义了HTM...
    夜舞暗澜_3ea2阅读 820评论 1 3
  • 一、问答 1. dom对象的innerText和innerHTML有什么区别? innerHTML: 也就是从对象...
    饥人谷_罗伟恩阅读 650评论 0 2