• Web APIs:事件高级--键盘事件,京东按键输入及模拟京东快递单查询案例


    常用的键盘事件

    keydown和keypress的区别是keypress不识别功能键 例如ctrl,shift 

    执行顺序keydown>keypress>keyup

    keyCode判断用户按下哪个键

    keyCode 返回该键的ASCII码

    注意: onkeydown 和 onkeyup 不区分字母大小写,onkeypress 区分字母大小写。

    在我们实际开发中,我们更多的使用keydown和keyup, 它能识别所有的键(包括功能键)

    Keypress 不识别功能键,但是keyCode属性能区分大小写,返回不同的ASCII值

    我按下了小a键,press返回了97,但是keyup不区分大小写,也会触发事件

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. head>
    7. <body>
    8. body>
    9. <script>
    10. document.addEventListener('keyup',function(e){
    11. if(e.keyCode===65){
    12. alert('A')
    13. }else{
    14. alert('其他')
    15. }})
    16. document.addEventListener('keypress',function(e){
    17. console.log('press'+e.keyCode)
    18. }
    19. )
    20. script>
    21. html>

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

    当我们按下 s 键, 光标就定位到搜索

    ① 核心思路: 检测用户是否按下了s 键,如果按下s 键,就把光标定位到搜索框里面

    ② 使用键盘事件对象里面的keyCode 判断用户按下的是否是s键

    ③ 搜索框获得焦点: 使用 js 里面的 focus()方法

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title></title>
    6. </head>
    7. <body>
    8. <input type="text">
    9. <script>
    10. var search=document.querySelector('input');
    11. document.addEventListener('keyup',function(e){
    12. if(e.keyCode===83){
    13. search.focus();
    14. }
    15. })
    16. </script>
    17. </body>
    18. </html>

    这里用的是keyup,因为如果使用keydown或keypress会把s也给输入到文本框中,同时要注意的是给文档设置事件。

     模拟京东快递单号查询

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

    案例分析

    ① 快递单号输入内容时, 上面的大号字体盒子(con)显示这里面的文字

    ② 同时把快递单号里面的值(value)获取过来赋值给 con盒子(innerText)做为内容

    ③ 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子

    ④ 注意: keydown 和 keypress 在文本框里面的特点: 他们两个事件触发的时候,文字还没有落入文本框中。

    ⑤ keyup事件触发的时候, 文字已经落入文本框里面了

    ⑥ 当我们失去焦点,就隐藏这个con盒子 ⑦ 当我们获得焦点,并且文本框内容不为空,就显示这个con盒子

    实现了效果,但是失去,获取焦点还没实现

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>Document</title>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .search {
    14. position: relative;
    15. width: 178px;
    16. margin: 100px;
    17. }
    18. .con {
    19. display: none;
    20. position: absolute;
    21. top: -40px;
    22. width: 171px;
    23. border: 1px solid rgba(0, 0, 0, .2);
    24. box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    25. padding: 5px 0;
    26. font-size: 18px;
    27. line-height: 20px;
    28. color: #333;
    29. }
    30. .con::before {
    31. content: '';
    32. width: 0;
    33. height: 0;
    34. position: absolute;
    35. top: 28px;
    36. left: 18px;
    37. border: 8px solid #000;
    38. border-style: solid dashed dashed;
    39. border-color: #fff transparent transparent;
    40. }
    41. </style>
    42. </head>
    43. <body>
    44. <div class="search">
    45. <div class="con">123</div>
    46. <input type="text" placeholder="请输入您的快递单号" class="jd">
    47. </div>
    48. <script>
    49. // 快递单号输入内容时, 上面的大号字体盒子(con)显示(这里面的字号更大)
    50. // 表单检测用户输入: 给表单添加键盘事件
    51. // 同时把快递单号里面的值(value)获取过来赋值给 con盒子(innerText)做为内容
    52. // 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子
    53. var con = document.querySelector('.con');
    54. var jd_input = document.querySelector('.jd');
    55. jd_input.addEventListener('keyup', function() {
    56. if(this.value==""){
    57. con.style.display='none';
    58. }else{
    59. con.style.display='block';
    60. con.innerHTML=this.value;
    61. }
    62. })
    63. </script>
    64. </body>

     现在有个问题,我们为什么要用keyup而不是keydown

    用keydown事件 

    这种效果是因为我们按下了这个键我们字还没有进去,就执行了这行代码

     完整代码

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>Document</title>
    8. <style>
    9. * {
    10. margin: 0;
    11. padding: 0;
    12. }
    13. .search {
    14. position: relative;
    15. width: 178px;
    16. margin: 100px;
    17. }
    18. .con {
    19. display: none;
    20. position: absolute;
    21. top: -40px;
    22. width: 171px;
    23. border: 1px solid rgba(0, 0, 0, .2);
    24. box-shadow: 0 2px 4px rgba(0, 0, 0, .2);
    25. padding: 5px 0;
    26. font-size: 18px;
    27. line-height: 20px;
    28. color: #333;
    29. }
    30. .con::before {
    31. content: '';
    32. width: 0;
    33. height: 0;
    34. position: absolute;
    35. top: 28px;
    36. left: 18px;
    37. border: 8px solid #000;
    38. border-style: solid dashed dashed;
    39. border-color: #fff transparent transparent;
    40. }
    41. </style>
    42. </head>
    43. <body>
    44. <div class="search">
    45. <div class="con">123</div>
    46. <input type="text" placeholder="请输入您的快递单号" class="jd">
    47. </div>
    48. <script>
    49. // 快递单号输入内容时, 上面的大号字体盒子(con)显示(这里面的字号更大)
    50. // 表单检测用户输入: 给表单添加键盘事件
    51. // 同时把快递单号里面的值(value)获取过来赋值给 con盒子(innerText)做为内容
    52. // 如果快递单号里面内容为空,则隐藏大号字体盒子(con)盒子
    53. var con = document.querySelector('.con');
    54. var jd_input = document.querySelector('.jd');
    55. jd_input.addEventListener('keyup', function() {
    56. if(this.value==""){
    57. con.style.display='none';
    58. }else{
    59. con.style.display='block';
    60. con.innerHTML=this.value;
    61. }
    62. })
    63. // 失去焦点 隐藏con
    64. jd_input.addEventListener('blur',function(){
    65. con.style.display='none';
    66. })
    67. // 获取焦点 显示con
    68. jd_input.addEventListener('focus',function(){
    69. if(this.value!=""){
    70. con.style.display='block';
    71. }
    72. })
    73. </script>
    74. </body>

  • 相关阅读:
    微服务框架 SpringCloud微服务架构 5 Nacos 5.5 服务实例的权重设置
    分享一下 iOS 发布/测试证书 申请过程
    【MySql】mysql之连接查询和存储过程
    连接全球金融网络 探索SCF公链的多元价值
    应用框架层核心目录---/frameworks/base
    【Python机器学习】零基础掌握GaussianProcessRegressor高斯过程
    LeetCode75——Day15
    R语言贝叶斯非参数模型:密度估计、非参数化随机效应META分析心肌梗死数据...
    Scanner、Random、stirng
    抽象 I/O设备模型
  • 原文地址:https://blog.csdn.net/weixin_64612659/article/details/127096688