事件

作者: chengfengwang | 来源:发表于2017-06-30 18:02 被阅读0次

添加事件的方法

  • HTML-on属性
    和后面两种方式不同,on属性的值是将会执行的代码,而不是一个函数。
    只会在冒泡阶段触发
<body onload="doSomething()">
<div onclick="console.log('触发事件')">
  • element节点的事件属性
    监听函数只会在冒泡阶段触发
    兼容性好,但是同一个事件只能绑定一个监听函数
  • addEventListener方法
    参数一:事件名称,大小写敏感
    参数二:监听函数
    参数三:可省,默认为false,只在冒泡阶段触发
    同一个事件能绑定多个监听函数
div1.addEventListener('click',function(){
     alert(2)
 })

移除事件的方法

 function fn(){
    alert(2)
}
div1.addEventListener('click',fn)
div1.removeEventListener('click',fn)
//这种方法并不能移除事件,因为两个函数的内存地址不同
div1.addEventListener('click',function(){
      alert(2)
})
div1.removeEventListener('click',function(){
      alert(3)
 })

事件的传播机制

当用户点击页面时,浏览器总是假定用户点击的是点击位置嵌套最深的节点
DOM2级规定事件有三个阶段:
1.从window对象到目标节点,捕获阶段
2.在目标节点上触发,目标阶段
3.从目标节点传导到window对象,冒泡阶段

    <div class='container'>
        <div class="box">
            <button type="" class="btn">按钮</button>
        </div>
    </div>
    <script>
        var container=document.querySelector('.container')
        var box=document.querySelector('.box')
        var btn=document.querySelector('.btn')
        container.addEventListener('click',function(){
            console.log('clicked container...')
        })
        box.addEventListener('click',function(){
            console.log('clicked box...')
        })
        btn.addEventListener('click',function(){
            console.log('clicked btn...')
        })

this指向

addEventListener方法指定的监听函数,内部的this对象总是指向触发事件的那个节点
以下写法的this对象都指向Element节点。

// JavaScript代码
element.onclick = print
element.addEventListener('click', print, false)
element.onclick = function () {console.log(this.id);}
// HTML代码
<element onclick="console.log(this.id)">

以下写法的this对象,都指向全局对象。

// JavaScript代码
element.onclick = function (){ doSomething() };
element.setAttribute('onclick', 'doSomething()');
// HTML代码
<element onclick="doSomething()">

event对象

事件发生后,会生成一个事件对象,作为参数,传递给监听函数
event.currentTarget
绑定事件的节点
event.target
浏览器假定用户点击的深层节点

使用事件代理

    <ul class="ct">
        <li>这里是</li>
        <li>饥人谷</li>
        <li>前端6班</li>
    </ul>
    <script>
        var ct = document.querySelector('.ct')
        ct.addEventListener('click',function(e){
       
            if(e.target.tagName.toLowerCase()==='li'){
                console.log(e.target.innerText)
            }
        })
        
    </script>

如何阻止事件冒泡? 如何阻止默认事件?

在事件的监听函数中使用:
e.stopPropagation()
e.preventDefault()

    <div class='container'>
        <div class="box">
            <button type="" class="btn">按钮</button>
        </div>
    </div>
    <a href="http://www.baidu.com">点击链接跳转到百度</a>
    <script>
        var container=document.querySelector('.container')
        var box=document.querySelector('.box')
        var btn=document.querySelector('.btn')
        var a=document.querySelector('a')
        container.addEventListener('click',function(e){
            console.log('clicked container...')
        })
        box.addEventListener('click',function(){
            console.log('clicked box...')
        })
        btn.addEventListener('click',function(e){
            e.stopPropagation()  // 阻止事件冒泡
            console.log('clicked btn...')
        })
        a.addEventListener('click',function(e){
           e.preventDefault()  // 阻止默认事件
           alert(1)
        })
    </script>

DOM0 事件和DOM2级在事件监听使用方式上有什么区别?

DOM0级

  • HTML语言,允许在元素标签属性中,直接定义某些事件的监听代码。在HTML标签的on属性上,定义要执行的代码
<p onclick='console.log(2)'></p>
  • Element节点有事件属性,可以指定监听函数
ele.onclick=function(){}

DOM2级
通过Element节点Document节点,Window对象的addEventListener 和 removeEventListener方法

window.addEventListener('load', doSomething, false)
第一种“HTML标签的on-属性”,违反了HTML与JavaScript代码相分离的原则;第二种“Element节点的事件属性”的缺点是,同一个事件只能定义一个监听函数,也就是说,如果定义两次onclick属性,后一次定义会覆盖前一次。因此,这两种方法都不推荐使用,除非是为了程序的兼容问题,因为所有浏览器都支持这两种方法。

addEventListener是推荐的指定监听函数的方法。它有如下优点:

1.可以针对同一个事件,添加多个监听函数。

2.能够指定在哪个阶段(捕获阶段还是冒泡阶段)触发回监听函数。

3.除了DOM节点,还可以部署在window、XMLHttpRequest等对象上面,等于统一了整个JavaScript的监听函数接口。

相关文章

  • JavaScript事件01——事件流

    大纲:概念(事件、事件流)事件流模型(事件冒泡、事件捕获、DOM事件流) 一、概念: 1、事件:事件就是用户或浏览...

  • 事件对象,事件监听,事件冒泡,事件代理

    一、事件对象 二、冒泡事件:(事件从子元素往父级元素向上触发事件)处理兼容问题:主流浏览器:e.stopPropa...

  • 事件总结

    DOM事件主要内容 事件流 事件注册 事件对象 事件分类 事件代理 什么是DOM事件? 事件是某个行为或者触发,比...

  • Javascript事件系统

    本文内容 事件基础 事件监听方式 事件默认行为 事件冒泡与事件捕获 事件绑定与事件委托 事件基础 注意:本文不会深...

  • Javascript事件-事件冒泡,事件捕获,事件监听和事件委托

    事件处理机制 (一)DOM事件流 DOM模型是一个树形结构,在DOM模型中,HTML元素是有层次的。当一个HTML...

  • 【事件】事件流

    1、JavaScript和HTML之间的交互通过事件实现的。2、事件流描述的是从页面中接收事件的顺序。3、IE 和...

  • 【事件】事件对象

    触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的额信息。(包括导致事件的元...

  • 【事件】事件类型

    DOM3 级事件规定了以下几类事件: UI(User Interface,用户界面)事件,当用户与页面上的元素交互...

  • 2018-09-10JQuery高级应用

    JQuery事件 window事件 鼠标事件 键盘事件 表单事件 事件注册语法$(对象).type(fn)type...

  • JS事件

    ?事件的相关术语 事件类型: 鼠标事件、键盘事件事件名称: click、dbclick等事件目标: 表示与发生事件...

网友评论

      本文标题:事件

      本文链接:https://www.haomeiwen.com/subject/dsjdcxtx.html