您好,欢迎访问一九零五行业门户网

JS中Dom的相关知识总结

本篇文章给大家带来的内容是关于js中dom的相关知识总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
主旨
用来记录和总结学的知识点,以便温故知新
说明
这么写方便自己记忆
记忆点
节点相关
dom节点获取
getelement (id,classname,tagname)和queryselector (/all这个是静态的节点集合,不是实时的)
childnodes/firstchild/lastchild/nextsibling/previoussibling/parentnode获取的是所有类型的相关节点,不单单是元素节点
children/firstelmentchild/lastelmentchild/nextelmentsibling/previouselmentsibling/parentelment,获取单单只是元素相关节点
节点树
重点是:
htmlbodyelement这些都是构造函数,原型链的终端还是object.prototype
document.body.__proto__ === htmlbodyelement.prototype  //truedocument.documentelement.__proto__.__proto__ === htmlbodyelement.prototype.__proto__  //true  document.documentelement.__proto__.__proto__===htmlelement.prototype  //true
nodetype
常量值描述
node.element_node 1 元素节点,element
node.text_node 3 文本节点,textcontent
node.processing_instruction_nodee 7 一个用于xml文档的 processinginstruction ,例如 <?xml-stylesheet ... ?> 声明。
node.comment_node 8 一个注释节点
node.document_node 9 document节点
node.document_type_node 10 描述文档类型的 documenttype 节点。例如 <!doctype html>文档类型声明。
node.document_fragment_node 11 一个 documentfragment 节点,代码片段节点
innerhtml,outerhtml,textcontent
elem.innerhtml:指的是elem中所有的childnodes,包括注释节点可利用elem.innerhtml += xxx进行累计全覆盖
elem.outerhtml:指的是elem中所有的childnodes以及elem自身包括注释节点
elem.textcontent:指的是elem的childnodes中所有的文本节点,不包括注释节点
注意点:
对于文本内容例如:<>,innerhtml会进行转译><,而textcontent则不会原样输出
innerhtml会对内容中的标签进行转译为html相应节点
当script片段放入innerhtml中时不会执行,但是对于包含事件类型的脚本就存在注入风险
"<script>alert('i am john in an annoying alert!')</script>; //无风险<img src='#' onerror='alert(1)'>;                          //有风险
所以对于纯文本建议使用textcontent
outerhtml可以用来replace替换当前及自身的内容
nodevalue只有文本和注释节点才有值,否则输出null
属性相关attributes
  元素属性的map集合,可通过for-of迭代遍历出name-value
hasattribute/get/set/remove ==>检测是否存在属性/得到/设置/删除
elem.proname与elem.getattribute(proname)基本一致,有个别不一致,例如input-value
let input = document.queryselector(input);input.setattribute(value, 3);            //行间样式显示3input.value = 666;                         //页面内容显示666console.log(input.getattribute(value));  //3
自定义属性
通过data-log-n = 1可以通过elem.dataset.logn获取属性
元素创建以及增删改查元素节点创建let div = document.createelement('div');文本节点创建let textnode = document.createtextnode('here i am');
简单补充一个表格的创建
let table = document.createelement(table); //创建一个table元素节点let tbody = document.createelement(tbody); //创建一个tbody元素节点tbody.insertrow(0); //创建一行tbody.rows[0].insertcell(0); //创建一行第一列tbody.rows[0].cells[0].append(document.createtextnode((0,0))); //补充其内容tbody.rows[0].insertcell(1); //创建一行第二列tbody.rows[0].cells[1].append(document.createtextnode((0,1)));table.append(tbody);div.append(table);
元素增删改查
 node.append()与node.prepend()都是在node内部添加,一个始终往队尾加一个往队首加
  node.before()与node.after(),一个加在node自身节点的上面,一个加在下面
 node.replace();自身节点替换成参数节点
  还有一个node.insertadjacenthtml(where,html);where有4种值
 beforebegin与afterbegin在node开始位置的前或者后添加html
 beforeend与afterend在node结束位置的前或者后添加html
  elem.removechild():删除子节点,还存在内存中通过变量可以读取
  node.remove():则彻底删除,不再内存中,不再能被读取
class相关classname将class的value以字符串形式返回
classlist将class的value以类数组对象返回,提供了4种方法方便对class进行增删改查
elem.classlist.add/remove(class):增加和删除类
  elem.classlist.toggle(class): 如果类存在,则删除它,否则添加它
  elem.classlist.contains(class): 返回true/false,检查给定的类
style相关通过style获取属性值必须是在行间样式中有填写的,否则空;elem.style.borderleftwidth=100px通过破折号-变成大写可以获取属性,必须带有px
重置样式:elem.style.borderleftwidth=;利用空字符串浏览器会应用css类及其内置样式
完全重写样式:div.style.csstext=color: red !important;或者div.setattribute('style', 'color: red...')
一种有css关联的样式,而不局限与行间样式:getcomputedstyle(element[, pseudo])
       <style>        .box {            width: 100px;        }                .a {            font-size: 1em;        }        .a:after {            content: 666;            display: inline-block;            width: 10px;            height: 10px;        }    </style><body>    <div class="box">        <div class="a" style="color: red;">213</div>    </div>    <script>        let div = document.queryselector(.a);        //let style = getcomputedstyle(div,after);   读取伪类元素        //console.log(style.content);        let style = getcomputedstyle(div);        console.log(style.left);     //auto        console.log(style.fontsize); //16px    </script></body>
返回结果与css样式关联,返回结果是经过计算的,例如16px,并且结果不一定是我们想要的例如auto
它还能读取伪类元素的样式属性,将第二个参数填写after;getcomputedstyle(element, after)
元素大小属性
记住这张图基本搞定:
简单写写:offsetwidth:元素全尺寸=border+padding+content+滚动条宽度;clientwidth/height:只考虑可见部分content+padding(不加滚动条);
顶部边框宽度:clienttop,左边边框宽度:clientleft,但是当滚动条在左边时要加上其宽度=clientleft
offsetparent来获取最近的css定位祖先。并offsetleft/offsettop提供相对于它左上角的x / y坐标。
属性scrollwidth/scrollheight还包括滚出(隐藏)部分,例如没有水平滚动,scrollwidth等于clientwidth
大多数几何属性是只读的,但scrollleft/scrolltop可以更改,浏览器将滚动元素。
scrollleft/scrolltop - 元素的滚动部分的宽度/高度
  注意点:
  如果一个元素不能被滚动(例如,它没有溢出,或者这个元素有一个non-scrollable属性), scrolltop将被设置为0。
  设置scrolltop的值小于0,scrolltop 被设为0
  如果设置了超出这个容器可滚动的值, scrolltop 会被设为最大值.
顺便提提如何是浏览器滚动条滚动:scrollto(x,y)让滚动条到水平x,垂直y的位置;scrollby(x,y)让滚动条每次以水平x,垂直y的距离滚动;
scrollintoview():参数true默认值,滚到顶部,false滚到底部;document.body.style.overflow = hidden禁止滚动
整个文档的宽度/高度,带有滚动的部分
let scrollheight = math.max(  document.body.scrollheight, document.documentelement.scrollheight,  document.body.offsetheight, document.documentelement.offsetheight,  document.body.clientheight, document.documentelement.clientheight);
窗口大小
两种办法:document.documentelement.clientwidth/height ,window.innerwidth/height有细微区别当有滚动条时,前者不包括后者包括
坐标相关获取元素相对窗口的坐标elem.getboundingclientrect()返回的包换坐标的对象,左上顶点的(left,top)以及右下顶点的(right,bottom)
网页滚出窗口部分,有两种方式计算pageyoffset或者document.documentelement.scrolltop
因此我们可以计算元素相对与页面的位置
function getcoords(elem) {  let box = elem.getboundingclientrect();  return {    top: box.top + pageyoffset,    left: box.left + pagexoffset  };}
以上就是js中dom的相关知识总结的详细内容。
其它类似信息

推荐信息