当前位置: 首页 > news >正文

【Javascript Day19】BOM

目录

BOM对象的方法

定时器方法

短信验证码案例

计时器元素动画

同步代码和异步代码

location对象

跳转查询页面参数

跳转多查询参数


BOM对象的方法

// window.alert("提示");
        // window 中提供的方法和属性,可以在省略window对象的情况下直接调用
        //      BOM对象的属性和方法的使用
        // alert("提示");

        // window.onload = function(){
        //     // 监控BOM对象的资源加载,当资源加载完成后执行
        //     var h1Dom = document.querySelector("#title");
        //     console.log(h1Dom);
        // }

        // window.addEventListener("load",function(){
        //     var h1Dom = document.querySelector("#title");
        //     console.log(h1Dom);
        // })

        window.addEventListener("DOMContentLoaded",function(){
            var h1Dom = document.querySelector("#title");
            console.log(h1Dom);
        })
        window.onresize = function(){
            // 当浏览器窗口发生变化时会执行的事件
            //      监控的时浏览器加载的DOM显示区域的大小变化
            console.log("窗口大小改变了");
        }


        


定时器方法

<input type="button" value="3s内关闭一次性计时器" onclick="closeTimeout()">
    <input type="button" value="关闭周期计时器" onclick="closeTimerInterval()">

    <script>
        // var timer = setTimeout(回调方法,时间ms); 一次性计时器,完成一次执行代码的延迟操作
        //             方法会返回一个计时器控制对象(timer) => 浏览器输出的结果是编号,该值实际上是一个控制对象
        // clearTimeout(计时器对象) : 一次计时器的关闭

        // console.log(1);
        var timer1 = setTimeout(function(){
            // 3秒之后执行
            console.log(2);
        },3000);
        console.log("timer1:",timer1);
        function closeTimeout(){
            clearTimeout(timer1)
        }
        
        
        // var timer = setInterval(回调方法,时间ms); 周期性计时器,在设置的时间间隔上多次执行,需要手动停止
        //             方法会返回一个计时器控制对象(timer) => 浏览器输出的结果是编号,该值实际上是一个控制对象
        // clearInterval(计时器) : 关闭周期性计时器
        var timer2 = setInterval(function(){
            console.log(3);
        },1000);
        console.log("timer2:",timer2);

        function closeTimerInterval(){
            clearInterval(timer2);
        }
    </script>

短信验证码案例

 <input type="text">
    <input type="button" value="获取验证码" id="btn">
    <script>
        var btnDom = document.querySelector("#btn")

        btnDom.addEventListener("click",function getCode(){
            var code = Math.ceil( Math.random()*10000 );
            console.log(code);
            // 禁用按钮 => 视觉禁止
            btnDom.disabled = true;
            var max = 5;
            btnDom.value = max+"s后获取验证码"
            // 彻底删除方法 => 功能禁用
            btnDom.removeEventListener("click",getCode);
            // 倒计时
            // setTimeout(function(){
            //     btnDom.disabled = false;
            //     btnDom.addEventListener("click",getCode)
            // }, 3000);
            var i = 1;
            var timer = setInterval(function(){
                console.log("计时器");
                btnDom.value = (max-i)+"s后获取验证码";
                if(i>=max){
                    btnDom.disabled = false;
                    btnDom.addEventListener("click",getCode);
                    btnDom.value = "获取验证码"
                    clearInterval(timer);
                }
                i++;
            },1000)
        })
    </script>


计时器元素动画

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .ball{
            padding: 0px;
            width: 50px;
            height: 50px;
            background-color: brown;
            border-radius: 50%;
            margin-left: 0px;
            margin-top: 10px;
        }
        .ball1{
            /* 不能分段执行的动画 */
            transition:all 3s ease;
        }
        .right{
            width: 30px;
            height: 30px;
            margin-left: 400px;
            background-color: blueviolet;
            /* display: none; */
            /* visibility: hidden; */
        }

        .ball2{
            animation:move2 3s ease forwards;
        }
        /* @keyframes 时间为主先分段,样式为辅看定义 */
        @keyframes move2 {
            0%{
                /* 0s样式-动画执行前的初始样式 => 可不写 */
                width: 50px;
                height: 50px;
                margin-left: 0px;
                background-color: brown;
            }
            50%{
                /* 1.5s样式 */
                margin-left: 400px;
                width: 30px;
                height: 30px;
                background-color: brown;
            }
            100%{
                /* 3s样式-动画执行后的最终样式 => 可不写  */
                background-color: blueviolet;
                width: 30px;
                height: 30px;
                margin-left: 400px;
            }
        }
    </style>
</head>
<body>
    <input type="button" value="添加样式ball1" onclick="moveFun1()">
    <input type="button" value="添加样式ball2" onclick="moveFun2()">

    <!-- 复习CSS动画 -->
    <!-- CSS动画,通过特性元素规则触发的动画 -->
    <div class="ball ball1" id="ball1"></div>
    <div class="ball" id="ball2"></div>
    <div class="ball ball2" ></div>

    <script>
        function moveFun1(){
            var ballDom = document.querySelector("#ball1");
            ballDom.classList.add("right")
        }
        function moveFun2(){
            var ballDom = document.querySelector("#ball2")
            ballDom.classList.add("ball2")
        }
    </script>

    <hr>
    <input type="button" value="基于计时器的动画" onclick="moveFun3()">
    <div class="ball" id="ball3"></div>
    <!-- 优先CSS -->
    <script>
        function moveFun3(){
            var ballDom = document.querySelector("#ball3");
            // ballDom.style.marginLeft = "100px";
            // setTimeout(function(){
            //     ballDom.style.marginLeft = "101px";
            // },20)
            var start = 0;
            ballDom.style.marginLeft = start+"px";
            var timer = setInterval(function(){
                start++;
                if(start==200){
                    alert("动画执行一半")
                }
                if(start>=400){
                    clearInterval(timer);
                    ballDom.style.display = "none";
                }else{
                    ballDom.style.marginLeft = start+"px";
                }
            },8)
        }
    </script>
</body>
</html>

同步代码和异步代码

 <input type="button" value="执行同步代码" onclick="execFunA()">
    <input type="button" value="执行异步代码" onclick="execFunB()">

    <script>
        // 同步代码:代码按照顺序执行,前置代码没有完成,后续代码无法执行
        // console.log(1);
        // console.log(2);
        // console.log(3);
        // var res = num + 10;
        // console.log(4);
        // console.log(5);
        // console.log(6);
        // console.log(7);
        function execFunA(){
            console.log(1);
            console.log(2);
            console.log(3);
            var res = num + 10;
            console.log(4);
            console.log(5);
            console.log(6);
            console.log(7);
        }

        // 异步代码:按照代码顺序加载代码,但代码会延迟执行,且不会影响后续代码的执行
        //          异步内部的执行代码依然同步规则
        //          异步代码的回调方法,无法通过 return 返回结果
        // console.log(11);
        // console.log(22);
        // setTimeout(function(){
        //     console.log("计时器异步代码1");
        //     var res2 = arg + 10;
        //     console.log("计时器异步代码2");
        // },1000);
        // console.log(33);
        // console.log(44);
        
        function execFunB(){
            console.log(11);
            console.log(22);
            setTimeout(function(){
                console.log("计时器异步代码1");
                var res2 = arg + 10;
                console.log("计时器异步代码2");
            },1000);
            console.log(33);
            console.log(44);
        }

    </script>


location对象

   <h1 id="abc">头部</h1>
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
    <a href="#abc">回到顶部</a>
    <h1 id="end">底部</h1>
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
    <script>
        // location 对象记录当前页面在浏览器地址中的指向路径
        //          地址指向路径 => 域名
        // 域名的组成 => URL 统一资源定位符
        //    protocol: // hostname[:port] / path / path / resource #anchor  ?query
        //     协议:     //  域名(ip:端口) /         路径-资源         #锚点     ?参数
        // 
        //    + 协议://域名(ip:端口)/路径-资源   => 访问指定服务器的相关文件
        //    + #锚点   => 将访问的HTML页面滚动到对应的ID指向的标签
        console.log(location);
        function gotoPage(){
            var num = Math.random();
            console.log(num);
            if(num>0.5){
                // 改变浏览器窗口的地址
                location.href = "https://www.baidu.com";
            }
        }
        
    </script>

    <hr>
    <input type="button" value="切换页面" onclick="gotoPage()">
    <br><br>
    <!-- 参数 不合法 -->
    <a href="./16.跳转查寻参数页面.html?第一段文本">跳转到 16.跳转查寻参数页面.html-第一段文本</a>
    <br>
    <a href="./16.跳转查寻参数页面.html?第二段文本">跳转到 16.跳转查寻参数页面.html-第二段文本</a>
    <br>
    <!-- 
        参数规则和格式
          ?名称1=参数1&名称2=参数2&……
          ?key=value&key=value

        地址和参数之间通过 ? 分割
        参数和参数之间通过 & 分割
        参数名和参数值之间通过 = 分割
    -->
    <a href="./16.跳转多查询参数.html?name=张三&age=23">跳转到 16.跳转多查询参数.html?name=张三&age=23</a>

跳转查询页面参数


 <h3>跳转到页面,用于参数解析</h3>
    <h4 id="title">内容-????</h4>
    <script>
        console.log(location);
        console.log(location.href);
        console.log( decodeURI(location.href) );

        // location.search 当前页面访问时,地址栏中?后续的参数数据
        //    => location 中记录的数据不能出现非英文和符号以外其它字符
        //                如果存在其它字符串,该字符会被编码成ISO8859-1规则
        //                提供解码和编码方法
        //                  decodeURI( 编码后的字符 ) 解码都只会对不地址栏不识别的字符进行操作
        //                  encodeURI( 原始字符 ) 编码都只会对不地址栏不识别的字符进行操作
        console.log(location.search);
        var word = decodeURI( location.search );
        console.log(word);
        word = word.replace("?","");
        console.log(word);
        
        var titleDom = document.querySelector("#title");
        titleDom.innerHTML = "内容-" + word;

    </script>


跳转多查询参数

<h1>解析参数</h1>
    <script>
        // 获取地址参数,并解码
        var search = decodeURI( location.search );
        console.log(search);
        // 删除参数开始的 ? 分割符
        search = search.replace("?","");
        // 分割多个参数
        var params = search.split("&");
        console.log(params);

        var obj = {};
        for (var i = 0; i < params.length; i++) {
            var p = params[i].split("=");
            console.log(p);
            console.log(p[0]);
            console.log(p[1]);
            obj[ p[0] ] = p[1];
        }
        console.log(obj);
        
    </script>

相关文章:

  • Springboot + Ollama + IDEA + DeepSeek 搭建本地deepseek简单调用示例
  • deepseek-r1系列模型部署分别需要的最低硬件配置
  • 4.7 模型训练基类Trainer:Hugging Face工业级训练引擎深度剖析
  • windows事件倒计时器与提醒组件
  • 4.6 模型训练基类Trainer:Hugging Face工业级训练引擎深度剖析
  • java数据结构_优先级队列(堆)_6.1
  • 挖掘图片的秘密:如何用piexif提取和修改Exif数据
  • 当我问Deepseek:国产8K摄像机有哪些?
  • WebSocket(WS)协议系列(二)事件机制
  • 防泄密软件可以管理电脑的使用,还能防止数据泄漏... 原创
  • 使用Catcho阻止app闪退
  • Docker 在微服务架构中的应用(一)
  • HTML5 面试题
  • 程序员学英文之At the Hotel
  • Redis存储⑨Redis的持久化_RDB和AOF
  • 二、《重学设计模式》-UML类图
  • 在虚拟机中搭建Spark学习环境的完整指南
  • priority_queue创建堆
  • Vue3.5 企业级管理系统实战(七):Sidebar组件开发 1
  • 1-18 GIT设置公钥
  • 体坛联播|博洛尼亚时隔51年再夺意杯,皇马逆转马洛卡
  • 【社论】公平有序竞争,外卖行业才能多赢
  • 专访|茸主:杀回UFC,只为给自己一个交代
  • 成都警方通报:8岁男孩落水父母下水施救,父亲遇难
  • 中拉论坛部长级会议为何悬挂海地和圣卢西亚的国旗?外交部回应
  • 牛市早报|中美日内瓦经贸会谈联合声明公布