DOM的学习----事件

了解事件

JavaScript与HTML之间的交互是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间

事件三要素

1.事件源:事件被触发的对象 比如-->按钮对象

2.事件类型:如何触发?触发什么事件?例如鼠标点击,键盘按下等…

3.事件处理程序:通过一个函数赋值的方式

执行事件的步骤

1.获取事件源

2.注册事件(绑定事件)

3.采用函数赋值形式添加事件处理程序

事件冒泡

当子元素和父元素都有事件时,触发子元素事件会向上触发父元素事件,一直到Document


<body>
  <div id="outer">outer
    <div id="center">center
      <div id="inner">inner</div>
    </div>
  </div>
  <script>
    var inner = document.getElementById('inner');
    var center = document.getElementById('center');
    var outer = document.getElementById('outer');
    // 当我们只有一个inner点击方法的时候 我们发现想要实现的效果和我们预期的一样
    inner.onclick = function () {
      console.log('我是inner点击的');
    }
    // 但是当我们给inner的父元素和祖先元素也添加点击事件时 一点击inner 所有祖先元素的事件都会被触发,这就是事件冒泡现象
    center.onclick = function () {
      console.log('我是center点击的');
    }
    outer.onclick = function () {
      console.log('我是outer点击的');
    }
  </script>
</body>

 阻止冒泡:

直接在对应方法中使用event.stopPropagation()便可阻止事件冒泡

事件处理程序

事件处理程序的名字以"on"开头

HTML 事件处理程序

<body>
 <!-- 一 -->
  <button id="btn" onclick="console.log('Clicked')">点我呀</button>
 <!-- 二 -->
  <button onclick="handler()">按钮一</button>
  <script>
    function handler () {
      console.log('按钮一被点击了');
    }
  </script>
</body>

DOM0事件处理程序

<body>
  <button id="btn">点一下</button>
  <script>
    var btn = document.getElementById('btn')
    btn.onclick = function () {
      console.log('按钮被点击了')
    }
  </script>
</body>

DOM2事件处理程序

<body>
  <button id="btn">点击</button>
  <script>
    // 添加事件 
    var btn = document.getElementById('btn')
    btn.addEventListener('click', function () {
      console.log('按钮被点击了')
    })
    // 如果想要移除 得这么添加事件
    var handeler = function () {
      console.log('点击')
    }
    btn.addEventListener('click', handeler)
    //  移除事件
    btn.removeEventListener('click', handeler)
  </script>
</body>

事件对象 

在 DOM 中发生事件时,所有相关信息都会被收集并存储在一个名为 event 的对象中

阻止默认事件得发生

event.preventDefault();

阻止a标签的默认事件的发生

 <a href="https://www.baidu.com">百度一下</a>
  <script>
    // 阻止a标签的默认事件发生
    var a = document.getElementsByTagName('a')[0]
    a.onclick = function () {
      event.preventDefault();
      console.log('被点击了');
    }
  </script>

阻止表单事件的默认行为


  <form action="eef">
    <input type="submit" value="提交" id="inp1">
  </form>
  <script>
    // 阻止表单事件的默认行为
    var input1 = document.getElementById('inp1')
    input1.onclick = function () {
      event.preventDefault();
      console.log('被点击了');
    }
  </script>

事件委托 

点击不同的子元素li,触发不同的事件

事件委托(明明子元素节点自己可以实现的事件委托给父节点)
目的:减少dom操作浏览器的重排和重绘,并且新添加的元素也是有事件的

<ul id="father">
    <li id="li1">去哪</li>
    <li id="li2">吃啥</li>
    <li id="li3">喝啥</li>
  </ul>
 <script>
    // 分别获取三个子元素的节点
    var li1 = document.getElementById('li1')
    var li2 = document.getElementById('li2')
    var li3 = document.getElementById('li3')
    // 子元素的触发事件
    li1.onclick = function () {
      console.log('苏州');
    }
    li2.onclick = function () {
      console.log('想吃火锅');
    }
    li3.onclick = function () {
      console.log('茶百道的草莓奶冻');
    }
</script>

委托后 

<script>
var ulfa = document.getElementById('father')
    ulfa.addEventListener('click', function (event) {
      var target = event.target
      switch (target.id) {
        case 'li1':
          target.innerHTML = '苏州'
          break
        case 'li2':
          target.innerHTML = '想吃火锅'
          break
        case 'li3':
          target.innerHTML = '茶百道的草莓奶冻'
          break
      }
    })
 </script>

例如,利用事件冒泡来完成事件委托

<script>
  window.onload = function () {
    var ul = document.getElementsByTagName('ul')[0]
    var li = document.getElementsByTagName('li')
    ul.onclick = function (event) {
      // 利用事件冒泡
      event.target.style.backgroundColor = 'red'
      console.log(event.target, '事件源');
    }
  }
</script>

<body>
  <ul>
    <li>1个li</li>
    <li>2个li</li>
    <li>3个li</li>
    <li>4个li</li>
    <li>5个li</li>
    <li>6个li</li>
    <li>7个li</li>
    <li>8个li</li>
  </ul>
</body>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值