首页 > 其他分享 >BOM和DOM

BOM和DOM

时间:2024-03-24 17:11:38浏览次数:17  
标签:浏览器 DOM 元素 获取 window let BOM document

【一】什么是BOM/DOM

  • BOM,浏览器对象模型,它使得JavaScript有能力与浏览器进行对话
  • DOM,文档对象模型,可以通过它访问HTML文档的所有元素
  • 他们是JavaScript与浏览器以及网页内容进行交互的核心

【1】BOM

概述

  • 浏览器对象模型(BOM)则是浏览器提供的API集合,主要用于处理与浏览器环境相关的任务,如窗口管理、导航、cookie、location等。

示例

-- 打开新的浏览器窗口
window.open('https://www.baidu.com','','height=400px,width=400px') 

-- 获取当前页面的URL地址
window.location.href

-- 返回历史记录中的上一页
window.history.back()

-- 获取浏览器信息
navigator.userAgent

【2】DOM

概述

  • 文档对象模型(DOM)是一个编程接口,它以树状结构来表示 HTML 或 XML 文档。
  • 在 DOM 中,每个HTML元素、属性、文本节点等都被视为一个对象,通过JavaScript可以创建、查询、修改和删除这些对象。

示例

-- 通过元素ID获得DOM元素对象
document.getElementById('d1')

-- 根据CSS选择器或伪类选择DOM元素对象。
element.querySelector/pseudo-class

-- 向指定元素添加子元素。
element.appendChild(newElement)

-- 设置元素属性值。
element.setAttribute(name, value)

-- 获取或设置元素内的文本内容或HTML内容
element.innerText/innerHTML

【3】总结

  • DOM 和 BOM 是 JavaScript 开发中两个不可或缺的部分,分别负责对网页内容和浏览器环境进行深层次的操作,使得前端开发者能够实现丰富的交互功能和动态效果。

【二】Window对象

  • Window对象是JavaScript中表示浏览器窗口的全局对象,它提供了一系列方法来操作和管理窗口。

【1】open()

  • 打开新窗口或者获取对一个已经存在的窗口的引用。
  • 第一个参数是目标网址,第二个参数可以为空,第三个参数为窗口的大小
window.open('https://www.baidu.com','','width=400px,height=400px')

【2】close()

  • 关闭当前窗口

【3】setTimeout()

  • 在指定的时间延迟后执行一次指定的函数或这一段代码
setTimeout(function index() {
    console.log('hello word')
},300)

【4】setInterval()

  • 以固定的时间间隔重复执行指定的函数或者一段代码
setInterval(function(){
    console.log('hello word')
},3000)

【5】alert()

  • 显示一个带有确定按钮和消息的警告框
window.alert('你不要过来啊')

【6】confirm()

  • 显示一个带有指定消息和两个按钮(确认和取消)的对话框。
  • 点击确认返回true
  • 点击取消返回false
window.confirm('你好吗')

【7】prompt()

  • 显示一个带有指定消息和一个文本输入框的对话框。
  • 点击确认后会返回输入框里面的内容
window.prompt('你叫什么名字')

【8】innerHeight属性

  • 返回浏览器窗口的内部高度(即视口的高度),以像素为单位,不包括浏览器的工具栏、滚动条等元素。
window.innerHeight
906

【9】innerWidth属性

  • 返回浏览器窗口的内部宽度(即视口的宽度),以像素为单位,不包括浏览器的工具栏、滚动条等元素。
window.innerWidth
1707

【三】Window子对象

  • 如果是window的子对象,window可以不写

【1】window.document

  • 此子对象表示当前窗口中的文档对象,用于对页面内容进行读取和修改操作。
  • 通过 window.document,可以使用各种方法来查询和修改当前页面的 HTML 结构、CSS 样式和 DOM 元素。
var divEle = document.getElementById('d1')

【2】window.location

  • 此子对象包含有关当前页面 URL 的信息,并提供了一些与页面导航相关的方法。
  • 通过 window.location,可以获取当前页面的 URL、查询字符串参数、路径等信息,并且可以使用一些方法来导航到其他页面。
window.location
Location {ancestorOrigins: DOMStringList, href: 'http://localhost:63342/python28/%E5%89%8D%E7%AB%AF…258j31kgcq6oe8abplj7uvs&_ij_reload=RELOAD_ON_SAVE', origin: 'http://localhost:63342', protocol: 'http:', host: 'localhost:63342', …}

// 获取当前页面的完整 URL(包括协议、域名、路径等)。
window.location.href*

// 获取当前页面的协议部分(例如 'http:' 或 'https:')。
window.location.protocol

// 获取当前页面的主机(域名和端口号)部分。
window.location.host

// 获取当前页面的主机名部分。
window.location.hostname

// 获取当前页面的端口号部分。
window.location.port

// 获取当前页面的路径部分。
window.location.pathname

// 获取当前页面的查询参数部分(即 URL 中问号后面的内容)。
window.location.search

// 获取当前页面的片段标识部分(即 URL 中井号后面的内容)。
window.location.hash

// 将当前页面重定向到指定的 URL。
window.location.assign("http://example.com");

// 重新加载当前页面。
window.location.reload()*

【3】window.history

  • 此子对象用于操作浏览器的历史记录,包括向前和向后导航
// 返回当前会话的历史记录条目数。
window.history.length

// 加载上一个历史记录。相当于用户点击浏览器的后退按钮。
window.history.back()*

// 加载下一个历史记录。相当于用户点击浏览器的前进按钮。
window.history.forward()*

// 根据传入的整数参数,加载相对于当前历史记录的某个条目。负数表示后退,正数表示前进, 表示重新加载当前页。
window.history.go()

// 向浏览器历史记录中添加新的状态,并且不会触发页面的重新加载。它接受三个参数:state、title 和 URL。
window.history.pushState({ page: 1 }, "Page 1", "/page1.html");

// 替换当前的历史记录状态,不会触发页面的重新加载。它接受三个参数:state、title 和 URL。
window.history.replaceState({ page: 2 }, "Page 2", "/page2.html");

【4】window.navigator

  • 此子对象用于提供有关浏览器环境和设备的信息,包括用户代理字符串、浏览器版本、操作系统等。
// 返回浏览器的用户代理字符串,该字符串包含了有关浏览器厂商、版本号以及操作系统等信息。
window.navigator.userAgent*
    
// 返回操作系统平台,如 "Win32"、"MacIntel" 等。
window.navigator.platform*

// 返回浏览器的厂商或供应商名称。
window.navigator.vendor;

// 返回浏览器的首选语言,通常是用户操作系统的默认语言。
window.navigator.language;

// 返回一个布尔值,表示浏览器是否启用了 cookie。
window.navigator.cookieEnabled;

// 返回一个包含浏览器插件列表的 PluginArray 对象。
window.navigator.plugins;

【四】弹出框

  • 弹出框是网页开发中常用的交互组件,用于显示警告、确认或提示信息,并与用户进行互动。
  • 常见的弹出框类型包括警告框、确认框和提示框。
// 警告框
alert("这是一个警告框!");

// 确认框
confirm("你确定要删除吗?")

// 提示框
prompt("请输入您的姓名:", "默认值");

【五】计时器

  • 计时器在网页开发中经常用于实现定时触发某些操作的功能。
  • 根据需求,可以使用不同的方法来触发定时器。

【1】过一段时间触发(setTimeout)

  • 如果需要在经过一定的时间后触发某个操作
  • 就可以使用setTimeout函数来设置定时器
  • 时间参数的单位为毫秒
setTimeout(function index() {
    console.log('hello word')
},3000)

【2】每隔一段时间触发一次(setInterval)

  • 如果需要每隔一段时间就执行一段代码
  • 就可以使用setInterval函数来设置定时器
setInterval(function index() {
    console.log('hello word')
},3000)

【3】清除定时器(clearTimeout/clearInterval)

  • 用于清除计时器函数
var timer = setTimeout(function() {
  // 在延迟后执行的操作
}, 5000); // 延迟5秒后执行

// 如果需要取消定时器
clearTimeout(timer);
-------------------------------------------
var timer = setInterval(function() {
  // 每隔一段时间执行的操作
}, 2000); // 每2秒钟执行一次

// 如果需要取消定时器
clearInterval(timer);

【六】查找标签

  • 直接查找标签和间接查找标签是在Web开发中常用的两种方式。
  • 操作页面的时候需要用到document对象

【1】直接查找标签

// 根据元素的ID属性直接获取到对应的HTML元素。
var divEle = document.getElementById('d1')

// 根据标签名称获取匹配的所有元素。注意这里拿到的是一个数组
document.getElementsByTagName('div')

// 根据类名获取匹配的所有元素。注意这里拿到的是一个数组
document.getElementsByClassName('d3')

【2】间接查找标签

// 父节点标签元素
parentElement

//父节点标签元素
parentElement     

// 所有子标签
children      

// 第一个子标签元素
firstElementChild  

// 最后一个子标签元素
lastElementChild   

// 下一个兄弟标签元素
nextElementSibling  

// 上一个兄弟标签元素
previousElementSibling   

【七】节点操作

  • 节点操作是指文档对象模型DOM对节点进行创建,获取,修改,删除等操作

【1】创建节点

// 创建一个具有指定标签名的元素节点。
document.createElement('img')

// 创建一个包含指定文本内容的文本节点。
document.createTextNode('你好啊')

// 创建一个空的文档片段节点,可用于高效地插入多个节点。
createDocumentFragment()

【2】获取节点

// 根据元素的id属性获取对应的元素节点。
getElementById(id)

// 根据元素的标签名获取一组元素节点。
getElementsByTagName(tagName)

// 根据元素的类名获取一组元素节点。
getElementsByClassName(className)

// 使用CSS选择器获取匹配的第一个元素节点。
querySelector(selector)

// 使用CSS选择器获取匹配的所有元素节点。
querySelectorAll(selector)

【3】修改节点

// 将一个节点作为父节点的最后一个子节点添加到指定节点。
node.appendChild(childNode)

// 从父节点中移除指定子节点。
parent.removeChild(childNode)

// 使用新节点替换旧节点。
node.replaceChild(newNode, oldNode)

// 在参考节点之前插入新节点。
node.insertBefore(newNode, referenceNode)

【4】属性操作

// 获取指定属性的值。
element.getAttribute(attribute)

// 设置指定属性的值。
element.setAttribute(attribute, value)

// 移除指定属性。
element.removeAttribute(attribute)

【5】文本操作

// 获取或设置节点的文本内容。
node.textContent

// 获取或设置节点的HTML内容。
node.innerHTML:

案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="d1">div1
  <p>p1</p>
  <span id="s1">span1</span>
</div>
</body>
</html>
// 通过DOM操作动态的创建img标签
  let imgEle = document.createElement('img')
  let divEle = document.getElementById('d1')
  imgEle.src='111.png'
  divEle.appendChild(imgEle)
  imgEle.setAttribute('name','green')
  imgEle.setAttribute('title','妹子')
// 设置a标签在p标签上面
<script>
    let divEle = document.getElementById('d1')
    let aEle = document.createElement('a')
    let pEle = document.getElementById('p1')
    aEle.setAttribute('href', 'https://www.baidu.com')
    aEle.innerText='跳转百度'
    divEle.insertBefore(aEle,pEle)
</script>

【八】获取值操作

【1】获取属性值

  • 可以使用getAttribute()方法来获取HTML元素的属性值。
  • 该方法需要传入属性名作为参数,并返回属性对应的值。
let srcValue = aEle.getAttribute('href')

【2】获取文本内容

  • 可以使用innerTextinnerHTMLtextContent属性来获取一个元素的文本内容。
  • 这些属性会返回元素内包含的文本,但存在一些差异:
  • innerText:返回元素的纯文本内容,不包括HTML标记。
  • innerHTML:返回元素的HTML内容,包括HTML标记。
  • textContent:返回元素及其所有子元素的文本内容,包括隐藏元素和注释等。
divEle.innerHTML
'div1\n    <p>p1</p>\n    <span id="s1">span1</span>\n<a href="https://www.baidu.com">跳转百度</a>'

divEle.innerText
'div1\n\np1\n\nspan1 跳转百度'

divEle.textContent
'div1\n    p1\n    span1\n跳转百度'

【3】获取用户输入值

  • 对于表单元素(如input、select、textarea等)
  • 可以通过获取其value属性来获取用户输入的值。
inputEle.value // '这是输入的内容'

【4】获取文件

  • 当用户选择了一个或者多个文件之后
  • 通过files属性可以获取这些文件的信息
  • files属性返回一个filelist对象
fileEle.files

【九】属性操作

【1】class属性操作

介绍

  • .classList() 是JavaScript中用于获取HTML元素的类名列表的方法。
  • 它返回一个DOMTokenList对象,该对象包含了元素的所有类名。

使用示例

let divEle = document.getElementById('d4')
divEle.classList // ['c1', 'bg_green', 'bg_red', value: 'c1 bg_green bg_red']

// 添加类名
classList.add("newClass");

// 移除类名
classList.remove("oldClass");

// 切换类名(如果存在则移除,否则添加)
classList.toggle("active");

注意事项

  • classList是只读的,不能直接赋值。
  • classList是一个动态的列表,会实时反映元素的当前类名状态。
  • 可以通过遍历classList来访问每个类名,或者使用length属性获取类名数量。
  • classList方法在大多数现代浏览器中都得到了支持。
  • 如果需要兼容旧版浏览器,可以考虑使用polyfill库来模拟classList功能。

【案例】标签样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #d4 {
            width: 300px;
            height: 300px;
            border-radius: 50%;
        }

        .bg_red {
            background-color: red;
        }

        .bg_green {
            background-color: greenyellow;
        }
    </style>
</head>
<body>
<div id="d1">div1
    <p id="p1">p1</p>
    <div id="d4" class="c1 bg_green bg_red"></div>
</div>
<script>

</script>
</body>
</html>

类属性操作

// 获取div标签
let divEle = document.getElementById("d4");

// 查看当前标签下的所有类
divEle.classList

// 移除某个类
divEle.remove('bg_green)
              
// 添加某个类
divEle.remove('bg_green)
              
// 校验当前标签下是否包含某个属性 返回直接是true或false
divEle.classList.contains("d1")         

// 当前标签下有这个属性则移除,没有这个属性则添加
divEle.classList.toggle("bg_red");

标签样式操作

  • 通过.style设置样式
// 获取标签
let pEle = document.getElementById('p1')

// 设置颜色
pEle.style.color = 'red'

// 设置字体大小
pEle.style.fontSize = '48px'

// 设置背景颜色
pEle.style.backgroundColor = 'pink'

【十】事件

  • 事件是指程序执行期间发生的特定操作或者状态变化
  • 事件可以来自用户的交互操作(如鼠标点击,鼠标移动等),也可以是其他元素或系统发出的通知(如定时器到期、网络请求完成等)。
  • 事件触发后,程序可以执行相应的处理函数来响应事件并做出相应的操作。

【1】鼠标事件

  • click:鼠标点击事件。
  • mouseover:鼠标悬停在元素上的事件。
  • mouseout:鼠标离开元素的事件。
  • mousedown:鼠标按下事件。
  • mouseup:鼠标松开事件。
  • mousemove:鼠标移动事件。

【2】键盘事件

  • keydown:键盘按下事件。
  • keyup:键盘松开事件。
  • keypress:键盘按键被按下并松开事件。

【3】表单事件:

  • submit:表单提交事件。
  • change:表单值改变事件。
  • focus:表单元素获取焦点事件。
  • blur:表单元素失去焦点事件。

【4】文档加载事件:

  • load:页面完全加载完成事件。
  • unload:页面关闭或离开事件。

【5】定时器事件

  • setTimeout:在指定的延迟时间后触发事件。
  • setInterval:每隔一定时间触发事件。

【6】自定义事件:

  • 开发者可以根据需要创建自定义事件,并使用dispatchEvent来触发事件。

【十一】绑定事件的两种方式

【1】传统的事件属性绑定

  • 通过在HTML标签内直接添加事件属性来实现事件的绑定
    <button onclick='index()'>点我</button>
<script>
 function index(){
     alert('你好')
 }
</script>

【2】现代的事件监听绑定

  • 通过JavaScript代码动态的选择元素,并以代码方式绑定事件监听器
  • HTML和JavaScript代码会分离,提高了代码的可读性和可维护性。
let btnEle = document.getElementById('d5')
btnEle.addEventListener('click',function (){
    alert('你好')
})

案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #d4 {
            width: 300px;
            height: 300px;
            border-radius: 50%;
        }

        .bg_red {
            background-color: red;
        }

        .bg_green {
            background-color: greenyellow;
        }
    </style>
</head>
<body>
<div id="d1">div1
    <p id="p1">p1</p>
    <span id="s1">span1</span>
    <input type="text" id="d2" value="你好啊">
    <input type="file" id="d3">
    <div id="d4" class="c1 bg_green bg_red"></div>
    <button id="d5">开关</button>
</div>
<script>

</script>
</body>
</html>
// 开关灯案例
let btnEle = document.getElementById('d5')
let divEle = document.getElementById('d4')
// 方法1
btnEle.onclick = function (){
    divEle.classList.toggle('bg_green')
}

// 方法2
btnEle.addEventListener('click',function (){
    divEle.classList.toggle('bg_green')
})
// input框获取焦点,失去焦点案例

let inputEle = document.getElementById('d2')
inputEle.onblur = function (){
    inputEle.value = '你好啊'
}
inputEle.onfocus = function (){
        inputEle.value = ''
}

// 动态展示时间案例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>

    </style>
</head>
<body>
<div id="d1">div1

    <input type="text" id="d2" style="display: block;width: 300px;height: 40px" >
    <button id="d3">开始</button><button id="d4">结束</button>
</div>
<script>
    let t = null
    let inputEle = document.getElementById('d2')
    let startBtnEle = document.getElementById('d3')
    let endBtnEle = document.getElementById('d4')


    function showTime(){
        let timeObj = new Date()
        inputEle.value = timeObj.toLocaleString()
    }
    startBtnEle.onclick = function (){
        if (!t){
            t = setInterval(showTime,1000)
        }
    }
    endBtnEle.onclick = function (){
        clearInterval(t)
        t = null
    }
</script>
</body>
</html>
// 省市联动单例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<select id="s1">
    <option value="请选择" disabled="disabled" selected="selected">--请选择--</option>
</select>
<select id="s2"></select>
<script>
    let data = {
        '浙江': ['杭州市', '台州市', '嘉兴市'],
        '上海': ['浦东区', '黄浦区', '静安区'],
        '北京': ['朝阳区', '昌平区', '海淀区']
    }

    // 先获取标签
    let proEle = document.getElementById('s1')
    let cityEle = document.getElementById('s2')

    // for循环获取省级数据
    for (i in data) {
        // 创建option标签
        let opEle = document.createElement('option')
        // 设置value
        opEle.value = i
        // 设置文本
        opEle.innerText = i
        // 添加标签
        proEle.appendChild(opEle)
    }

    // 文本域变化事件 change事件
    proEle.onchange = function () {
        // 每次都清除上一次的数据
        cityEle.innerHTML = ''
        // 美化选项
        let opEle = document.createElement('option')
        opEle.innerText = '--请选择--'
        opEle.setAttribute('selected','selected')
        opEle.setAttribute('disabled','disabled')
        cityEle.appendChild(opEle)
        // 先获取到用户选择的省
        let currentPro = proEle.value
        // 获取到对应市的数据
        let currentCityList = data[currentPro]
        console.log(currentCityList)
        // for 循环拿到所有的市,渲染到第二个select
        for (let i = 0; i < currentCityList.length; i++) {
            let opEle = document.createElement('option')
            opEle.value = currentCityList[i]
            opEle.innerText = currentCityList[i]
            cityEle.appendChild(opEle)
        }
    }
</script>
</body>
</html>

标签:浏览器,DOM,元素,获取,window,let,BOM,document
From: https://www.cnblogs.com/Hqqqq/p/18092677

相关文章

  • 11DOM编程处理事件
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"content="width=device-width,initial-scale=1.0">6<title>Document......
  • Python常用模块(random随机模块&json序列化模块)
    1.random随机模块返回两数之间的随机数,不包括尾数:random.randrange()importrandomprint(random.randrange(1,10))#3返回两数之间的随机数,包括尾数:random.randint()importrandomprint(random.randint(1,10))#返回1-10之间的一个随机数,包括10#7随机选取0到100间......
  • jquery在父组件中访问子组件的DOM元素
    父组件1、引入子组件importMarkDialogfrom"@/views/home/digitalMap/markDialog.vue";2、注册子组件components:{MarkDialog},3、使用子组件<mark-dialogref="markDialog"></mark-dialog>4、通过jquery访问子组件的dom元素constchildDomElem......
  • Atcoder ABC242H Random Painting
    对于这个\(\max\)似乎没有什么好的办法,考虑\(\min-\max\)反演。记\(t_i\)为第\(i\)格被染黑的时间,有\(E(\max(t_i))=\sum\limits_{S}(-1)^{|S|+1}E(\min(t_i))(i\inS)\)。考虑如果知道了\(S\),那么就可以知道\(c=\sum\limits_{i=1}^m[[l_j,r_j]\capS\no......
  • JavaScript之Promise补充与Dom操作
    Promise过程分析//按照顺序依次引入a-d.js,最后打印加载完毕load('a.js').then(()=>{returnload('b.js')//load方法返回Pomise对象//但是没有把这个对象返回//所以这个函数没有返回值//then方法会提供一个空对象作为返......
  • 【DOM】重绘与重排详解及在性能优化中的应用
    DOM树表示页面结构渲染树表示DOM节点如何展示DOM树中需要展示的节点在渲染树中至少存在一个对应的节点(隐藏的DOM元素在渲染树中没有对应的节点)。渲染树中的节点被称为“帧(frames)”或“盒(boxes)”。符合CSS模型的定义。理解页面元素为一个具有内边距、外边距、边框、位置......
  • 论文精读系列文章——Point-LIO: Robust High-Bandwidth Light Detection and Ranging
    论文精读系列文章下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此论文精读系列文章链接下面是专栏地址:论文精读系列文章专栏文章目录论文精读系列文章论文精读系列文章链接论文精读系列文章专栏前言论文精读系列文章——......
  • 前端基础之JavaScriptDOM和BOM
    一、JavaScript的组成JavaScript的实现包括以下3个部分:ECMAScript(核心)描述了JS的语法和基本对象文档对象模型(DOM)处理网页内容的方法和接口浏览器对象模型(BOM)与浏览器交互的方法和接口核心(Core):核心部分包括语言的基本语法、数据类型、控制结构等。这些......
  • 关于衍射光波导设计中的K阈(k-domain)分析的一些学习
     对于衍射光波导的设计来说,不能简单利用几何光的方法对光线的传播路径进行描述。因此可以基于K空间波矢的矢量运算来进行描述。 在阈值分析中,衍射光波导的光线传播遵循二个引导条件,分别为全内反射条件和引导模式条件。如图所示。             ......
  • pikachu靶场第八关——XSS(跨站脚本)之DOM型xss(附代码审计)
    什么是DOM?简单来说DOM文档就是一份XML文档,当有了DOM标准之后,DOM便将前端html代码化为一个树状结构,方便程序和脚本能够轻松的动态访问和更新这个树状结构的内容、结构以及样式,且不需要经过服务端,所以DOM型xss在js前端自己就可以完成数据的输入输出,不与服务器产生交互,这样来说DO......