DOM事件

鼠标事件监听

键盘事件监听

表单事件监听 

常见的页面事件监听

事件传播

事件传播顺序:从内到外(冒泡阶段)onxxx这样写法只能监听冒泡阶段

addEventListener()方法第三个参数如果为true监听捕获阶段,false监听冒泡阶段(默认)

最内层盒子跟书写顺序有关(谁写前面谁就先执行),外面的盒子跟书写顺序无关(结果都是先捕获后冒泡)

事件对象e/event 

使用e.offset属性注意点:内部不能再有比它小的元素,否则位置属性会以小元素左上角为原点

keyCode特殊记忆 

e.preventDefault()方法:阻止事件的默认动作

案例:制作一个文本框,只能让用户在其中输入小写字母和数字,其他字符输入没有效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <p>
    <input type="text" id="field">
  </p>
<script>
  var oField=document.getElementById('field');
  oField.onkeypress=function (e){
    //根据用户输入的字符的字符码(e.charCode)
    //数字0~9,字符码48~57
    //小写字母a~z,字符码97~122
    if (!(e.charCode>=48&&e.charCode<=57||e.charCode>=97&&e.charCode<=122)){
      e.preventDefault();
    }
  }
</script>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #box {
            width: 200px;
            height: 200px;
            background-color: #333;
        }
        body{
            height: 2000px;
        }
    </style>
</head>
<body>
<div id="box"></div>
<h1 id="info">0</h1>

<script>
    var oBox = document.getElementById('box');
    var oInfo = document.getElementById('info');

    // 全局变量就是info中显示的数字
    var a = 0;

    // 给box盒子添加鼠标滚轮事件监听
    oBox.onmousewheel = function (e) {
        // 阻止默认事件:就是说当用户在盒子里面滚动鼠标滚轮的时候,此时不会引发页面的滚动条的滚动
        e.preventDefault();

        if (e.deltaY > 0) {
            a++;
        } else {
            a--;
        }
        oInfo.innerText = a;
    }
</script>
</body>
</html>

e.stopPropagation()阻止事件传播

案例:制作一个弹出层:点击按钮显示弹出层,点击网页任意地方,弹出层关闭

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    #box{
      width: 200px;
      height: 140px;
      background-color: #333;
      position: absolute;
      left: 50%;
      top: 50%;
      margin-left: -100px;
      margin-top: -70px;
      display: none;
    }
  </style>
</head>
<body>
  <button id="btn">点我按钮</button>
  <div id="box"></div>
  <script>
    var oBtn=document.getElementById('btn');
    var oBox=document.getElementById('box');
    // 点击按钮盒子显示
    oBtn.onclick=function (e){
      // 阻止事件继续传播到document身上
      e.stopPropagation();
      oBox.style.display='block';
    }
    // 点击页面任何部分时,盒子关闭
    document.onclick=function (){
      oBox.style.display='none';
    }
    // 点击盒子内部时,不能关闭盒子,应该阻止事件
    oBox.onclick=function (e){
      e.stopPropagation();
    }
  </script>
</body>
</html>

事件委托

批量添加事件监听

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托</title>
</head>
<body>
  <ul id="list">
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
  </ul>
  <script>
    var oList=document.getElementById('list');
    var lis=oList.getElementsByTagName('li');
    //alert(lis.length);
    //批量给元素添加监听
    for(var i=0;i<lis.length;i++){
      lis[i].onclick=function (){
        this.style.color='red';
      }
    }
  </script>
</body>
</html>

每一个事件监听注册都会消耗一定的系统内存,而批量添加事件会导致监听数量太多,内存消耗非常大,实际上,每个<li>事件处理函数都是不同的函数,这些函数本身也会占用内存

新增元素动态绑定事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托</title>
</head>
<body>
<button id="btn">按我添加新的列表项</button>
  <ul id="list"></ul>
  <script>
    var oList=document.getElementById('list');
    var oBtn=document.getElementById('btn');
    //按钮的点击事件
    oBtn.onclick=function (){
      // 创建一个新的li列表项,孤儿节点
      var oLi=document.createElement('li');
      oLi.innerHTML='我是列表项';
      // 上树
      oList.appendChild(oLi);
      // 给新创建的这个li节点添加onclick事件监听
      oLi.onclick=function (){
        this.style.color='red';
      }
    }
  </script>
</body>
</html>

事件委托详解

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托2</title>
</head>
<body>
  <ul id="list">
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
  </ul>
<script>
  var oList=document.getElementById('list');
  oList.onclick=function (e){
    //e.target表示用户真正点击的那个元素
    //e.target.style.color='red';
    //e.currentTarget表示事件处理程序附加到的元素,当前指的是oList
    e.currentTarget.style.backgroundColor='red';
  }
</script>
</body>
</html>

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托2</title>
</head>
<body>
<button id="btn">按我创建一个新列表项</button>
<ul id="list">
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
</ul>
<script>
    var oList = document.getElementById('list');
    var oBtn = document.getElementById('btn');
    oList.onclick = function (e) {
        //e.target表示用户真正点击的那个元素
        e.target.style.color = 'red';
        //e.currentTarget表示事件处理程序附加到的元素,当前指的是oList
        //e.currentTarget.style.backgroundColor='red';
    }

    oBtn.onclick = function () {
        //创建孤儿节点
        var oLi = document.createElement('li');
        //添加内容
        oLi.innerText = '我是新来的';
        //上树
        oList.appendChild(oLi);
    }
</script>
</body>
</html>

onmouseenter:这个属性天生不冒泡的。相当于你事件处理函数附加给了哪个DOM节点,就是哪个DOM节点自己触发的事件,没有冒泡过程。类似于e.currentTarget属性

onmouseover:这个属性天生是冒泡的。 类似于e.target属性

使用事件委托时要注意:不能委托不冒泡的事件给祖先元素

使用事件委托时需要注意的事项

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委托2</title>
</head>
<body>
<button id="btn">按我创建一个新列表项</button>
<ul id="list">
    <li><span>我是</span>列表项</li>
    <li><span>我是</span>列表项</li>
    <li><span>我是</span>列表项</li>
</ul>
<script>
    var oList = document.getElementById('list');
    var oBtn = document.getElementById('btn');
    oList.onclick = function (e) {
        //e.target表示用户真正点击的那个元素
        e.target.style.color = 'red';
        //e.currentTarget表示事件处理程序附加到的元素,当前指的是oList
        //e.currentTarget.style.backgroundColor='red';
    }

    oBtn.onclick = function () {
        //创建孤儿节点
        var oLi = document.createElement('li');
        //添加内容
        oLi.innerText = '我是新来的';
        //上树
        oList.appendChild(oLi);
    }
</script>
</body>
</html>

如果最内层元素li还有额外的元素span,则点击span我是 时候,只会执行我是样式为红色

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值