773-780---DOM事件高级(常用鼠标事件,案例:跟随鼠标的天使,常用的键盘事件,案例:模拟京东按键输入内容,案例:模拟京东快递单号查询)

事件高级

7 常用的鼠标事件

鼠标事件说明
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发

7.1常用的鼠标事件

1 禁止鼠标右键菜单
contextmenu 主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单

document.addEventListener('contextmenu',function(e) {
e.preventDefault() ;
})

2 禁止鼠标选中( selectstart开始选中)

document.addEventListener(' selectstart',function(e) {
	e.preventDefault () ;
})
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  我是一段不愿意分享的文字
  <script>
    // 1 contextmenu 禁止鼠标右键菜单
    document.addEventListener('contextmenu',function(e) {
      e.preventDefault();
    })
    // 2 禁止选中文字 selectstart
    document.addEventListener('selectstart',function(e) {
      e.preventDefault();
    })
  </script>
</body>
</html>

7.2 鼠标事件对象

event对象代表事件的状态,跟事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象
MouseEvent和键盘事件对象KeyboardEvent

鼠标事件对象说明
e.clientX返回鼠标相对于浏览器窗口可视区的X坐标
e.clientY返回鼠标相对于浏览器窗口可视区的Y坐标
e.pageX返回鼠标相对于文档页面的X坐标 IE9+ 支持
e.pageY返回鼠标相对于文档页面的Y坐标 IE9+支持
e.screenX返回鼠标相对于电脑屏幕的X坐标
e.screenY返回鼠标相对于电脑屏幕的Y坐标

鼠标相对区域

在这里插入图片描述

eg. 18-鼠标事件对象.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body {
      height: 3000px;
    }
  </style>
</head>
<body>
  <script>
    // 鼠标事件对象 MouseEvent
    document.addEventListener('click',function(e) {
      // 1 client 鼠标在可视区的x和y坐标
      console.log(e.clientX);
      console.log(e.clientY);

      // 1 page 鼠标在页面文档的x和y坐标
      console.log(e.pageX);
      console.log(e.pageY);      
    })
  </script>
</body>
</html>

案例:跟随鼠标的天使

这个天使图片一直跟随鼠标移动

在这里插入图片描述

案例分析:

  1. 鼠标不断的移动 , 使用鼠标移动事件 : mousemove
  2. 在页面中移动 , 给document注册事件
  3. 图片要移动距离 , 而且不占位置 , 我们使用绝对定位即可
  4. 核心原理 : 每次鼠标移动 , 我们都会获得最新的鼠标坐标 , 把这个x和y坐标做为图片的top和left值就可以移动图片
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    img {
      position: absolute;
      top: 2px;
    }
  </style>
</head>
<body>
  <img src="images/angel.gif" alt="">
  <script>
    var pic = document.querySelector('img'); // 获取图片
    document.addEventListener('mousemove',function(e) {
      // 1 mousemove 只要我们鼠标移动1px 就会触发这个事件
      // console.log(1);
      // 2 核心原理 : 每次鼠标移动 , 我们都会获得最新的鼠标坐标 , 把这个x和y坐标做为图片的top和left值就可以移动图片
      var x = e.pageX;   // 得到鼠标在页面文档中的x坐标
      var y = e.pageY;
      console.log('x坐标是' + x ,'y坐标是' + y);
      // 把坐标给图片,使鼠标(坐标)动图片跟着动
      // 3 千万不要忘记给 left 和 top 添加 px 
      pic.style.left = x - 50 + 'px';
      pic.style.top = y - 40 + 'px';
    })
  </script>
</body>
</html>

跟着鼠标移动的天使

这个小天使案例在实际开发可能几乎不会用,但是别的地方会用到这个思路,需要记住。

比如:用鼠标控制贪吃蛇方向

比如:观察下面商品(鼠标移到Q 红色框之后再移动鼠标至左边绿色框区域,那么右边蓝色框区域就会显示放大图)

在这里插入图片描述

8 常用的键盘事件

8.1 常用的键盘事件

事件除了使用鼠标触发,还可以使用键盘触发。

键盘事件触发条件
onkeyup某个键盘按键被松开时触发
onkeydown某个键盘按键被按下时触发
onkeypress某个键盘按键被按下时 触发 但是它不识别功能键比如ctrl shift箭头等

注意:

  1. 如果使用addEventListener不需要加on
  2. onkeypress 和前面2个的区别是 , 它不识别功能键,比如左右箭头, shift等。
  3. 三个事件的执行顺序是: keydown – keypress — keyup

eg 01-常用的键盘事件.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 常用的键盘事件
    // 1 keyup 按键弹起的时候触发
    // document.onkeyup = function() {
    //   console.log('我弹起了');
    // }
    document.addEventListener('keyup', function() {
      console.log('我弹起了');
    })
    // 2 keydown 按键按下的时候触发  能识别功能键比如ctrl shift 箭头等
    document.addEventListener('keydown', function() {
      console.log('我按下了down');
    })   
    // 3 keypress 按键按下的时候触发  但是它不识别功能键比如ctrl shift 箭头等
    document.addEventListener('keypress', function() {
      console.log('我按下了press');
    })
    // 4 三个事件的执行顺序  keydown -- keypress -- keyup
  </script>
</body>
</html>

在这里插入图片描述

8.2 键盘事件对象

键盘事件对象属性说明
keyCode返回该键的ASCII值

注意 : onkeydown和 onkeyup不区分字母大小写 , onkeypress区分字母大小写。
在我们实际开发中,我们更多的使用 keydown 和 keyup,它能识别所有的键(包括功能键)
Keypress 不识别功能键 , 但是keyCode 属性能区分大小写 , 返回不同的ASCI值

8.3 ASCII 表

在这里插入图片描述

eg 02-键盘事件对象之keyCode属性.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 键盘事件对象中的keyCode属性可以得到相应键的ASCII码值
    // 1 我们的keyup 和 keydown 事件不区分字母大小写 a 和 A 得到的都是65
    // 2 我们的keypress 事件区分字母大小写 a 得到 97和 A  65 
    document.addEventListener('keyup',function(e){
      // console.log(e);
      console.log('up:' + e.keyCode);  // eg 按下1 console 显示49
      // 我们可以利用keyCode 返回的ASCII 码值来判断用户按下哪个键
      if(e.keyCode == 65) {
        alert('按下的是 a 键');
      } else {
        alert('没有按下 a 键');
      }
    })
    document.addEventListener('keypress',function(e){
      // console.log(e);
      console.log('press:' + e.keyCode); 
    })

  </script>
</body>
</html>

在这里插入图片描述

案例:模拟京东按键输入内容

要求:当我们按下s键的时候,光标就会直接定位到搜索框,可以直接输入内容

在这里插入图片描述

案例分析

  1. 核心思路 : 检测用户是否按下了s键,如果按下s键,就把光标定位到搜索框里面
  2. 使用键盘事件对象里面的keyCode判断用户按下的是否是s键
  3. 搜索框获得焦点:使用js里面的focus()方法
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="text">
  <script>
    // 1. 核心思路 : 检测用户是否按下了s键,如果按下s键,就把光标定位到搜索框里面
    // 2. 使用键盘事件对象里面的keyCode判断用户按下的是否是s键
    // 3. 搜索框获得焦点:使用js里面的focus()方法
    var search = document.querySelector('input');
    document.addEventListener('keyup',function(e) {   // 此处用keydown 会使输入框按下S 后写入   用keyup 才不会写入
      // console.log(e.keyCode); // 测试一下 s键ASCII  83
      if(e.keyCode == 83) {
        search.focus();
      }
    })
  </script>
</body>
</html>

此处用keydown 会使输入框按下S后 S会写入框中 用keyup 才不会写入

案例:模拟京东快递单号查询

要求 : 当我们在文本框中输入内容时,文本框上面自动显示大字号的内容。

在这里插入图片描述

案例分析

  1. 快递单号输入内容时,上面的大号字体盒子 ( con )显示(这里面的字号更大)
  2. 同时把快递单号里面的值( value )获取过来赋值给con盒子( innerText )做为内容
  3. 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子
  4. 注意 : keydown和keypress在文本框里面的特点 : 他们两个事件触发的时候 , 字还
    没有落入文本框中。
  5. keyup事件触发的时候,文字已经落入文本框里面了
  6. 当我们失去焦点,就隐藏这个con盒子
  7. 当我们获得焦点,并且文本框内容不为空,就显示这个con盒子
<style>
  * {
      margin: 0;
      padding: 0;
  }
  
  .search {
      position: relative;
      width: 178px;
      margin: 100px;
  }
  
  .con {
      display: none;
      position: absolute;
      top: -40px;
      width: 171px;
      border: 1px solid rgba(0, 0, 0, .2);
      box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
      padding: 5px 0;
      font-size: 18px;
      line-height: 20px;
      color: #333;
  }
  
  .con::before {
      content: '';
      width: 0;
      height: 0;
      position: absolute;
      top: 28px;
      left: 18px;
      border: 8px solid #000;
      border-style: solid dashed dashed;
      border-color: #fff transparent transparent;
  }
</style>
<body>
<div class="search">
  <div class="con"></div>
  <input type="text" placeholder="请输入您的快递单号" class="jd">
</div>
<script>
  // 快递单号输入内容时, 上面的大号字体盒子(con)显示(这里面的字号更大)
  // 表单检测用户输入: 给表单添加键盘事件
  // 同时把快递单号里面的值(value)获取过来赋值给 con盒子(innerText)做为内容
  // 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子
  var con = document.querySelector('.con');
  var jd_input = document.querySelector('.jd');
  jd_input.addEventListener('keyup', function() {
      if (this.value == '') {
          con.style.display = 'none';
      } else {
          con.innerText = this.value;
          con.style.display = 'block';
      }
  });
  // 失去焦点隐藏盒子
  jd_input.addEventListener('blur', function() {
      con.style.display = 'none';
  });
  jd_input.addEventListener('focus', function() {
      if (this.value != '') {
          con.style.display = 'block';
      }

  });
</script>
</body>

在这里插入图片描述

注意:用keyup 字会先落入文本框

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值