JavaScript—DOM事件及案例思路总结


前言

代码谁都能敲,但不是谁都会敲。电脑执行有很强的逻辑性,要想把我们所需的效果通过代码表达出来,还需要清楚整个事件的具体过程。
代码已经敲的很多了,但是具体敲代码的逻辑思想才是解题的关键。本文记录了几个案例的编程思想,可以跟随思路在脑海中过一遍代码方法,下面一起来看看吧!


提示:以下是本篇文章正文内容,下面案例可供参考

一、事件概述

JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。
简单理解: 触发— 响应机制。

网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个 事件,然后去执行某些操作。

二、事件三要素

  • 事件源(谁):触发事件的元素
  • 事件类型(什么事件): 例如 click 点击事件
  • 事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数

三、执行事件的步骤

1、获取事件源
2、注册事件(绑定事件)
3、添加事件处理程序(采取函数赋值形式)

案例思路及实现

案例一 分时问候

案例描述
根据不同事件,页面显示不同图片,同时显示不同的问候语
如上午打开页面,显示上午好,显示上午好的图片,以此类推

案例分析
1、根据系统不同事件来判断,所以需要用到日期内置对象
2、利用多分支语句来设置不同图片
3、需要一个图片,并且根据时间修改,需要操作图片元素src属性
4、需要一个div元素,显示不同问候语,根据时间修改元素内容

代码如下(示例):

<body>
    <img src="images/s.gif" alt="">
    <div>上午好</div>
    <script>
        // 获取元素
        var img = document.querySelector('img');
        var div = document.querySelector('div');
        // 得到当前小时数
        var date = new Date();
        var h = date.getHours();
        // 判断小时数改变图片和文字信息
        if(h < 12) {
            img.src = 'images/s.gif';
            div.innerHTML = '上午好';
        }else if (h < 18) {
            img.src = 'images/x.gif';
            div.innerHTML = '下午好';
        }else {
            img.src = 'images/w.gif';
            div.innerHTML = '晚上好';

        }
    </script>   
</body>

案例二 仿京东显示密码

案例描述
点击小眼睛按钮可将密码框切换为文本框,并可以查看密码明文

案例分析
1、核心思路:点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
2、一个按钮两个状态,点击一次,切换为文本框,再点击一次切换为密码框
3、算法:利用一个flag变量,来判断flag的值
如果是1就切换为文本框,flag设置为0;
如果是0就切换为密码框,flag设置为1;

<body>
     <div class="box">
         <label for="">
             <img src="../images/close.png" alt="" id="eye">
         </label>
         <input type="password" name="" id="pwd">
     </div>
    <script>
        // 获取元素
        var eye = document.getElementById('eye');
        var pwd = document.getElementById('pwd');
        // 注册事件  处理程序
        var flag = 0;
        eye.onclick = function(){
            if(flag == 0) {
                pwd.type = 'text';
                eye.scr = '../images/open.png'
                flag = 1;
            }else {
                pwd.type = 'password';
                eye.src = '../images/close.png'
                flag = 0;
            }   
        }

    </script>
</body>

案例三 循环精灵图背景

案例描述
利用for循环设置一组精灵图背景

案例分析
1、首先精灵图排列有规律
2、核心思路:利用for循环修改精灵图片 背景位置background-position
3、计算图片背景位置与y坐标的数学关系
4、让for循环里的i索引号*倍数表示图片的x和y坐标

<script>
        // 获取元素  放精灵图的小li
        var lis = document.querySelectorAll('li');
        for (var i = 0;i < lis.length; i++) {
            // 找到精灵图坐标规律  ,更改index倍数关系;
            var index = i * 44;
            lis[i].style.backgroundPosition = '0 -' + index + 'px';
        }
    </script>

案例四 密码框格式提示错误信息

案例描述
用户离开密码框,里面密码个数或字符不符合规范,则提示错误信息,否则提示输入正确

案例分析
1、首先判断的事件是表单失去焦点 onblur
2、判断输入内容是否正确,提示相关信息
3、因为里面样式变化较多,采取className修改样式

<body>
    <div class="register">
        <input type="password" class="ipt">
        <p class="message">请输入6~16位密码</p>
    </div>
    <script>
        // 1 获取元素 
        var ipt = document.querySelector('.ipt');
        var message = document.querySelector('.message');
        // 2 注册事件 失去焦点
        ipt.onblur = function(){
            // 根据表单长度 ipt.value.length
            if(this.value.length < 6 || this.value.length > 16){
                // console.log('错误');
                message.className = 'message wrong';
                message.innerHTML = '您输入的位数不对要求6~16位';
            }else {
                message.className = 'message right';
                message.innerHTML = '您输入的正确';
            }
        }
    </script>
</body>

案例五 表格隔行变色

案例描述
鼠标在表格哪一行停留,哪一行背景颜色改变便于查看

案例分析
1、用到鼠标事件 鼠标经过onmouseover 鼠标离开onmouseout
2、核心思路:鼠标经过tr行,当前行变换背景颜色,鼠标离开去掉背景颜色
3、注意:表头第一行thead不需要换色,获取tbody里面的行

    <script>
        // 1.获取元素 获取的是 tbody 里面所有的行
        var trs = document.querySelector('tbody').querySelectorAll('tr');
        // 2. 利用循环绑定注册事件
        for (var i = 0; i < trs.length; i++) {
            // 3. 鼠标经过事件 onmouseover
            trs[i].onmouseover = function() {
                    // console.log(11);
                    this.className = 'bg';
                }
                // 4. 鼠标离开事件 onmouseout
            trs[i].onmouseout = function() {
                this.className = '';
            }
        }
    </script>

案例六 全选

案例描述
1、选框一开始默认未选中状态
2、复选框全部选中则全选框也选中,反之亦然
3、再次点击全选框取消全选

案例分析

  1. 全选和取消全选做法: 让下面所有复选框的checked属性(选中状态) 跟随 全选按钮即可
    2、复选框全部选中,全选框才选中做法:给所有的子复选框注册单击事件,每次点击下面的复选框都要循环检查全部复选框是否全被选中,如果有一个没选中则全选不选中
    <script>
        // 1. 全选和取消全选做法:  让下面所有复选框的checked属性(选中状态) 跟随 全选按钮即可
        // 获取元素
        
        var j_cbAll = document.getElementById('j_cbAll'); 
        var j_tbs = document.getElementById('j_tb').getElementsByTagName('input'); 
        // 全选按钮注册事件
        j_cbAll.onclick = function() {
                // this.checked 当前复选框的选中状态
                console.log(this.checked);
                for (var i = 0; i < j_tbs.length; i++) {
                    j_tbs[i].checked = this.checked;
                }
         }
         // 给所有的子复选框注册单击事件
        for (var i = 0; i < j_tbs.length; i++) {
            j_tbs[i].onclick = function() {
                // flag 控制全选按钮是否选中
                var flag = true;
                // 每次点击下面的复选框都要循环检查者4个小按钮是否全被选中
                for (var i = 0; i < j_tbs.length; i++) {
                    if (!j_tbs[i].checked) {
                        flag = false;
                        break; 
                    }
                }
                // 设置全选按钮的状态
                j_cbAll.checked = flag;
            }
        }
    </script>

案例七 tab栏切换

案例描述
鼠标点击tab选项,下面显示对应内容

案例分析
1、Tab栏切换有2个大的模块
2、tab栏选项卡点击后当前样式变化,其余不变,使用排他思想修改类
3、下面的模块内容跟随选项卡变化,写到点击事件里
4、下面模块内容与选项卡一 一对应,相匹配
5、核心思路:给上面的选项小li添加自定义属性索引,属性值从0开始编号
6、当点击小li时,下面对应序号的模块使用排他思想显示内容,其余隐藏

    <script>
        // 获取元素
        var tab_list = document.querySelector('.tab_list');
        var lis = tab_list.querySelectorAll('li');
        var items = document.querySelectorAll('.item');
        // for循环,给选项卡绑定点击事件
        for (var i = 0; i < lis.length; i++) {
            // 开始给5个小li 设置索引号 
            lis[i].setAttribute('index', i);
            lis[i].onclick = function() {
                // 1. 上的模块选项卡,当前这一个底色会是红色,其余不变(排他思想)
                // 干掉所有人 其余的li清除 class 这个类
                for (var i = 0; i < lis.length; i++) {
                    lis[i].className = '';
                }
                // 留下我自己 
                this.className = 'current';
                // 2. 下面的显示内容模块
                var index = this.getAttribute('index');
                console.log(index);
                // 干掉所有人 让其余的item 这些div 隐藏
                for (var i = 0; i < items.length; i++) {
                    items[i].style.display = 'none';
                }
                // 留下我自己 让对应的item 显示出来
                items[index].style.display = 'block';
            }
        }
    </script>

案例八 新浪下拉菜单

案例描述
仿写网页页面下拉菜单

案例分析
1、导航栏里的li要有鼠标经过效果,所以循环注册鼠标事件
2、核心原理: 当鼠标经过,下拉菜单显示,鼠标离开,下拉菜单隐藏

    <script>
        // 1. 获取元素
        var nav = document.querySelector('.nav');
        var lis = nav.children; // 得到4个小li
        // 2.循环注册事件
        for (var i = 0; i < lis.length; i++) {
            lis[i].onmouseover = function() {
                this.children[1].style.display = 'block';
            }
            lis[i].onmouseout = function() {
                this.children[1].style.display = 'none';
            }
        }
    </script>

案例九 简易留言发布

案例描述
制作一个简易留言板,输入内容,点击按钮,新增留言

案例分析
1、核心思路:点击按钮后,动态创建一个小li,添加到ul里
2、创建li的同时,把文本域里的值通过li.innerHTML赋值给li
3、新留言从后面显示就用appendChild,从前面显示就用insertBefore

<body>
    <textarea name="" id=""></textarea>
    <button>发布</button>
    <ul>

    </ul>
    <script>
        // 1. 获取元素
        var btn = document.querySelector('button');
        var text = document.querySelector('textarea');
        var ul = document.querySelector('ul');
        // 2. 注册事件
        btn.onclick = function() {
            if (text.value == '') {
                alert('您没有输入内容');
                return false;
            } else {
                // console.log(text.value);
                // (1) 创建元素
                var li = document.createElement('li');
                // 先有li 才能赋值
                li.innerHTML = text.value;
                // (2) 添加元素
                // ul.appendChild(li);
                ul.insertBefore(li, ul.children[0]);
            }
        }
    </script>
</body>

案例十 留言删除

案例描述
将发布的不良留言删除

案例分析
1、在将文本域里面的值赋值给新增的小li时,多添加一个删除链接
2、需要把所有的链接获取过来,当点击当前删除链接时删除当前链接所在小li
3、阻止链接跳转需要添加 javascript:void(0); 或者 javascript:;

    <textarea name="" id=""></textarea>
    <button>发布</button>
    <ul>
    </ul>
    <script>
        // 1. 获取元素
        var btn = document.querySelector('button');
        var text = document.querySelector('textarea');
        var ul = document.querySelector('ul');
        // 2. 注册事件
        btn.onclick = function() {
            if (text.value == '') {
                alert('您没有输入内容');
                return false;
            } else {
                // console.log(text.value);
                // (1) 创建元素
                var li = document.createElement('li');
                // 先有li 才能赋值
                li.innerHTML = text.value + "<a href='javascript:;'>删除</a>";
                // (2) 添加元素
                // ul.appendChild(li);
                ul.insertBefore(li, ul.children[0]);
                // (3) 删除元素 删除的是当前链接的li  它的父亲
                var as = document.querySelectorAll('a');
                for (var i = 0; i < as.length; i++) {
                    as[i].onclick = function() {
                        // 删除的是 li 当前a所在的li  this.parentNode;
                        ul.removeChild(this.parentNode);
                    }
                }
            }
        }
    </script>

案例十一 跟随鼠标的天使

案例描述
让小天使图片一直跟随鼠标移动

案例分析
1、鼠标移动事件:mousemove
2、在页面中移动,给document注册事件
3、图片要移动距离,且不占位置,使用绝对定位
4、核心原理:每次鼠标移动,获去最新鼠标坐标,把鼠标x和y坐标作为定位图片的left值和top值即可

    <style>
        img {
            position: absolute;
        }
    </style>


<body>
    <img src="../images/angel.gif" alt="">
    <script>
        var pic = document.querySelector('img');
        document.addEventListener('mousemove',function(e){
            // 1、mousemove 鼠标移动1px 就会触发事件
            // 
            // 2、核心原理: 每次鼠标移动,获取最新的鼠标坐标作为定位图片的top和left值
            var x = e.pageX;
            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>

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

案例描述
当我们按下 s 键, 光标就定位到搜索框(文本框获得焦点)。

案例分析
1、核心思路:检测用户是否按下s键,如果按下就把光标定位到搜索框里面
2、使用键盘事件对象里的keyCode判断用户按下的是否是s键
3、搜索框获得焦点:使用js里面的focus()方法
注意:触发获得焦点事件,可以使用 元素对象.focus()

    <input type="text">
    <script>
        // 获取输入框
        var search = document.querySelector('input');
		// 给document注册keyup事件
        document.addEventListener('keyup', function(e) {
            // 判断keyCode的值
            if (e.keyCode === 83) {
                // 触发输入框的获得焦点事件
                search.focus();
            }
        })
    </script>

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

案例描述
当我们在文本框中输入内容时,文本框上面自动显示大字号的内容。

案例分析
1、快递单号输入内容时,上面的大号字体盒子(con)显示这里面的盒子
2、同时把快递单号里面的值(value)获取过来赋值给con盒子(innerText)作为内容
3、如果快递单号里面内容为空,则隐藏盒子
4、注意:keydown 和keypress 在文本框中的特点:事件触发时,文字还未落入文本框中
5、keyup事件触发时,文字已经落入文本框里。所以此案例用keyup比较合适
6、失去焦点时隐藏盒子
7、获得焦点且内容不为空就显示此盒子

    <div class="search">
        <div class="con">123</div>
        <input type="text" placeholder="请输入您的快递单号" class="jd">
    </div>
    <script>
        // 获取要操作的元素
        var con = document.querySelector('.con');
        var jd_input = document.querySelector('.jd');
		// 给输入框注册keyup事件
        jd_input.addEventListener('keyup', function() {
				// 判断输入框内容是否为空
                if (this.value == '') {
                    // 为空,隐藏放大提示盒子
                    con.style.display = 'none';
                } else {
                    // 不为空,显示放大提示盒子,设置盒子的内容
                    con.style.display = 'block';
                    con.innerText = this.value;
                }
            })
        // 给输入框注册失去焦点事件,隐藏放大提示盒子
        jd_input.addEventListener('blur', function() {
                con.style.display = 'none';
            })
        // 给输入框注册获得焦点事件
        jd_input.addEventListener('focus', function() {
            // 判断输入框内容是否为空
            if (this.value !== '') {
                // 不为空则显示提示盒子
                con.style.display = 'block';
            }
        })
    </script>

以上是JavaScript学习过程中的部分案例思路总结及代码实现

总结

思路和算法对刚接触编程的我们来说确实是个难点,当然,已经有很多前辈精简了一些案例的算法,我们需要学习这些算法思想,多敲多练,掌握算法的具体实现,熟能生巧,在今后接触到其他案例时,会自己思考编程思路,找到属于自己的最优算法。

一起加油啊!在发光路上的我们
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值