BOM和DOM

1. 什么是BOM和DOM

到目前为止,我们已经学过了JavaScript的一些简单的语法。但是这些简单的语法,并没有和浏览器有任何交互。

也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DOM相关知识。

JavaScript分为 ECMAScript,DOM,BOM。

BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行“对话”。

DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。

Window对象是客户端JavaScript最高层对象之一,由于window对象是其它大部分对象的共同祖先,在调用window对象的方法和属性时,可以省略window对象的引用。例如:window.document.write()可以简写成:document.write()。

2. window对象

所有浏览器都支持window对象。它表示浏览器窗口。

如果文档包含框架(frame或ifram标签),浏览器会为HTML文档创建一个windows对象,并为每个框架创建一个额外的window对象

没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。

所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。

全局变量是 window 对象的属性。全局函数是 window 对象的方法。

接下来要讲的HTML DOM 的 document 也是 window 对象的属性之一。

一些常用的Window方法:

  • window.innerHeight:浏览器窗口的内部高度
  • window.innerWidth:浏览器窗口的内部宽度
  • window.open():打开新窗口
window.open('https://www.baidu.com','','height=400px,width=400px')  // 指定窗口大小

window.open('https://www.baidu.com','','height=400px,width=400px,left=300px,top=100px')  // 指定窗口大小并且指定打开位置

  • window.close():关闭当前窗口

3. window的子对象

3.1. navigator对象(了解即可)

浏览器对象,通过这个对象可以预判用户所使用的浏览器,包含了浏览器相关信息

navigator.appName  // Web浏览器全称
"Netscape" navigator.appVersion  // Web浏览器厂商和版本的详细字符串
"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" navigator.userAgent  // 客户端绝大部分信息
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" '''
扩展:防爬措施
1.最简单最常用的一个就是校验当前请求的发起者是否是一个浏览器
没有userAgent就不是基于浏览器发送的请求
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
如何破解该措施
在你的代码中加上上面的User-Agent配置即可 // 如果是window子对象,window可以不写 '''
navigator.platform   // 浏览器运行所在的操作系统
"Win32"

3.2. screen对象(了解即可)

屏幕对象,不常用。

一些属性:

  • screen.availWidth - 可用的屏幕宽度
  • screen.availHeight - 可用的屏幕高度

3.3. history对象(了解即可)

window.history 对象包含浏览器的历史。

浏览历史对象,包含了用户对当前页面的浏览历史,但我们无法查看具体的地址,可以简单的用来前进或后退一个页面。(前提当前页面还可以前进或者后退)

history.forward()  // 前进一页
history.back() // 后退一页

3.4. location对象

window.location对象用于获得当前页面的地址(URL),并把浏览器重定向新的页面。常用属性和方法。

window.location
Location {ancestorOrigins: DOMStringList, href: "https://www.cnblogs.com/Dominic-Ji/p/9121560.html", origin: "https://www.cnblogs.com", protocol: "https:", host: "www.cnblogs.com", …} window.location.href
"https://www.cnblogs.com/Dominic-Ji/p/9121560.html" // 获取URL window.location.href='https://www.baidu.com' // 跳转到指定页面 window.location.reload() // 重新加载页面

3.5. 弹出框

可以在 JavaScript 中创建三种消息框:警告框、确认框、提示框。

  • 警告框

    警告框经常用于确保用户可以得到某些信息。

    当警告框出现后,用户需要点击确定按钮才能继续进行操作。

    语法:

alert('确定吗')
undefined
  • 确认框

    确认框用于使用户可以验证或者接受某些信息。

    当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。

    如果用户点击确认,那么返回值为 true。如果用户点击取消,那么返回值为 false。

    语法:

confirm('你确定你要这么做吗')
true
  • 提示框

    提示框经常用于提示用户在进入页面前输入某个值。

    当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。

    如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为 null。

    语法:

prompt('请在下方输入')
"adsfasd"
prompt('请在下方输入','hello world')
"hello world"

4. DOM

查找标签

直接查找

document.getElementById()       根据id获取一个标签
document.getElementsByClassName 根据class属性获取
document.getElementsByTagName 根据标签名获取标签合集 // 注意每个方法返回值都不一样

实例:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><div>    <div id="d1">div>div</div>    <p class="c1">div>p        <span>div>p>span</span>    </p>    <p>div>p</p></div><div>div+div</div></body></html>document.getElementById('d1')<div id=​"d1">​div>div​</div>​document.getElementsByClassName('c1')HTMLCollection [p.c1]document.getElementsByTagName('div')HTMLCollection(3) [div, div#d1, div, d1: div#d1]// 取出元素[]                   document.getElementsByTagName('div')[0]<div>​…​</div>​                   // 赋值给变量方便使用let divEle = document.getElementsByTagName('div')[1]divEle  // <div id=​"d1">​div>div​</div>​'''当你使用变量名指代标签对象时一般都推荐定义成divElepEleaEle'''

注意:

涉及到DOM操作的JS代码应该放在文档的哪个位置。

间接查找

parentElment			父节点标签元素children				所有子标签firsElementChild		第一个字标签元素lastElementChild		最后一个标签元素nextElmentSibling		下一个兄弟标签元素previousElementSibling 	上一个兄弟标签元素divEle.parentElement<body>​…​</body>​let divEle=document.getElementById('d1')divEle.children(3) [div, p.c1, p]0: div1: p.c12: plength: 3[[Prototype]]: HTMLCollectiondivEle.children[1]<p class=​"c1">​…​</p>​"div>p "<span>​div>p>span​</span>​</p>​divEle.firstElementChild<div>​div>div​</div>​divEle.lastChild#textdivEle.lastElementChild<p>​div>p​</p>​divEle.nextElementSibling<div>​div下面的div​</div>​divEle.previousElementSibling<div>​上面的div​</div>​22

节点操作

创建节点

语法:

createElement(标签名)

添加节点

语法:

追加一个子节点(作为最后的子节点)

somenode.appendChild(newnode);

把增加的节点放到某个节点的前边。

somenode.insertBefore(newnode,某个节点);

示例:

var imgEle=document.createElement("img");imgEle.setAttribute("src", "http://image11.m1905.cn/uploadfile/s2010/0205/20100205083613178.jpg");var d1Ele = document.getElementById("d1");d1Ele.appendChild(imgEle);

删除节点:

语法:

获得要删除的元素,通过父元素调用该方法删除。

somenode.removeChild(要删除的节点)

替换节点:

语法:

somenode.replaceChild(newnode, 某个节点);

属性节点

获取文本节点的值:

var divEle = document.getElementById("d1")divEle.innerTextdivEle.innerHTML

设置文本节点的值:

var divEle = document.getElementById("d1")divEle.innerText="1"divEle.innerHTML="<p>2</p>"

attribute操作

var divEle = document.getElementById("d1");divEle.setAttribute("age","18")divEle.getAttribute("age")divEle.removeAttribute("age")// 自带的属性还可以直接.属性名来获取和设置imgEle.srcimgEle.src="..."

示例:

let pEle = document.createElement('p');
let pEle = document.createElement('p')let imgEle = document.createElement('img')imgEle  // <img>​pEle  // <p>​</p>​imgEle.src='1.png'  // "1.png"imgEle  //<img src=​"1.png">​imgEle.username='wyz'  // "wyz" 自定义的属性没办法点方式直接设置imgEle.setAttribute('username','wyz')imgEle  // <img src=​"1.png" username=​"wyz">​imgEle.setAttribute('title','真好看')imgEle  //<img src=​"1.png" username=​"wyz" title=​"真好看">​let divEle = document.getElementById('d1')divEle.appendChild(imgEle)  // <img src=​"1.png" username=​"wyz" title=​"真好看">​#  标签内部添加元素'''创建a标签设置文本添加到标签内部添加到标签内部'''let aEle = document.createElement('a')undefinedaEle<a>​</a>​aEle.href='https://mzitu.com'"https://mzitu.com"aEle.innerText='点我'"点我"aEle<a href=​"https:​/​/​mzitu.com">​点我​</a>​let divEle = document.getElementById('d1')undefinedlet pEle = document.createElement('d2')undefineddivEle.insertBefore(aEle,pEle)divEle.innerHTML='<h1>hahaha</h1>'  # 识别html标签"<h1>hahaha</h1>"divEle.innerText='<h1>hahaha</h1>'  # 不识别html标签"<h1>hahaha</h1>"

获取值操作

语法:

elementNode.value

使用于一下标签:

  • .input
  • .select
  • .textarea

实例

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><input type="text" id="d1"><select name="" id="d2">    <option value="1">苹果</option>    <option value="2">橘子</option>    <option value="3">布哪呢</option></select><textarea id="d3"></textarea><input type="file" id="d4"></body></html># 控制台let divEle = document.getElementById('d1')let sEle = document.getElementById('d2')let tEle = document.getElementById('d3')divEle.value  // "fadsf"sEle.value  // "3"tEle.value  //"dfafd"let fileEle = document.getElementById('d4')fileEle.value  #  获取的只是路径 "C:\\fakepath\\$3LEV0UZNYFI7_5WY8@480F.png"fileEle.filesFileList {0: File, length: 1}0: File {name: "$3LEV0UZNYFI7_5WY8@480F.png", lastModified: 1624371037113, lastModifiedDate: Tue Jun 22 2021 22:10:37 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 11886, …}length: 1[[Prototype]]: FileList             fileEle.files[0]  # 获取文件数据File {name: "$3LEV0UZNYFI7_5WY8@480F.png", lastModified: 1624371037113, lastModifiedDate: Tue Jun 22 2021 22:10:37 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 11886, …}

class的操作

className  获取所有样式类名(字符串)classList.remove(cls)  删除指定类classList.add(cls)  添加类classList.contains(cls)  存在返回true,否则返回falseclassList.toggle(cls)  存在就删除,否则添加

实例

let divEle = document.getElementById('d1')divEle.classList  # 获取标签所有的属性DOMTokenList(3) ["c1", "bg_green", "bg_red", value: "c1 bg_green bg_red"]divEle.classList.remove("bg_red")undefined  # 移除某个类属性divEle.classList.remove("bg_green")undefineddivEle.classList.add('bg_red')undefined  # 添加某个类属性divEle.classList.add('bg_green')undefineddivEle.classList.contains('c1')true  # 验证是否包含某个类属性divEle.classList.contains('c3')falsedivEle.classList.toggle('bg_red')false # 该属性有则删除无则添加divEle.classList.toggle('bg_red')truedivEle.classList.toggle('bg_red')falsedivEle.classList.toggle('bg_red')truedivEle.classList.toggle('bg_red')false

指定CSS操作

let pEle = document.getElementById('d2')pEle.style.color='red'"red"pEle.style.border='3px solid black'"3px solid black"pEle.style.fontSize='24px'"24px"

JS操作CSS属性的规律:

1.对于没有中横线的CSS属性一般直接使用style.属性名即可。如:

obj.style.marginobj.style.widthobj.style.leftobj.style.position

2.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可。如:

obj.style.marginTopobj.style.borderLeftWidthobj.style.zIndexobj.style.fontFamily

事件

达到某个事先设定的条件,自动触发的动作。

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

# 绑定事件的两种方式<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><button onclick="func1()">点我</button><button id="d1">点我</button><script>    // 第一种绑定事件的方式    function func1() {        alert(111)    }    // 第二种绑定事件的方式    let btnEle = document.getElementById('d1');    btnEle.onclick = function () {        alert(222)    }</script></body></html>

常用事件

onclick        当用户点击某个对象时调用的事件句柄。ondblclick     当用户双击某个对象时调用的事件句柄。onfocus        元素获得焦点。               // 练习:输入框onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动)onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.onkeypress     某个键盘按键被按下并松开。onkeyup        某个键盘按键被松开。onload         一张页面或一幅图像完成加载。onmousedown    鼠标按钮被按下。onmousemove    鼠标被移动。onmouseout     鼠标从某元素移开。onmouseover    鼠标移到某元素之上。onselect      在文本框中的文本被选中时发生。onsubmit      确认按钮被点击,使用的对象是form。

事件示例:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><input type="text" id="d1" style="display: block"><button id="d2">开始</button><button id="d3">结束</button><script>    let t = null    // 1 访问页面之后 将访问时间展示在input框中    // 2 动态展示时间    let inputEle = document.getElementById('d1');    function show_time() {        let current_time = new Date();        inputEle.value = current_time.toLocaleString();    }    let btn1Ele = document.getElementById('d2');    let btn2Ele = document.getElementById('d3');    btn1Ele.onclick=function(){        if (!t){            t = setInterval(show_time,1000);        }    }    btn2Ele.onclick=function () {        clearInterval(t);        t=null    }    </script></body></html>

搜索框

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><input type="text"  value="吃饭吗,有粑粑" id="d1"><script>    let iEle = document.getElementById('d1')    iEle.onfocus=function () {        // 将input框内部值去除        iEle.value = ''        // 点value就是获取 等号赋值就是设置    }    // 失去焦点事件    iEle.onblur = function () {        iEle.value = '吃饭吗,有粑粑'    }</script></body></html>

选择省市

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><select name="" id="d1">    <option  disabled selected>请选择省</option></select><select name="" id="d2">    <option  disabled selected>请选择市</option></select><script>    let proEle = document.getElementById('d1');    let cityEle = document.getElementById('d2');    data = {        "安徽省":['合肥市','淮南市','六安市','淮北市'],        '河南省':['商丘市','郑州市','周口市','驻马店'],        '浙江省':['丽水市','杭州市','台州市','温州市'],        '云南省':['大理市','西双版纳','昆明',]};    for (var i in data){        // 将省信息做成一个个option标签 添加到第一个select框中        // 1 创建option标签        let opEle = document.createElement('option');        // 2 设置文本        opEle.innerText = i;        // 3 设置value        opEle.value = i;        // 将创建好的option标签添加到第一个select中        proEle.appendChild(opEle)    }    // 文本域变化事件,change事件    proEle.onchange = function () {        // 先获取用户选择的省        let currentPro = proEle.value;        // 获取对应省的所有市        let currentCityList = data[currentPro];        // 清空市select中所有的option        cityEle.innerHTML = '';        // for循环所有的市 渲染到第二个select中        for (let i=0;i<currentCityList.length;i++){            currentCity = currentCityList[i];            let opEle = document.createElement('option');            opEle.innerText = currentCity;            opEle.value = currentCity            cityEle.appendChild(opEle)        }    }</script></body></html>

window.onload

当我们给页面上的元素绑定事件的时候,必须等到文档加载完毕。因为我们无法给一个不存在的元素绑定事件。

window.onload事件在文件加载过程结束的时候触发。此时,文档中的所有对象都位于DOM中,并且所有图像,脚本,链接和子框架都已完成加载。

注意:.onload()函数存在覆盖现象。

05 BOM与DOM的更多相关文章

  1. JavaScript(核心、BOM、DOM)

    http://www.flyne.org/article/407 JavaScript(核心.BOM.DOM) JavaScript是基于对象和事件驱动的客户端脚本语言.有如下特点: 交互性 安全性( ...

  2. BOM,DOM,ECMAScripts三者的关系

    一:DOM 文档对象模型(DOM)是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口(API) DOM是HTML与JavaScript之间沟通的桥梁.   DOM下,HTM ...

  3. BOM和DOM的区别和关联

    BOM 1. BOM是Browser Object Model的缩写,即浏览器对象模型. 2. BOM没有相关标准. 3. BOM的最根本对象是window. 从1可以看出来:BOM和浏览器关系密切. ...

  4. 实现JavaScript的组成----BOM和DOM

    我们知道,一个完整的JavaScript的实现,需要由三部分组成:ECMAScript(核心),BOM(浏览器对象模型),DOM(文档对象模型). 今天主要学习BOM和DOM. BOM: BOM提供了 ...

  5. BOM和DOM详解

    DOM介绍 D(文档)可以理解为整个Web加载的网页文档,O(对象)可以理解为类似window对象只来的东西,可以调用属性和方法,这里我们说的是document对象,M(模型)可以理解为网页文档的树形 ...

  6. JS中的函数、Bom、DOM及JS事件

    本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...

  7. 从零开始的JS生活(二)——BOM、DOM与JS中的事件

    上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举 ...

  8. 前端之BOM和DOM

    BOM和DOM简介 BOM(Browser Object Model)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”. DOM(Document Object Model)是指 ...

  9. BOM和DOM的区别

    一.BOM和DOM之间的关系图 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象由于window是顶层对象,因此调用它的子对象时可以不显示的指明 ...

随机推荐

  1. 关于 用 js 实现 快照功能

    1.前言 前段时间有个需求,想要 打印一个小票凭证 ,实现这个功能,我首先想到了快照, 就是将数据内容排版好,然后截图或者用其他方式将内容 制作成图片 ,然后下载下来打印即可. 2.探讨 为何不直接以 ...

  2. react中label标签的作用

    当我们点击输入内容触发input焦点的时候,就需要使用到label标签里的htmlFor属性来扩大点击的区域 代码如下:

  3. Linux上天之路(八)之用户和组

    主要内容. 用户创建,删除,修改 密码及密码文件 组创建,删除,修改 组密码及组配置文件 相关文件 Linux用户分类 超级管理员: UID为0 root用户拥有至高无上的命令,root用户不能改名 ...

  4. PPT2010制作翻牌动画

    原文: https://www.toutiao.com/i6492653280676545037/ 新建一张空白幻灯片 选择"插入"选项卡,"插入"功能组,&q ...

  5. spring boot 中使用swagger

    一.pom.xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox ...

  6. c#多进程通讯,今天,它来了

    引言 在c#中,可能大多数人针对于多线程之间的通讯,是熟能生巧,对于AsyncLocal 和ThreadLocal以及各个静态类中支持线程之间传递的GetData和SetData方法都是信手拈来,那多 ...

  7. Windows 和 Ubuntu 的网络能互相 ping 通之后,linux无法上网原因:①路由没设置好,②DNS 没设置好

    确保 Windows 和 Ubuntu 的网络能互相 ping 通之后,如果 Ubuntu 无法上网,原因通常有 2 个:路由没设置好,DNS 没设置好. 如果执行以下命令不成功,表示路由没设置好: ...

  8. 新设备关联Gitlab

    新设备关联Gitlab 1:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果 ...

  9. Cesium中级教程5 - Terrain 地形

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ CesiumJS支持对与水流相关的海洋.湖泊和河流以及全球高分辨 ...

  10. (3)ESP32 Python 制作一个办公室温度计

    因为经常在办公室里面不知道实际室内温度是多少,所以用ESP32做了一个工具来进行温度&湿度的监测.在之前的文章当中,已经完成了ESP32的数据上云工作,如果要进行温度/湿度的检测.从原理上就是 ...