WebApi编程(四)-BOM

本文介绍了BOM(浏览器对象模型)的核心对象window,详细讲解了window的常见事件,如预加载、窗口大小调整、定时器的使用,并探讨了js执行队列的概念和异步任务处理。此外,还涉及了window对象的location属性用于处理URL,以及两页面之间如何互传值和浏览器类型及历史的检测。

BOM

1.BOM
什么是bom
BOM是浏览器对象模型 ,核心对象是window,提供了与浏览器窗口进行交互的对象。
在这里插入图片描述
window是浏览器的顶级对象,是js访问浏览器的窗口,js所有的全局变量和函数window对象的属性和方法。
2.window常见事件
预加载:
① window.onload = function(){}
实现加载,因为html是按上下顺序执行,如果js代码放在上边就不好用了,可以使用onload预加载
②window.addEventListener(‘DOMContentLoaded’, function () { })
dom加载完就可以,速度比①快

<!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>
        // 由于按顺序执行,所以下面的代码出错,不会弹出
        // var button = document.querySelector('button');
        // button.addEventListener('click', function() {
        //     alert('11');
        // } )
        
        // ①onload方法,等待dom,图片,css等全部加载完
        // 传统方法具有唯一性,起作用只能是最后一个
        window.onload = function() {
            var button = document.querySelector('button');
            button.addEventListener('click', function() {
            alert('11');
        } )
        }

        // 事件监听方法可以绑定多个
        window.addEventListener('load', function () {
            var button = document.querySelector('button');
            button.addEventListener('click', function() {
            alert('131');
        })
        })
        
        window.addEventListener('load', function () {
            var button = document.querySelector('button');
            button.addEventListener('click', function() {
            alert('132');
        })
        
        })
        // ②DOMContentLoaded,等待加载完dom就
        window.addEventListener('DOMContentLoaded', function () {
            alert('22222')
        })
    </script>
    <button>点击</button>
</body>
</html>

调整窗口大小
利用resize事件,当窗口大小发生变化时,就会触发事件。

<!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>
        div {
            width: 200px;
            height: 200px;
            background-color: aqua;
        }
    </style>
</head>
<body>
    <div>

    </div>
    <script>
        // 调整窗口大小resize
        div = document.querySelector('div');
        window.addEventListener('resize', function(){
            console.log('窗口变了!');
            // window.innerWidth 窗口宽度
            if(window.innerWidth < 500) {
                div.style.display = 'none';
            }
        })
    </script>

</body>
</html>

定时器
setTimeout(函数,时间间隔毫秒)
就是过了多长时间执行函数,属于一次性定时器。
clearTimeout()清楚定时器,特定情况下
setInterval(),重复调用

<!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>
        // 一次性定时器,过了5000毫秒,就执行函数(可以写函数名),默认为0
        window.setTimeout(function() {
            alert('时间到了');
        }, 5000)
        // 下面写法也可以
        function sm() {
            console.log('haha');
        }
        var sm1 = setTimeout(sm, 2000);
        var sm2 = setTimeout('sm()', 5000);
        
        // 停止定时器
        clearTimeout(sm2);
		
		// 定时器2 反复调用 setInterval()
        setInterval(function() {
           alert('1'); 
        }, 2000);
        // 同样的也可以停止,clearInterval()
    </script>
</body>
</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>
    <img src="D:\java-script_learning\image\ad.jpg" alt="">
    <script>
        var img = document.querySelector('img');
        function close () {
            img.style.display = "none";
        }
        setTimeout(close, 5000);
    </script>
</body>
</html>
Document 倒计时案例
<!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>
    <div></div>
    <script>
        function re() {
            var div = document.querySelector('div');
            var now = +new Date();
            var target = +new Date('2022-01-01 00:00:00');
            var remain = (target - now) /1000;
            var day = parseInt(remain / 60 / 60 / 24);
            var hours = parseInt(remain / 60 / 60 % 24);
            hours = hours < 10 ? '0' + hours:hours
            var min = parseInt(remain / 60 % 60); 
            min = min < 10 ? '0' + min:min
            var sec = parseInt(remain % 60);
            sec = sec < 10 ? '0' + sec:sec
            var r = '倒计时 :' + day + ' 天 ' + hours + ' 时 ' + min + ' 分 ' + sec + ' 秒 !!!!!' ;           div.style.color = 'red';
            div.innerHTML = r;
        }
        setInterval(re, 1000);
    </script>

</body>
</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>
    手机号<input type="number"> <button>发送验证码</button>
    <script>
        var btn = document.querySelector('button');
        var time = 10;
        btn.addEventListener('click', function() {
            btn.disabled = true;
            var timer = setInterval(function() {
                btn.innerHTML = time + '秒后重试';
                if (time == 0) {
                    clearInterval(timer);
                    btn.innerHTML = '发送验证码';
                    btn.disabled = false;
                    time = 10;
                }else {
                    time = time -1;
                }
            }, 1000);
        })
    </script>
</body>
</html>

3.js执行队列
js是单线程执行,排队进行,不能并发。
为了防止有些任务执行时间长,其他任务需要等待,于是js可以允许进行异步操作。
js先执行同步任务,所有同步任务执行后再去执行异步任务 ,js会把异步任务先交给异步处理程序,异步处理程序在受到相应的操作后放到异步任务队列里,无需操作的异步任务直接放到任务队列
常见异步任务:click,resize,load,error,setInterval(),setTime
4.window对象之location
location.href:获取整个url
location.host:主机
location.serach:搜索条件
location.post:端口
location.pathname:路径
在这里插入图片描述

    <script>
        console.log(window.location.href);
        console.log(window.location.host);
        console.log(window.location.pathname);
    </script>

5.两页面之间互传值
a页面

<!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">
    <button>登录</button>
    <script>
        var input = document.querySelector('input');
        var btn = document.querySelector('button');
        btn.addEventListener('click', function(){
            location.href = 'file:///D:/java-script_learning/WebApi/不同页面传值1.html' + '?name=' + input.value; 
        })
    </script>
</body>
</html>

b页面

<!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>
        div {
            color: brown;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        var div = document.querySelector('div');
        var names = location.search.replace('?', '')
        var ser = names.split('=');
        div.innerHTML = ser[1] + '欢迎你!';
    </script>
</body>
</html>

6.浏览器类型和历史

<!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>
        // 识别手机还是pc
        console.log(window.navigator.userAgent);
        // 浏览器历史前进后退等。
        // 前进
        window.history.forward;
        // 后退
        history.back;
        // 前进固定步数
        history.go(2);
    </script>
</body>
</html>
### Web API、BOM 和 DOM 的区别 #### 定义与范围 Web API 是指一系列由浏览器提供的接口集合,允许开发者通过编程方式与浏览器环境进行交互。它的范畴非常广泛,涵盖了从页面操作到网络请求的各种功能[^3]。具体而言,DOM(Document Object Model)和 BOM(Browser Object Model)都可以看作是 Web API 的子集。 - **DOM (Document Object Model)** DOM 主要关注的是 HTML 或 XML 文档的表现形式及其可操作性。它将整个文档视为一棵树形结构,在这棵树中,每一个节点代表文档的一部分(比如标签、属性或文本)。借助 DOM 接口,开发者能够轻松实现诸如获取特定元素、修改其内容或是为其绑定事件等功能[^1]。 - **BOM (Browser Object Model)** 相较之下,BOM 更侧重于处理整个浏览器窗口的行为特性而非单一网页本身。典型例子包括调整窗口大小、打开/关闭新标签页、读取地理位置信息等等。尽管早期并没有严格意义上的“标准”,但随着 ECMAScript 标准化进程推进,许多原本属于统意义上 BOM 功能已被纳入更广泛的 Web APIs 中[^2]。 #### 技术层面差异对比 | 特性 | DOM | BOM | |-----------------|-----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | **主要作用** | 表达并操控HTML/XML文档结构 | 控制浏览器行为 | | **核心对象** | `document` | `window`, `navigator`, `screen`, etc | | **应用场景举例** | - 获取指定ID的元素<br>- 改变某个DIV的颜色<br>- 添加新的段落到现有页面 | - 打开一个新的弹窗<br>- 检测当前用户的地理坐标 | 得注意的是,虽然理论上我们可以区分二者职责边界清晰与否,但在实际编码过程中往往难以完全分开考虑——因为很多情况下我们需要同时依靠两者完成任务。例如当我们想让某个按钮触发全屏预览图片效果时,既需要用到 DOM 来定位该按钮及目标图像位置,也可能要用到某些来自 BOM 的能力来管理视图切换逻辑[^4]。 最后得一提的是,无论是 DOM 还是 BOM,它们最终都需要通过某种脚本语言去调用才能发挥作用;而在当今主流前端生态系统里,这个角色毫无疑问是由 JavaScript 承担起来的[^5]。 ```javascript // 示例代码展示如何结合使用DOM与BOM function toggleFullScreen(elementId){ let elem = document.getElementById(elementId); // 使用DOM查找元素 if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement) { if(elem.requestFullscreen){ // 利用BOM控制屏幕状态变化 elem.requestFullscreen(); }else{ alert("您的浏览器不支持全屏模式"); } } else { if(document.exitFullscreen){ document.exitFullscreen(); // 结束全屏显示 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值