DOM操作

作者: 学的会的前端 | 来源:发表于2019-02-19 14:55 被阅读90次

DOM定义:

文档对象模型 (DOM) 是HTML和XML文档的编程接口。它给文档(结构树)提供了一个结构化的表述并且定义了一种方式—程序可以对结构树进行访问,以改变文档的结构,样式和内容。
DOM 提供了一种表述形式将文档作为一个结构化的节点组以及包含属性和方法的对象。从本质上说,它将web 页面和脚本或编程语言连接起来了。


image

document对象

每个载入浏览器的HTML文档都会成为document对象,document对象包含文档的基本信息,我们可以用通过JavaScript对HTML页面中的所有元素进行访问修改。

TIM图片20190219134010.png

document对象常用属性:

  • doctype、head、body


    TIM图片20190219134331.png
  • activeElement:
    activeElement属性返回当前文档中获得焦点的那个元素。
  • location
    TIM图片20190219135102.png
    location属性返回一个只读对象,提供了当前文档的 URL信息。
// 假定当前网址为http://user:passwd@www.example.com:4097/path/a.html?x=111#part1
document.location.href // "http://user:passwd@www.example.com:4097/path/a.html?x=111#part1"
document.location.protocol // "http:"
document.location.host // "www.example.com:4097"
document.location.hostname // "www.example.com"
document.location.port // "4097"
document.location.pathname // "/path/a.html"
document.location.search // "?x=111"
document.location.hash // "#part1"
document.location.user // "user"
document.location.password // "passed"
TIM图片20190219135025.png
// 跳转到另一个网址
document.location.assign('http://www.google.com')
// 优先从服务器重新加载
document.location.reload(true)
// 优先从本地缓存重新加载(默认值)
document.location.reload(false)
// 跳转到另一个网址,但当前文档不保留在history对象中,
// 即无法用后退按钮,回到当前文档
document.location.assign('http://www.google.com')
// 将location对象转为字符串,等价于document.location.href
document.location.toString()
虽然location属性返回的对象是只读的,但是可以将URL赋值给这个属性,网页就会自动跳转到指定网址。
document.location = 'http://www.example.com';
// 等价于
document.location.href = 'http://www.example.com';
  • 实现当前页面的刷新:
document.location = '当前页面地址'
document.location.reload(true)
document.location.assign('当前页面地址')
  • readyState:
    readyState属性返回当前文档的状态,共有三种可能值:
  1. loading:加载HTML代码阶段,尚未解析完成。
  2. interactive:加载外部资源阶段。
  3. complete:全部加载完成。
  • cookie
    cookie是存储在客户端的文本。
    TIM图片20190219135928.png
  • innerText
    innerText是一个可写属性,返回元素包含的文本内容,在多层次的时候会按照元素由浅到深的顺序拼接成其内容。
    document.innerText:会过滤掉所有的标签,只显示内容的拼接。
<p>
  123
  <span>456</span>
</p>
//最终的显示为123456
  • innerHTML、outerHTML
    innerHTML属性作用和innerText类似,但是不是返回元素的文本内容,而是返回元素的HTML结构,在写入的时候也会自动创建DOM。
<p>
  123
  <span>456</span>
</p>
p.innerHTML,最终显示:
123
 <span>456</span>

document对象常用的方法:

  • write():
    document.write方法用于向当前文档写入内容。只要当前文档还没有用close方法关闭,它所写入的内容就会追加在已有内容的后面。
document.open();
document.write("hello");
document.write("world");
document.close();
  1. 如果页面已经渲染完成再调用write方法,它会先调用open方法,擦除当前文档所有内容,然后再写入。
  2. 如果在页面渲染过程中调用write方法,并不会调用open方法。
  3. 需要注意的是,虽然调用close方法之后,无法再用write方法写入内容,但这时当前页面的其他DOM节点还是会继续加载。
  4. 除了某些特殊情况,应该尽量避免使用document.write这个方法
  • Element
  1. 除了document对象,在DOM中最常用的就是Element对象了,Element对象表示HTML元素。
  2. Element 对象可以拥有类型为元素节点、文本节点、注释节点的子节点,DOM提供了一系列的方法可以进行元素的增、删、改、查操作
  3. Element有几个重要属性
  • nodeName:元素标签名,还有个类似的tagName
  • nodeType:元素类型
  • className:类名
  • id:元素id
  • children:子元素列表(HTMLCollection)
  • childNodes:子元素列表(NodeList)
  • firstChild:第一个子元素
  • lastChild:最后一个子元素
  • nextSibling:下一个兄弟元素
  • previousSibling:上一个兄弟元素
  • parentNode、parentElement:父元素

查询元素

  • getElementById()
    getElementById方法返回匹配指定ID属性的元素节点。如果没有发现匹配的节点,则返回null。这也是获取一个元素最快的方法。
    TIM图片20190219141605.png
  • getElementsByClassName()
    getElementsByClassName方法返回一个类似数组的对象(HTMLCollection类型的对象),包括了所有class名字符合指定条件的元素(搜索范围包括本身),元素的变化实时反映在返回结果中。这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。
    TIM图片20190219141815.png
  • getElementsByTagName()
    getElementsByTagName方法返回所有指定标签的元素(搜索范围包括本身)。返回值是一个HTMLCollection对象,也就是说,搜索结果是一个动态集合,任何元素的变化都会实时反映在返回的集合中。这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。
    TIM图片20190219141941.png
  • 或者id = 'ct'的div里面的p元素
    ct.getElementsByTagName('p')
    TIM图片20190219142317.png
  • querySelector()
    querySelector方法返回匹配指定的CSS选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。如果没有发现匹配的节点,则返回null。
document.querySelector('#ct');
docyument.querySelector('#ct a');

querySelector方法无法选中CSS伪元素。

  • querySelectorAll()
    querySelectorAll方法返回匹配指定的CSS选择器的所有节点,返回的是NodeList类型的对象。NodeList对象不是动态集合,所以元素节点的变化无法实时反映在返回结果中。
    TIM图片20190219142707.png
    querySelector兼容性:caniuse.com

创建元素

  • createElement()
    createElement方法用来生成HTML元素节点。
    createElement方法的参数为元素的标签名,即元素节点的tagName属性。如果传入大写的标签名,会被转为小写。如果参数带有尖括号(即<和>)或者是null,会报错。
    document.createElement('div')
  • createTextNode()
    createTextNode方法用来生成文本节点,参数为所要生成的文本节点的内容。
var newDiv = document.createElement("div");
var newContent = document.createTextNode("Hello");
  • createDocumentFragment()
    createDocumentFragment方法生成一个DocumentFragment对象。
var docFragment = document.createDocumentFragment();
//没有参数

DocumentFragment对象是一个存在于内存的DOM片段,但是不属于当前文档,常常用来生成较复杂的DOM结构,然后插入当前文档。这样做的好处在于,因为DocumentFragment不属于当前文档,对它的任何改动,都不会引发网页的重新渲染,比直接修改当前文档的DOM有更好的性能表现。

修改元素

  • appendChild()
    把一个DOM对象添加到父容器上。
var newDiv = document.createElement("div");
var newContent = document.createTextNode("Hello");
newDiv.appendChild(newContent);
  • insertBefore()
    在某个元素之前插入元素
var newDiv = document.createElement("div");
var newContent = document.createTextNode("Hello");
newDiv.insertBefore(newContent, newDiv.firstChild);
  • replaceChild()
    replaceChild()接受两个参数:要插入的元素和要替换的元素
    newDiv.replaceChild(newElement, oldElement);

删除元素

  • removeChild()
    parentNode.removeChild(childNode);
  • clone元素
    cloneNode()方法用于克隆元素,方法有一个布尔值参数,传入true的时候会深复制,也就是会复制元素及其子元素(IE还会复制其事件),false的时候只复制元素本身.
    node.cloneNode(true);

属性操作

  • getAttribute()
    getAttribute()用于获取元素的attribute值
    node.getAttribute('id');
  • createAttribute()
    createAttribute()方法生成一个新的属性对象节点,并返回它。
    attribute = document.createAttribute(name);
    createAttribute方法的参数name,是属性的名称。
  • setAttribute()
    setAttribute()方法用于设置元素属性
var node = document.getElementById("div1");
node.setAttribute("my_attrib", "newVal");
等同于
var node = document.getElementById("div1");
var a = document.createAttribute("my_attrib");
a.value = "newVal";
node.setAttributeNode(a);
  • romoveAttribute()
    removeAttribute()用于删除元素属性
    node.removeAttribute('id');

classList()

  • 添加class
    xx.classList.add('active')
  • 删除class
    xx.classList.remove('active')
  • 是否包含某个class
    xx.classList.contains('active')

示例:

TIM图片20190219145510.png

相关文章

网友评论

    本文标题:DOM操作

    本文链接:https://www.haomeiwen.com/subject/qiixyqtx.html