JS获取HTML DOM元素的方法

577 阅读6分钟

什么是DOM?

Document Object Model(文档对象模型) DOM是针对HTML和XML文档的一个API(Application Programming Interface应用程序编程接口)。DOM描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。 HTML DOM 定义了访问和操作HTML文档的标准方法。 要改变页面的某个东西,JavaScript 就需要获得对 HTML 文档中所有元素进行访问的入口。这个入口,连同对 HTML 元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)。 我们可以通过JavaScript操作DOM,可以对节点实现增删改查操作,可以动态添加标签,属性等。

1、DOM获取元素和节点

1)根据id获取元素

      document.getElementById()
      var div1=document.getElementById('div1'); // 获取id是div1的元素

2)根据标签名获取标签列表

      document.getElementsByTagName()
      var div1=document.getElementsByTagName('div'); // 获取标签名是div的元素

3)根据Name属性获取标签列表

      document.getElementsByName()
      var inp=document.getElementsByName('inp');

4)根据Class名获取标签列表

      document.getElementsByClassName()
      var div1=document.getElementsByClassName('div1'); // 获取class是div1的元素

5)根据选择器获取到第一个找到的元素

      document.querySelector()
      var div1=document.querySelector('.div1'); // 获取class是div1的元素
      var div2=document.querySelector('#div2'); // 获取id是div2的元素
      var div0=document.querySelector("#diva>.div0");   找到id为diva的元素下的第一个calss名为div0的元素
      var ps=document.querySelector("[name=password]");  找到body下第一个name名为password的元素

6)根据选择器获取所有标签名的元素

      document.querySelectorAll() 
      var div2=document.querySelectorAll('div'); // 获取标签名是div的全部元素

2、nodeNam节点名,nodeValue节点值,nodeType节点类型

1)获取子节点

子节点:文本、注释、document、标签
子元素:就是标签

      // 获取body的子节点
      console.log(document.body.childNodes);

2)nodeValue节点值

      // 如果是文本就显示文本内容
      console.log(document.body.childNodes[0].nodeValue);
      // 如果是标签元素nodeValue是null
      console.log(document.body.childNodes[1].nodeValue);   
      // 如果是注释,nodeValue就是注释内容
      console.log(document.body.childNodes[3].nodeValue);

3)nodeNam节点名

      // 文本节点的 nodeName 永远是 #text
      console.log(document.body.childNodes[0].nodeName);
      // 元素节点的 nodeName 是标签名称
      console.log(document.body.childNodes[1].nodeName);
      // 注释节点的 nodeName 永远是 #comment
      console.log(document.body.childNodes[3].nodeName);

4)nodeTyp节点类型

      console.log(document.body.childNodes[0].nodeType);
      console.log(document.body.childNodes[1].nodeType);
      console.log(document.body.childNodes[3].nodeType);

nodeType(节点类型)
元素---1
属性---2
文本---3
注释---8
文档---9

3、Dom获取节点

1)子节点

      console.log(document.body.childNodes) // childNodes 所有子节点,获取所有子节点(包括注释)
      console.log(document.body.children) // children 所有是标签类型的子节点,获取所有子元素

2)父节点

      var p1=document.querySelector('.p1')
      console.log(p1.parentNode) // 获取已知节点的父节点
      console.log(p1.parentElement) // 父元素

3)第一个子节点

      var div1=document.querySelector('.div1')
      console.log(div1.firstElementChild) // 第一个子节点 (元素)
      console.log(div1.firstChild) // 第一个子节点

用firstChild标签之间回车产生的距离也是一个空白文本节点,所以显示#text

4)最后一个子节点

      var div1=document.querySelector('.div1')
      console.log(div1.lastElementChild) // 最后一个子节点(元素)
      console.log(div1.lastChild) // 最后一个子节点

元素之间回车产生的距离也是一个空白文本节点,所以显示#text

5)下一个兄弟节点

      var div1=document.querySelector('.div1')
      console.log(div1.nextElementSibling)
      console.log(div1.nextSibling)

元素之间回车产生的距离也是一个空白文本节点,所以显示#text

6)上一个兄弟节点

      var div2=document.querySelector('.div2')
      console.log(div2.previousElementSibling) // 上一个兄弟元素
      console.log(div2.previousSibling.previousSibling) // 上一个兄弟节点

上面两个方法也可以像这里直接写两次,或写代码时避免回车

4、元素操作、创建内容

1)textContent给元素里面写入文本

      var div2=document.querySelector('.div2')
      div2.textContent='我好帅啊'

可以在控制台或则页面上看到元素里面增加了内容

2)根据标签名创建标签元素

      document.createElement(标签名)  // 根据标签名创建标签元素

3)将子元素插入在父容器的尾部

      父容器.appendChild(子元素);  将子元素插入在父容器的尾部

4)插入

父容器.insertBefore(要插入的元素,插入在谁的前面)

      div.insertBefore(span,div.firstElementChild); //div.firstElementChild为div下的第一个元素
      div.parentElement.insertBefore(span,div.nextElementSibling); //div.nextElementSibling为div下一个兄弟元素

5)给ul创建若干子元素

      var ul = document.createElement("ul");
      for (var i = 0; i < 10; i++) {
        var li = document.createElement("li");
        li.textContent = i;
        ul.appendChild(li);
        document.body.appendChild(ul);
      }

6)插入内容

      var div=document.createElement("div");
      document.body.appendChild(div);
      div.textContent="你好";
      var span=document.createElement("span");
      div.appendChild(span); // append 追加
      // div.firstChild为div的第一个子节点
      div.insertBefore(span,div.firstChild);

7)createDocumentFragment创建一个碎片容器,做临时储存用

      var frag=document.createDocumentFragment();
      for(var i=0;i<5;i++){
          var div=document.createElement("div");
          frag.appendChild(div);
      }
      document.body.appendChild(frag);

5、元素复制、删除、替换

1)复制:元素.cloneNode(深度布尔值)

      // false 浅复制,仅复制元素,不复制内容和子元素
      var div1=div.cloneNode(false);
      // true  深复制,可以将元素和元素里面的内容及子元素都复制进去
      var div2=div.cloneNode(true);

2)删除:元素.remove(); 元素自身删除

元素自身删除并非真正删除了,元素只不过不显示了,但还存在,这时需要设置div=null;来彻底删除元素

      div.remove();  // 指从DOM树上删除
      父容器.removeChild(子元素); // 父容器删除子元素

3)替换:父容器.replaceChild(新的元素,要替换的元素);

      document.body.replaceChild(div,ul);

6、标签属性

任何一个DOM元素,有两种属性,一个是对象属性,一个是标签属性
把写在标签上的属性称为标签属性
任何一个DOM元素都是对象模型,都可以自主的添加设置对象的属性和值

1)设置标签属性

属性名的命名不能使用驼峰式命名,通常命名时使用-区分两个单词:toggle-target
属性值不能出现大写,并且必须是字符串

      元素.setAttribute(属性名,属性值);
      div.setAttribute("abc","20"); // 设置标签属性以后,可以用于多种数据使用,可以用于获取标签元素等操作

2)获取标签属性值

      元素.getAttribute(属性名)
      console.log(div.getAttribute("abc"));

3)删除标签属性

      元素.removeAttribute(属性名);
      div.removeAttribute("title");

4)所有的标签单属性值和属性名相同

如input的checked标签,当标签单属性值和属性名相同可以不写,但是要写空字符串

      var ck=document.querySelector("input");
      ck.setAttribute("checked","checked");
      ck.setAttribute("checked","");

标签属性和对象属性是两套系统
标签系统一般用于展现,对象数据一般用于数据的存储和设置

7、对象属性

1)当遇到标签属性值和对象属性值冲突时,以对象属性值为准

      示例input
      var ck=document.querySelector("input");
      ck.setAttribute("checked","");
      ck.checked=false; // 对象

2)所有标签属性并不是都有对应的对象属性

      var ck=document.querySelector("input");
      ck.setAttribute("abc","10");
      console.log(ck.abc);

3)class是一个特殊的存在,他的对象名是className

      var div=document.querySelector("div");
      div.setAttribute("class","div123");
      console.log(div.className);
      div.className="divsss";更改class名

8、标签样式

      console.log(div.style.width); // 这个只能获取css的行内样式,这种方法将无法取到css树的样式

1)获取样式 getComputedStyle(元素)

      getComputedStyle(元素); 
      会自动将元素与对应的css混合形成这个元素的渲染树对象,
      然后通过这个渲染树对象取出对应的属性这个方法属于window的方法
      注意:getComputedStyle具有兼容问题 火狐和谷歌都是兼容,IE8及以下不兼容
      IE任何版本都支持的写法:console.log(div.currentStyle.width);

2)设置css样式

style属性可以设置字符串的方式增加行内属性

      var div=document.querySelector("div");
      div.style="width:50px;height:50px;background-color:red;";

style属性也是设置对象属性设置方式,修改行数样式属性

      var div=document.querySelector("div");
      div.style.width="50px";
      div.style.height="50px";
      div.style.backgroundColor="red";