scriptjava事件

101 阅读2分钟

注册事件

  • 两种注册事件
  1. 点语法注册事件
事件源.事件类型=事件处理函数
特点是不能注册同名事件否则会被覆盖
box.事件类型=function(){}
  1. 事件源注册事件
事件源.addEventListener('事件类型',事件处理函数(){})
注意点是这里的事件类型不用加'on'
特点是可以注册同名事件
box.addEventListener('事件类型',function(){})

移除事件 移除事件 : 变量赋值原理,先销毁旧值,然后存入新值

  • 细节: 只能移除具名事件,无法移除匿名事件
  • 语法: 事件源.removeEventListener('事件类型',事件处理函数)
let box = document.querySelector('#box');
 let fn = function(){
            alert('1-我是addEventListener语法注册的事件');
        };

        box.addEventListener('click', fn );
       //注册事件
        box.addEventListener('click',function(){
            alert('2-同名事件: 相同的事件类型');
        })
      //事件移除
        box.removeEventListener('click', fn );
        

阻止默认事件

  • js中有默认事件的标签: a标签 与 form表单阻止默认事件行为 : e.preventDefault()
  • 实际开发中用的最多的是阻止form表单默认提交(后期服务器课程使用频繁)
<a href="http://www.baidu.com">跳转到百度</a>
    <script>
       
        let a = document.querySelector('a')
        a.addEventListener('click', function (e) {
            // 阻止默认行为 方法
            e.preventDefault()
        })
    </script>

事件对象介绍

  1. 事件对象 :存储与事件触发相关信息(事件触发点,键盘信息)的对象
  2. 获取事件对象 :给事件处理函数添加一个形参 event ev e
      id="box"
      style="width: 200px;
    height: 200px;background-color: red"
    ></div>
    <script>
      var box = document.querySelector('#box')
      //注册点击事件
      box.onclick = function (e) {  
        console.log(e)
        console.log('你点击了box')
      }
    </script>

事件对象常用属性

      id="box"
      style="width: 200px;
    height: 200px;background-color: red"
    ></div>
    <script>
      /* 
        事件对象常用属性:
            e.pageX / e.pageY : 获取鼠标触发点到页面左上角距离
        */

      let box = document.querySelector('#box')
      //注册点击事件
      box.onclick = function (e) {
        console.log(e)
        //pageX/Y : 获取事件触发点 到 页面左上角距离(定位坐标系)
        console.log('pageX:' + e.pageX + ' pageY:' + e.pageY)
      }
    </script>

事件冒泡

      .father {
        width: 300px;
        height: 300px;
        background-color: red;
      }

      .son {
        width: 100px;
        height: 100px;
        background-color: cyan;
      }
    </style>
  </head>
  <body>
    <div class="father">
      <div class="son"></div>
    </div>
    <script>
       /* 
        1.事件冒泡: 当触发子元素的事件时,该子元素的所有“父级元素” 的“同名事件”会依次触发 
            * 事件冒泡现象一直都存在,只是以前没有给父元素注册同名事件
            * 子元素 -> 父元素 -> body -> html -> document -> window        
        */

      let father = document.querySelector('.father')
      let son = document.querySelector('.son')
      
      //子元素
      son.onclick = function () {
        alert('我是son1')
      }

      //父元素
      father.onclick = function () {
        alert('我是father')
      }

      //body
      document.body.onclick = function () {
        alert('我是body')
      }

      //html
      document.documentElement.onclick = function () {
        alert('我是html')
      }

      //document
      document.onclick = function () {
        alert('我是document')
      }

      //window
      window.onclick = function () {
        alert('我是window')
      }
    </script>

事件委托(重点)

  • 事件委托: 给父元素注册事件,委托子元素来处理
  • 事件委托原理:事件冒泡
  • 事件委托注意点 : 不能使用this
      ul.onclick = function (e) {
        /* 
        this : 事件源。 这个事件给谁注册的。
        e.target : 事件触发源。 这个事件触发的源头,到底点击的哪一个子元素触发的这个点击事件。
        */
        alert(e.target.innerText)
      }

事件捕获 1.事件捕获 : 与事件冒泡完全相反。触发子元素的事件时,会先从最顶级父元素window一级一级往下触发。 window -> document -> html -> body -> 父元素 -> 子元素

    2.默认情况下注册的事件都是冒泡类型事件,只有唯一的一种语法可以注册捕获类型事件
addEventListener() : 第三个参数为true
  
      let father = document.querySelector('.father')
      let son = document.querySelector('.son')

      //子元素
      son.addEventListener(
        'click',
        function () {
          alert('我是son1')
        },
        true
      ) //捕获

      //父元素
      father.addEventListener(
        'click',
        function () {
          alert('我是father')
        },
        true
      )

      //body
      document.body.addEventListener(
        'click',
        function (e) {
          alert('我是body')
        },
        true
      )

      //html
      document.documentElement.addEventListener(
        'click',
        function () {
          alert('我是html')
        },
        true
      )

      //document
      document.addEventListener(
        'click',
        function () {
          alert('我是document')
        },
        true
      )

      //window
      window.addEventListener(
        'click',
        function () {
          alert('我是window')
        },
        true
      )
    </script>

事件流三个阶段 事件流三个阶段 : e.eventPhase 获取事件阶段

  1. 捕获阶段
  2. 目标阶段
  3. 冒泡阶段

阻止事件流动 阻止事件流动: e.stopPropagation()

无论是冒泡还是捕捉都可以阻止(停止事件流)

温故而知新