JavaScript【九】JavaScript BOM(浏览器对象模型)

本文涉及的产品
.cn 域名,1个 12个月
简介: JavaScript【九】JavaScript BOM(浏览器对象模型)

🌟前言

哈喽小伙伴们,本文将收录在JavaScript【前端童子功】这个专栏里;这个专栏里边会收录一些JavaScript的基础知识和项目实战;希望大家可以多多支持,你们的支持就是我创作的动力;让我们一起来看看吧🤘

🌟 Bom(浏览器对象模型)

BOM是浏览器对象模型,主要用于管理窗口与窗口之间的通信,核心对象是window

浏览器对象模型(Browser Object Model,简称 BOM)是 JavaScript 的组成部分之一,BOM 赋予了 JavaScript 程序与浏览器交互的能力。


window 对象是 BOM 的核心,用来表示当前浏览器窗口,其中提供了一系列用来操作或访问浏览器的方法和属性。另外,JavaScript 中的所有全局对象、函数以及变量也都属于 window 对象,甚至我们前面介绍的 document 对象也属于 window 对象。

🌟window对象:

🌟属性:

  • innerWidth 浏览器的宽度
  • innerHright 浏览器的高度
  • screen.width 屏幕分辨率的宽度
  • screen.height 屏幕分辨率的高度

🌟 方法:

  • alert() 弹出框
  • prompt() 输入框
  • comfirm() 带有确定取消按钮的对会话框。返回布尔值
  • close() 关闭浏览器
  • open(url) 打开新窗口
  • srtInterval(回调函数,时间ms) 间隔一定的时间重复不断的执行回调函数
  • clearInterval(id) 清除时间函数
  • setTimeout(回调函数,时间ms) 间隔一定的时间只执行一次回调函数
  • clearTimeout(id) 清除时间函数

🌟 获取元素:

document.querySelector(选择器)

🌟 添加点击事件:

元素.onclick=function(){

}

🌟 获取表单的值:用来连接js和html

表单元素.value

🌟 设置普通元素:

元素.innerHTML

🌟 console对象:

浏览器控制台。属于window对象的子对象。window.console

🌟console对象方法

属性 参数 返回值 功能 兼容性
log msg undefined 向 Web 控制台输出一条消息 全部
dir object undefined 打印出对象的所有属性和属性值 >ie8
error msg undefined 向 Web 控制台输出一条错误消息 >ie7
warn msg undefined 向 Web 控制台输出一条警告信息 >ie7
time timerName undefined 启动一个计时器(timer)来跟踪某一个操作的占用时长 >ie10
timeEnd timerName undefined 停止一个通过 console.time() 启动的计时器 >ie10
table tabledata, tablecolumns undefined 用于在控制台输出表格信息。 >ie12

🌟console.log

console.log() 方法用于在控制台输出信息。

该方法对于开发过程进行测试很有帮助。

提示: 在测试该方法的过程中,控制台需要可见 (浏览器按下 F12 打开控制台)。

语法

console.log(message)

参数说明

参数 类型 描述
message String 或 Object 必需,控制台上要显示的信息

🌟 console.time

console.time()console.timeEnd()这两个方法可以用来让WEB开发人员测量一个javascript脚本程序执行消耗的时间。

console.time方法是开始计算时间,console.timeEnd是停止计时,输出脚本执行的时间:

// 启动计时器
console.time('testForEach');
// (测试用代码)
// 停止计时,输出时间
console.timeEnd('testForEach');
// testForEach 4522.303ms

参数说明

参数 类型 描述
label String 可选,用于给计算器设置标签。
tablecolumns Array 可选,一个数组,表格标题栏的名称。

这两个方法中都可以传入一个参数,作为计时器的名称,它的作用是在代码并行运行时分清楚各个计时器。所以两个方法的参数必须相同

console.timeEnd的调用会立即输出执行总共消耗的时间,单位是毫秒

for 循环测试

var i;
console.time("for 循环测试");
for (i = 0; i < 100000; i++) {
  // 代码部分
}
console.timeEnd("for 循环测试");

测试ajax请求所需时间:

console.time("ajax请求时间")
$.ajax({
  url:"https://zhihu-daily.leanapp.cn/api/v1/last-stories",
  success(res){
    console.timeEnd("ajax请求时间")
  }
})
//  ajax请求时间: 189.089111328125ms

🌟console.table

console.table() 方法用于在控制台输出表格信息。

第一个参数是必需的,且对象类型需要是对象或数组,对应的数据会填充到表格中。

提示: 在测试该方法的过程中,控制台需要可见 (浏览器按下 F12 打开控制台)。

语法

console.table(tabledata, tablecolumns)

参数说明

参数 类型 描述
tabledata Array 或 Object 必需,填充到表格中的数据。
tablecolumns Array 可选,一个数组,表格标题栏的名称。
console.table(["king", "lilei", "susan"]);

🌟 location 对象

JavaScript location 对象中包含了有关当前页面链接(URL)的信息,例如当前页面的完整 URL、端口号等,我们可以通过 window 对象中的 location 属性来获取 location 对象。由于 window 对象是一个全局对象,因此在使用window.location时可以省略 window 前缀,例如window.location.href可以简写为location.href。

🌟 location属性

当前文档的地址对象。也是window的子对象,window.location

一个完整的url 包括9个部分 协议://用户名:密码@域名:端口/路径;参数?查询#片段 不过几乎没有哪个url包含这些所有组件,最重要的三部分是协议,域名和路径:

以该url为例:

http://www.baidu.com:80/javascript/?file=001/BOM/README.md/#location对象
协议        域名    |端口号| 路径    |查询字符串|              |哈希|
描述 可读写性 结果
href 包含整个URL的一个字符串 读写 http://www.baidu.com:80/javascript/001/BOM/?file=README.md#location对象
origin 包含页面来源的域名的标准形式字符串 只读 http://www.baidu.com:80
protocol 包含URL对应协议的字符串,最后有一个":" 只读 http:
ost 包含了域名和端口号的字符串,如没有端口号则只有域名 只读 www.baidu.com:80
hostname 包含URL域名的字符串 只读 www.baidu.com
port 包含端口号的字符串 只读 80
pathname 包含URL中路径部分的字符串,开头有一个"/" 只读 /javascript/001/BOM/
search 包含URL参数(查询字符串)的字符串,开头有一个“?” 只读 ?file=README.md
hash 包含块标识符的字符串,开头有一个"#" 只读 #location对象

🌟 location方法

属性 参数 返回值 功能 兼容性
assign url undefined 加载给定URL的内容资源 全部
reload Boolean undefined 重新加载来自当前 URL的资源(刷新本页) 全部
replace url undefined 用给定的URL替换掉当前的资源 全部
toString 包含整个URL的字符串 获取本窗口的url,将地址转换成字符串(只能获取,无法修改,读取效果与location.href相同) 全部

location.assignlocation.replace的区别: replace()替换的新页面不会被保存在会话的历史 History中,这意味着用户将不能用后退按钮转到该页面

location.reload 的参数:

  • false或未写参数:检测服务器上的文档是否已改变。如果文档已改变,reload() 会再次下载该文档。如果文档未改变,则该方法将从缓存中装载文档。这与用户单击浏览器的刷新按钮的效果是完全一样的。
  • true:那么无论文档的最后修改日期是什么,它都会绕过缓存,从服务器上重新下载该文档。这与用户在单击浏览器的刷新按钮时按住 Shift 健的效果是完全一样。

🌟 history 对象

history 对象是 windows子对象。history 接口允许操作浏览器的曾经在标签页或者框架里访问的历史记录,这些方法和事件能够帮助我们优雅的实现单页面应用,同时又不会影响搜索引擎对我们网站的搜录。现在所有的现代浏览器都已经支持这些新的特性,并且涌现出大量的路由框架,都内置集成了这些新的特性。比方说著名的vue框架里面的 vue-route等路由框架。

🌟 history 对象属性


属性 描述 可读写性 兼容性
length 包含当前页面在内的历史记录个数 只读 全部

🌟 history 对象方法

属性 参数 返回值 功能 兼容性
back undefined 加载 history 列表中的前一个 URL(等价于history.go(-1)) 全部
forward undefined 加载 history 列表中的下一个 URL(等价于history.go(1)) 全部
go number undefined 通过当前页面的相对位置从浏览器历史记录加载页面 全部
pushState state, title, url undefined 无刷新的向浏览器 历史最前方 加入一条记录 >ie9
replaceState state, title, url undefined 无刷新的使用一条记录替换当前的历史记录 >ie9

history.go方法

  • history.go(-1): 加载上一个历史记录
  • history.go(1): 加载下一个历史记录
  • history.go(0) 或不传参: 刷新本页 类似地,你可以传递参数值2并向前移动2个页面,等等。
    如果已经没有页面,该方法不会报错,页面不会发生任何变化; 如果参数不是整数,页面也不会发生任何变化。

history.pushStatehistory.replaceState 方法有3个参数

  • 状态对象state —— 需要保存的数据,这个数据在触发popstate事件时保存在event.state
  • 标题title —— 浏览器目前不识别该参数,传入一个空字符串
  • 地址URL —— 需要更改的url地址

window.onpopstate事件: 浏览器点击前进后退(或者在js中调用history.back()history.forward()history.go()方法)时触发的事件。event.state可以获取当前url下设置的state

注:pushStatereplaceState方法只能加载同源下的资url源(存在跨域问题)


window.onpopstate = function (event) {
    console.log("location: " + document.location + ", state: " + JSON.stringify(event.state));
};
//绑定事件处理函数.
history.pushState({ page: 1 }, "title 1", "?page=1");    //添加并激活一个历史记录条目 http://example.com/example.html?page=1,条目索引为1
history.pushState({ page: 2 }, "title 2", "?page=2");    //添加并激活一个历史记录条目 http://example.com/example.html?page=2,条目索引为2
history.replaceState({ page: 3 }, "title 3", "?page=3"); //修改当前激活的历史记录条目 http://ex..?page=2 变为 http://ex..?page=3,条目索引为3
history.back(); // 输出 "location: http://example.com/example.html?page=1, state: {"page":1}"
history.back(); // 输出 "location: http://example.com/example.html, state: null
history.go(2);  // 输出 "location: http://example.com/example.html?page=3, state: {"page":3}

🌟 总结

  • js刷新本页面方法汇总:
  1. history.go(0)
  2. location.reload()
  • js跳转页面方法汇总:
  1. window.open(url)
  2. location.href = “”
  3. location.assign(url)

🌟 Navigator 对象

Navigator 对象包含有关浏览器的信息,是window对象的属性,中文是"导航器"的意思

🌟 Navigator的属性

属性 描述
language 返回当前浏览器的语言 “zh-CN”、"en"等
cookieEnabled 返回指明浏览器中是否启用 cookie 的布尔值 true,false
onLine 返回指明系统是否处于联网状态的布尔值 true,false
platform 返回运行浏览器的操作系统平台。 “Win32”, “Linux i686”, “MacPPC”, “MacIntel”, 等

2023-04-16 (5).png

🌟 检测浏览器

检测浏览器版本:

 function getExplorerInfo() {
    var explorer = window.navigator.userAgent.toLowerCase();
    //ie
    if (explorer.indexOf("msie") >= 0) {
        var ver = explorer.match(/msie ([\d.]+)/)[1];
        return { type: "IE", version: ver };
    }
    else if (explorer.indexOf("edge") >= 0) {
        var ver = explorer.match(/edge\/([\d.]+)/)[1];
        return { type: "Edge", version: ver };
    }
    //firefox
    else if (explorer.indexOf("firefox") >= 0) {
        var ver = explorer.match(/firefox\/([\d.]+)/)[1];
        return { type: "Firefox", version: ver };
    }
    //Chrome
    else if (explorer.indexOf("chrome") >= 0) {
        var ver = explorer.match(/chrome\/([\d.]+)/)[1];
        return { type: "Chrome", version: ver };
    }
    //Opera
    else if (explorer.indexOf("opera") >= 0) {
        var ver = explorer.match(/opera.([\d.]+)/)[1];
        return { type: "Opera", version: ver };
    }
    //Safari
    else if (explorer.indexOf("safari") >= 0) {
        var ver = explorer.match(/safari\/([\d.]+)/)[1];
        return { type: "Safari", version: ver };
    }
}

检测浏览器是否为PC端

function getExplorerType(){
    var explorer = window.navigator.userAgent.toLowerCase();
    return explorer.indexOf('mobile') === -1
}

结果:true PC , false 为 Mobile

检测当前网络状态

//浏览器在线
window.ononline = function(){
    console.log(window.navigator.onLine)
}
//浏览器离线
window.onoffline = function(){
    console.log(window.navigator.onLine)
}

h5相机拍照

<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="jquery.min.js"></script>
        <script>
            window.addEventListener("DOMContentLoaded", function () {
                var canvas = document.getElementById("canvas"),
                    context = canvas.getContext("2d"),
                    video = document.getElementById("video"),
                    videoObj = {
                        "video": true
                    },
                    errBack = function (error) {
                        console.log("Video capture error: ", error.code);
                    };
                $("#snap").click(function () {
                    context.drawImage(video, 0, 0, 330, 250);
                })
                if (navigator.mediaDevices.getUserMedia) {
                    navigator.mediaDevices.getUserMedia(videoObj)
                    .then(function (stream) {
                        video.srcObject = stream;
                        video.play();
                    })
                    .catch(errBack)
                } else if (navigator.webkitGetUserMedia) {
                    navigator.webkitGetUserMedia(videoObj, function (stream) {
                        video.src = window.webkitURL.createObjectURL(stream);
                        video.play();
                    }, errBack);
                }
            }, false);
        </script>
    </head>    
    <body>
        <div id="contentHolder">
            <video id="video" width="320" height="320" autoplay></video>
            <input type="button" id="snap" style="width:100px;height:35px;" value="拍 照" />
            <canvas style="" id="canvas" width="320" height="320"></canvas>
        </div>
    </body>
</html>

🌟 Vibration(震动)

// 可以传入一个大于0的数字,表示让手机震动相应的时间长度,单位为ms
navigator.vibrate(100)
// 也可以传入一个包含数字的数组,比如下面这样就是代表震动300ms,暂停200ms,震动100ms,暂停400ms,震动100ms
navigator.vibrate([300,200,100,400,100])
// 也可以传入0或者一个全是0的数组,表示暂停震动
navigator.vibrate(0)

🌟 用途

使手机震动,用来给用户一个提示,例如说数据校验失败。

🌟写在最后

更多JavaScript知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!

目录
相关文章
|
1月前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
1月前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
1月前
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
104 48
|
1月前
|
JSON 前端开发 JavaScript
JavaScript中对象的数据拷贝
本文介绍了JavaScript中对象数据拷贝的问题及解决方案。作者首先解释了对象赋值时地址共享导致的值同步变化现象,随后提供了五种解决方法:手动复制、`Object.assign`、扩展运算符、`JSON.stringify`与`JSON.parse`组合以及自定义深拷贝函数。每种方法都有其适用场景和局限性,文章最后鼓励读者关注作者以获取更多前端知识分享。
18 1
JavaScript中对象的数据拷贝
|
1月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
|
1月前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
35 1
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
114 1
|
1月前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
2月前
|
Web App开发 JavaScript 前端开发
JavaScript Window - 浏览器对象模型
JavaScript Window - 浏览器对象模型
24 2
|
3月前
|
JavaScript 前端开发
js之浏览器对象|28
js之浏览器对象|28
下一篇
DataWorks