700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【JS基础】这些是web api中的DOM和BOM必然要会使用的东西

【JS基础】这些是web api中的DOM和BOM必然要会使用的东西

时间:2022-10-28 15:46:46

相关推荐

【JS基础】这些是web api中的DOM和BOM必然要会使用的东西

文章目录

前言DOM增创建元素节点 document.createElement()添加子元素 obj.appendChild(obj) 删删除子元素 obj.removeChild () 查获取元素节点 改替换子元素 obj.replaceChild ()插入子元素 obj.insertBefore ()移动子元素 同添加子元素用法 其他操作类名操作移除类名 obj.classlist.remove("") / obj.className = ""添加类名 obj.classlist.add("") / obj.className = "xxx" 属性操作给元素节点设置属性 obj.setAttribute (属性名,属性值)获取属性值 obj.getAttribute (属性名) 复制元素节点 obj.cloneNode(true) 节点类型 nodeTypeproperty和attribute的区别node和element的区别HTMLCollection和NodeList的区别DOM操作很耗性能,如何做优化document.activeElement获取当前聚焦的元素 BOMhistorylocationnavigatorscreen方法与属性

前言

JS由两个标准构建,一个ES是基础语法标准,一个W3C是web api标准。前者是后者的基础。

DOM

Document Object Model,文档对象模型。每个浏览器都会把html文档解析成DOM树。可以通过DOM对象的属性和方法来操作html元素,例如可以修改,访问相关的元素。

创建元素节点 document.createElement()

var oLi = document.createElement("li")

添加子元素 obj.appendChild(obj)

var oLi = document.createElement("li")oLi.innerHTML = "new" oUl1.appendChild(oLi)// 移动元素的操作和新增一样,只不过createElement改成getELement

删除子元素 obj.removeChild ()

// 点击哪个li就删除哪个oUl.onclick = function(ev) {var ev = ev || eventif(ev.target.nodeName === "LI"){oUl.removeChild(ev.target)}}

获取元素节点

// 通过id获取document.getElementById ()// 通过class获取(获取到的是个伪数组集合,可通过[1]的方式使用指定DOM)document.getElementsByClassName ()// 通过标签名获取(获取到的是个伪数组集合,可通过[1]的方式使用指定DOM)document.getElementsByTagName () // obj.getElementsByTagName("*") 可以获取到当前元素下面所有节点// 通过css选择器获取(获取到的是个伪数组集合,可通过[1]的方式使用指定DOM)与getElementsByTagName比较,后者执行效率更高运算更快,但查找起来相对麻烦些document.querySelectorAll ("css选择器")// 通过css选择器获取,通过css选择器获取(获取到的是个伪数组集合,可通过[1]的方式使用指定DOM)document.querySelector("css选择器")// 获取所有html元素document.documentElements// 获取父节元素点obj.parentNode// 获取上一个兄弟节点obj.previousSibling// 获取下一个兄弟节点obj.nextSibling// 获取所有类型的子节点,是个集合obj.childNodes// 获取所有的子元素节点obj.children// 获取第一个子节点obj.firstChild// 获取最后一个子节点obj.lastChild// 获取第一个子元素节点obj.firstElementChild// 获取标签名称,大写的obj.nodeName// 表格元素获取objtable.tBodies[0].rows[0].cells[0]

替换子元素 obj.replaceChild ()

插入子元素 obj.insertBefore ()

var oLiNew = document.createElement("li")oLiNew.innerHTML = "new" // 在哪一个元素节点前固定添加元素节点oUl1.insertBefore(oLiNew, oLi1)

移动子元素 同添加子元素用法

其他操作

类名操作

移除类名 obj.classlist.remove(“”) / obj.className = “”

前者是表示只去掉class里指定的类名

添加类名 obj.classlist.add(“”) / obj.className = “xxx”

前者表示在原来类名的基础上添加新的类名

属性操作

给元素节点设置属性 obj.setAttribute (属性名,属性值)

oBtn.setAttribute("class","btn")class ="btn"// 用createElement创建的dom可以直接div.id = "myDiv";div.className = "div1";

获取属性值 obj.getAttribute (属性名)

<div id="btn" index="1"></div>alert(oBtn.getAttribute("id"))/alert(oBtn.getAttribute("index")) // btn/1

复制元素节点 obj.cloneNode(true)

节点类型 nodeType

节点类型的应用场景:遍历节点的时候为了能获需要的的节点类型,用来过滤;

for(var i = 0 ; i < aLiNode.length ; i++){// 为了过滤其他节点,只需要给元素节点添加css样式if(aLiNode[i].nodeType == 1){aLiNode[i].style.backgroundColor = "red"}

元素 1文本(就是标签里的文字,空格也算是文本节点,一般标签换行,上下标签之间就会有一个空格文本)3comment 8document 9

property和attribute的区别

property指通过dom操作获取到的dom对象上的属性,例如obox.style.widthattribute指标签上的属性,例如class和自定义属性等。一般优先使用property,底层可能会有dom渲染优化,而attribute的改变就是直接改变html的结构,必定渲染。

node和element的区别

不准确的来说:

node是dom树的节点,是element的基类element就是div、p这些标签

想深入可以百度一下,挺多东西的。4-13

HTMLCollection和NodeList的区别

HTMLCollection是element的集合NodeList是node的集合都是类数组

DOM操作很耗性能,如何做优化

第一:查询做缓存

for (let i = 0; i < document.getElementsByTagName("p").length; i++) {// 每次循环都计算了length,频繁对dom查询}// 做缓存后const pList = document.getElementsByTagName("p");const length = pList.length;for (let i = 0; i < length; i++) {// 只会查询一次dom的数量}

第二:把频繁操作换成一次性操作

const list = document.getElementById("list");// 创建一个文档片段,此时还没有插入到 DOM 结构中const frag = document.createDocumentFragment();for (let i = 0; i < 20; i++) {const li = document.createElement("li");li.innerHTML = `List item ${i}`;// 先插入文档片段中frag.appendChild(li);}// 都完成之后,再统一插入到 DOM 结构中list.appendChild(frag);

第三:用事件冒泡代替循环绑定事件的写法

document.activeElement获取当前聚焦的元素

例如一些可交互的标签:input、可选中div等,可以从document.activeElement实时获取到被聚焦(或者说被激活)的元素。

let activeElement = document.activeElement

如果没有标签被聚焦,那么获取到的是body元素。

如果还想对获取到的聚焦元素进行进一步的筛选,可以使用dom上的matchs方法:

if (activeElement?.matches('div[role="button"]')) {// matches方法内写的是css选择器}

BOM

Browse Object Model,浏览器对象模型, 可以通过一些属性和方法来操作浏览器。

console.log(window) //是最顶层的,很多指令都是window下的,例如window.alert(),一般直接简写alert()

self对象:指窗口本身,它返回的对象跟window对象是一模一样的。也正因为如此,window对象的常用方法和函数都可以用self代替window。

举个例子,常见的写法如“self.close();”,把它放在<a>标记中:“<a href="javascript:self.close();">关闭窗口</a>”,单击“关闭窗口”链接,当前页面关闭。

下面来看下挂在window上的一些对象。

history

浏览器历史记录对象

// 返回上一条历史记录页面history.back()// 进入下一条历史记录页面history.forword()// 进入指定的历史记录页面history.go() history.go(1) // 相当于前进history.go(-1) // 相当于后退history.go(0) // 表示刷新当前页面// 进入新页面history.pushState('/url') // 无刷新页面,静态跳转;这个是Html5新增的// 表示当前页面的历史记录条数history.length

location

浏览器页面信息对象

// 用于获取或设置当前页面的完整URL地址location.hrefwindow.location.href = url // 打开url网址的新页面// 获取#和#后的urllocation.hash// 获取?和?后的url(?wd="xxx"&age=13)location.search// 查看协议,例如https:location.protocol // 还有host,pathname等

这里普及适用于search的一个对象,可以快速获取&a=10的value值:

function query(name) {const search = location.searchconst p = new URLSearchParams(search) // 但是这个低版本浏览器不兼容return p.get(name)}console.log(query('a')) // 10

面试题:将url参数解析为JS对象

// 第一种方法function queryToObj() {const res = {}const search = location.search.substr(1) // 去掉前面的"?"search.split('&').forEach(p=>{const arr = p.split('=')const key = arr[0]const val = arr[1]res[key] = val})return res}// 第二种方法function queryToObj() {const res = {}const pList = new URLSearchParams(loaction.search)pList.forEach((val, key)=>{res[key] = val})return res}

navigator

浏览器的信息检测对象

// 返回浏览器的相关信息window.navigator.userAgent // 返回一个字符串 包含浏览器的相关信息,例如版本,浏览器名称。一般把这个属性简称UAconsole.log(window.navigator.userAgent)// 但我们会发现,打印出的浏览器信息有谷歌、苹果、火狐等,这是因为以前网站通过UA识别,只兼容某个特定浏览器,其他浏览器是访问不了的,那么其他浏览器想兼容让自己能够访问的网站更加全面怎么办,那就都加进去呗。// 应用:可以用来检测是不是某个浏览器。indexOf()里面传入一个字符串,如果这个字符串在前面的字符串中,返回一个具体位置(数字),如果没有返回-1if(window.navigator.userAgent.indexOf("Chrome") == -1 ){alert("当前不是chrome浏览器")}else{alert("当前浏览器是chrome")}// 因为上面的原因,所以如果想严格检查浏览器类别,还需更加专业的办法(网上有)

// 当前浏览器的语言navigator.language// 当前平台信息(32/64x)navigator.platform

screen

屏幕子对象

// 当前屏幕分辨率的宽度screen.width// 当前屏幕分辨率的高度screen.height// 当前窗口化到屏幕指定边缘的距离。比较特殊,直接screenLeft/right/top/downalert(screenLeft)

方法与属性

方法:

// 表示打开一个窗口window.open ()// ()有很多参数// 第一个:填写"网址",不填写默认是空白网页// 第二个:表示打开方式,默认为"_blank",表示新建打开,_self"表示覆盖本网页打开// 第三个:写窗口大小和位置,"width=200,height=100,left=1000,top=200"var w = nullopBtn.onclick = function(){w = open()console.log(w) //表示的又是一个window;w.document.body.style.backgroundColor = "red"}clsBtn.onclick = function(){w.close()}

// 表示关掉网页window.close ()

属性:

// 用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法window.onload = fn()// 获取浏览器内容高度window.innerHeight// 获取纵向滚动距离window.scrollY// 浏览器滚动就触发window.onscroll = fn

未来继续补充…

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。