博客列表 >DOM 对象

DOM 对象


原创
2020年04月28日 10:45:00808浏览

DOM 对象

简单了解下DOM

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>style样式</title>
  6. </head>
  7. <body>
  8. <h2 id="con">I love JavaScript</H2>
  9. <p> JavaScript使网页显示动态效果并实现与用户交互功能。</p>
  10. <script type="text/javascript">
  11. let con = document.getElementById('con');
  12. con.style.color = 'red';
  13. con.style.backgroundColor = '#CCC';
  14. con.style.display = 'none';
  15. </script>
  16. </body>
  17. </html>

getElementsByName()方法

返回带有指定名称的节点对象的集合。

语法

document.getElementsByName(name)

与getElementById() 方法不同的是,通过元素的 name 属性查询元素,而不是通过 id 属性。

注意:

  1. 因为文档中的 name 属性可能不唯一,所有 getElementsByName() 方法返回的是元素的数组,而不是一个元素。

  2. 和数组类似也有length属性,可以和访问数组一样的方法来访问,从0开始。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <script type="text/javascript">
  5. function getnum() {
  6. var mynode = document.getElementsByName('myt');
  7. alert(mynode.length);
  8. }
  9. </script>
  10. </head>
  11. <body>
  12. <input name="myt" type="text" value="1">
  13. <input name="myt" type="text" value="2">
  14. <input name="myt" type="text" value="3">
  15. <br />
  16. <input type="button" onclick="getnum()" value="看看有几项?" />
  17. </body>
  18. </html>

getElementsByTagName()方法

返回带有指定标签名的节点对象的集合。返回元素的顺序是它们在文档中的顺序。

语法:

document.getElementsByTagName(Tagname)

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. <title>JavaScript</title>
  6. </head>
  7. <body>
  8. <form name="Input">
  9. <table align="center" width="500px" height="50%" border="1">
  10. <tr>
  11. <td align="center" width="100px">
  12. 学号:
  13. </td>
  14. <td align="center" width="300px">
  15. <input type="text" id=userid name="user" onblur="validate();">
  16. <div id=usermsg></div>
  17. </td>
  18. </tr>
  19. <tr>
  20. <td align="center" width="100px">
  21. 姓名:
  22. </td>
  23. <td align="center">
  24. <input type="text" name="name">
  25. </td>
  26. </tr>
  27. <tr>
  28. <td align="center" width="%45">
  29. 性别:
  30. </td>
  31. <td align="center">
  32. <input type="radio" name="sex" value="男">
  33. <input type="radio" name="sex" value="女">
  34. </td>
  35. </tr>
  36. <tr>
  37. <td align="center" width="30%">
  38. 年龄:
  39. </td>
  40. <td align="center" width="300px">
  41. <input type="text" name="age">
  42. </td>
  43. </tr>
  44. <tr>
  45. <td align="center" width="100px">
  46. 地址:
  47. </td>
  48. <td align="center" width="300px">
  49. <input type="text" name="addr">
  50. </td>
  51. </tr>
  52. </table>
  53. </form>
  54. <h1 id="myHead" onclick="getValue()">
  55. 看看三种获取节点的方法?
  56. </h1>
  57. <p>
  58. 点击标题弹出它的值。
  59. </p>
  60. <input type="button" onclick="getElements()" value="看看name为sex的节点有几个?" />
  61. <Br>
  62. <input type="button" onclick="getTagElements()" value="看看标签名为input的节点有几个?" />
  63. <script type="text/javascript">
  64. function getValue() {
  65. let myH = document.getElementById('myHead');
  66. alert(myH.innerHTML)
  67. }
  68. function getElements() {
  69. let myS = document.getElementsByName('sex');
  70. alert(myS.length);
  71. }
  72. function getTagElements() {
  73. let myI = document.getElementsByTagName('input');
  74. alert(myI.length);
  75. }
  76. </script>
  77. </body>
  78. </html>

练习实例, 体会不同DOM对象获取方式的不同效果

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  5. <title>全选/全不选</title>
  6. </head>
  7. <body>
  8. <form>
  9. 请选择你爱好:<br>
  10. <input type="checkbox" name="hobby" id="hobby1"> 音乐
  11. <input type="checkbox" name="hobby" id="hobby2"> 登山
  12. <input type="checkbox" name="hobby" id="hobby3"> 游泳
  13. <input type="checkbox" name="hobby" id="hobby4"> 阅读
  14. <input type="checkbox" name="hobby" id="hobby5"> 打球
  15. <input type="checkbox" name="hobby" id="hobby6"> 跑步 <br>
  16. <input type="button" value="全选" onclick="checkall();">
  17. <input type="button" value="全不选" onclick="clearall();">
  18. <p>请输入您要选择爱好的序号,序号为1-6:</p>
  19. <input id="wb" name="wb" type="text">
  20. <input name="ok" type="button" value="确定" onclick="checkone();">
  21. </form>
  22. <script type="text/javascript">
  23. function checkall() {
  24. var hobby = document.getElementsByTagName("input");
  25. for(i=0;i<hobby.length;i++){
  26. if(hobby[i].getAttribute('name') == 'hobby'){ // 获取属性
  27. hobby[i].setAttribute('checked','checked'); // 添加属性
  28. }
  29. }
  30. }
  31. function clearall() {
  32. var hobby = document.getElementsByName("hobby");
  33. for(i=0;i<hobby.length;i++){
  34. if(hobby[i].getAttribute('name') == 'hobby'){
  35. hobby[i].removeAttribute('checked'); // 移除属性
  36. }
  37. }
  38. }
  39. function checkone() {
  40. var j = document.getElementById("wb").value; // 获取要选中的元素
  41. var hobby = document.getElementsByTagName('input'); // 获取所有元素
  42. var jid = "hobby"+j; // 拼接元素ID
  43. for(i=0;i<hobby.length;i++){ // 遍历所有元素
  44. if(hobby[i].getAttribute('id') == jid){ // 查询指定元素
  45. hobby[i].setAttribute('checked','checked'); // 添加属性
  46. }
  47. }
  48. }
  49. </script>
  50. </body>
  51. </html>

getAttribute()方法

通过元素节点的属性名称获取属性的值。

语法:

  1. elementNode.getAttribute(name)

说明:

  1. elementNode:使用getElementById()、getElementsByTagName()等方法,获取到的元素节点。

  2. name:要想查询的元素节点的属性名字

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>getAttribute()</title>
  6. </head>
  7. <body>
  8. <p id="intro">课程列表</p>
  9. <ul>
  10. <li title="第1个li">HTML</li>
  11. <li>CSS</li>
  12. <li title="第3个li">JavaScript</li>
  13. <li title="第4个li">Jquery</li>
  14. <li>Html5</li>
  15. </ul>
  16. <p>以下为获取的不为空的li标签title值:</p>
  17. <script type="text/javascript">
  18. var con = document.getElementsByTagName("li");
  19. for (var i = 0; i < con.length; i++) {
  20. var text = con[i].getAttribute('title');
  21. if (text != null) {
  22. document.write(text + "<br>");
  23. }
  24. }
  25. </script>
  26. </body>
  27. </html>

setAttribute()方法

setAttribute() 方法增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。

语法:

  1. elementNode.setAttribute(name,value)

说明:

1.name: 要设置的属性名。

2.value: 要设置的属性值。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. </head>
  7. <body>
  8. <p id="intro">我的课程</p>
  9. <ul>
  10. <li title="JS">JavaScript</li>
  11. <li title="JQ">JQuery</li>
  12. <li title="">HTML/CSS</li>
  13. <li title="JAVA">JAVA</li>
  14. <li title="">PHP</li>
  15. </ul>
  16. <h1>以下为li列表title的值,当title为空时,新设置值为"WEB前端技术":</h1>
  17. <script type="text/javascript">
  18. var Lists = document.getElementsByTagName("li");
  19. for (var i = 0; i < Lists.length; i++) {
  20. var text = Lists[i].getAttribute('title');
  21. if (text == "") {
  22. Lists[i].setAttribute('title','WEB前端技术');
  23. document.write(Lists[i].getAttribute("title") + "<br>");
  24. }else{
  25. document.write(text + "<br>");
  26. }
  27. }
  28. </script>
  29. </body>
  30. </html>

节点属性

在文档对象模型 (DOM) 中,每个节点都是一个对象。DOM 节点有三个重要的属性 :

  1. nodeName : 节点的名称

  2. nodeValue :节点的值

  3. nodeType :节点的类型

一、nodeName 属性: 节点的名称,是只读的。

  1. 元素节点的 nodeName 与标签名相同
  2. 属性节点的 nodeName 是属性的名称
  3. 文本节点的 nodeName 永远是 #text
  4. 文档节点的 nodeName 永远是 #document

二、nodeValue 属性: 节点的值

  1. 元素节点的 nodeValue 是 undefined 或 null
  2. 文本节点的 nodeValue 是文本自身
  3. 属性节点的 nodeValue 是属性的值

三、nodeType 属性: 节点的类型,是只读的。以下常用的几种结点类型:

元素类型 节点类型
元素 1
属性 2
文本 3
注释 8
文档 9
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>节点属性</title>
  6. </head>
  7. <body>
  8. <ul>
  9. <li>javascript</li>
  10. <li>HTML/CSS</li>
  11. <li>jQuery</li>
  12. </ul>
  13. <script type="text/javascript">
  14. let lis = document.getElementsByTagName('li');
  15. for(let i=0;i<lis.length;i++){
  16. document.write("节点名称为: ") + document.write(lis[i].nodeName) + document.write(" 节点值为: ") + document.write(lis[i].innerText) + document.write(" 节点类型为: ") + document.write(lis[i].nodeType) + document.write("<br>");
  17. }
  18. </script>
  19. </body>
  20. </html>

访问子节点childNodes

访问选定元素节点下的所有子节点的列表,返回的值可以看作是一个数组,他具有length属性。

语法:

  1. elementNode.childNodes

注意:

如果选定的节点没有子节点,则该属性返回不包含节点的 NodeList。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. </head>
  7. <body>
  8. <div>
  9. javascriptsss
  10. <p>javascript</p>
  11. <div>jQuery</div>
  12. <h5>PHP</h5>
  13. </div>
  14. <script type="text/javascript">
  15. let divs = document.getElementsByTagName('div');
  16. let firstDiv = divs[0].childNodes;
  17. for (let i = 0; i < firstDiv.length; i++) {
  18. if (firstDiv[i].nodeType == 1) {
  19. document.write(firstDiv[i].innerText + "<br>");
  20. }
  21. }
  22. </script>
  23. </body>
  24. </html>

访问兄弟节点

nextSibling / nextElementSibling

previousSibling / previousElementSibling

  1. nextSibling / nextElementSibling 属性可返回某个节点之后紧跟的节点(处于同一树层级中)。

语法:

nodeObject.nextSibling

说明:如果无此节点,则该属性返回 null。

  1. previousSibling / previousElementSibling 属性可返回某个节点之前紧跟的节点(处于同一树层级中)。

语法:

nodeObject.previousSibling

说明:如果无此节点,则该属性返回 null。

两个属性获取的是节点。Internet Explorer 会忽略节点间生成的空白文本节点(例如,换行符号),而其它浏览器不会忽略。

解决问题方法:

  1. 判断节点nodeType是否为1, 如是为元素节点,跳过。
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>nextSibling</title>
  6. </head>
  7. <body>
  8. <ul id="u1">
  9. <li id="a">javascript</li>
  10. <li id="b">jquery</li>
  11. <li id="c">html</li>
  12. </ul>
  13. <ul id="u2">
  14. <li id="d">css3</li>
  15. <li id="e">php</li>
  16. <li id="f">java</li>
  17. </ul>
  18. <script type="text/javascript">
  19. function get_nextSibling(n) {
  20. var x = n.nextSibling;
  21. while (x && x.nodeType != 1) {
  22. x = x.nextSibling;
  23. }
  24. return x;
  25. }
  26. var x = document.getElementsByTagName("li")[0];
  27. document.write(x.nodeName);
  28. document.write(" = ");
  29. document.write(x.innerHTML);
  30. var y = get_nextSibling(x);
  31. if (y != null) {
  32. document.write("<br />nextsibling: ");
  33. document.write(y.nodeName);
  34. document.write(" = ");
  35. document.write(y.innerHTML + "<br>");
  36. } else {
  37. document.write("<br>已经是最后一个节点");
  38. }
  39. function get_previousSibling(n) {
  40. // 这里还有一个参数, previousSibling.
  41. // 但是后面x.nodeType = 3. 注意一下.
  42. var x = n.previousElementSibling;
  43. while (x && x.nodeType != 1) {
  44. x = x.get_previousSibling;
  45. }
  46. return x;
  47. }
  48. var a = document.getElementsByTagName("li")[5];
  49. document.write(a.nodeName);
  50. document.write(" = ");
  51. document.write(a.innerHTML);
  52. var b = get_previousSibling(a);
  53. if (b != null) {
  54. document.write("<br />previousSbling: ");
  55. document.write(b.nodeName);
  56. document.write(" = ");
  57. document.write(b.innerHTML);
  58. } else {
  59. document.write("<br>已经是第一个节点");
  60. }
  61. </script>
  62. </body>
  63. </html>

插入节点

appendChild()

在指定节点的最后一个子节点列表之后添加一个新的子节点

语法

appendChild(newnode)

参数

newnode: 指定追加的节点.

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>无标题文档</title>
  6. </head>
  7. <body>
  8. <ul id="test">
  9. <li>JavaScript</li>
  10. <li>HTML</li>
  11. </ul>
  12. <script type="text/javascript">
  13. var otest = document.getElementById("test");
  14. // 创建元素
  15. var newnode = document.createElement("li"); // 元素类型
  16. newnode.innerText = "newElement PHP";
  17. otest.appendChild(newnode);
  18. </script>
  19. </body>
  20. </html>

insertBefore()

insertBefore() 方法可在已有的子节点前插入一个新的子节点

语法

node.insertBefore(newNode,node);

参数

newNode 要插入的新节点

node 指定此节点前插入新节点

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>insertBefore() 节点前插入新节点</title>
  6. </head>
  7. <body>
  8. <ul id="test">
  9. <li>JavaScript</li>
  10. <li>HTML</li>
  11. </ul>
  12. <script type="text/javascript">
  13. var otest = document.getElementById("test");
  14. var nd = document.getElementsByTagName("li")[1];
  15. // 创建新节点
  16. var newNode = document.createElement("li");
  17. newNode.innerHTML = "insertBefore HTML";
  18. // 指定节点前插入节点.
  19. otest.insertBefore(newNode,nd);
  20. </script>
  21. </body>
  22. </html>

removeChild() 删除节点

removeChild() 方法从子节点列表中删除某个节点. 如果删除成功, 此方法可返回被删除的节点. 如果失败, 则返回NULL

语法

nodeObject.removeChild(node)

参数

node 必须, 指定需要删除的节点.

注意: 把删除的子节点赋值给 x,这个子节点不在DOM树中,但是还存在内存中,可通过 x 操作。如果要完全删除对象,给 x 赋 null 值

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>清除节点内容</title>
  6. </head>
  7. <body>
  8. <div id="content">
  9. <h1>html</h1>
  10. <h1>php</h1>
  11. <h1>javascript</h1>
  12. <h1>jquery</h1>
  13. <h1>java</h1>
  14. </div>
  15. <script type="text/javascript">
  16. function clearText() {
  17. var content = document.getElementById("content");
  18. var nodeArr = new Array;
  19. var len = 0;
  20. for (var i = 0; i < content.childNodes.length; i++) {
  21. if (content.childNodes[i].nodeType == 1) {
  22. console.log(content.childNodes[i]);
  23. var x = content.removeChild(content.childNodes[i]);
  24. document.write("<br>清除的节点内容为: " + x.innerText + "<br>")
  25. }
  26. }
  27. }
  28. </script>
  29. <button onclick="clearText()">清除节点内容</button>
  30. </body>
  31. </html>

replaceChild() 替换元素节点

replaceChild 实现子节点(对象)的替换. 返回被替换对象的引用.

语法

node.replaceChild(newnode, oldnew)

参数

newnode : 必需,用于替换 oldnew 的对象。
oldnew : 必需,被 newnode 替换的对象。

注意:

  1. 当 oldnode 被替换时,所有与之相关的属性内容都将被移除。
  2. newnode 必须先被建立。
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>替换节点内容</title>
  6. </head>
  7. <body>
  8. <div><b id="oldnode">JavaScript</b>是一个很常用的技术,为网页添加动态效果。</div>
  9. <a href="javascript:replaceMessage()"> 将加粗改为斜体</a>
  10. <script type="text/javascript">
  11. function replaceMessage() {
  12. // 创建标签
  13. var newnode = document.createElement('i');
  14. // 创建文本, 这里可以通过ID 获取到 oldnode 中的 innerText
  15. var newnodeText = document.createTextNode(document.getElementById('oldnode').innerText);
  16. // 等同于 var newnodeText = document.createTextNode('javaScript');
  17. // 拼接. 把文本放置在i标签中
  18. newnode.appendChild(newnodeText);
  19. // 获取旧节点
  20. var oldnode = document.getElementById('oldnode');
  21. // 替换node节点
  22. oldnode.parentElement.replaceChild(newnode,oldnode);
  23. }
  24. </script>
  25. </body>
  26. </html>

createElement 创建元素节点

createElement()方法可创建元素节点. 此方法可返回一个Element对象.

语法:

document.createElement(tagName)

参数:

tagName 字符串值, 这个字符串用来指明创建元素的类型.

注意: 要与appendChild() 或 insertBefore() 方法联合使用, 将元素显示在页面中 .

创建一个按钮:

  1. <script type="text/javascript">
  2. var body = document.body;
  3. var input = document.createElement("input");
  4. input.type = "button";
  5. input.value = "创建一个按钮";
  6. body.appendChild(input);
  7. </script>

效果:在HTML文档中,创建一个按钮。

我们也可以使用setAttribute来设置属性,代码如下:

  1. <script type="text/javascript">
  2. var body = document.body;
  3. var btn = document.createElement("input");
  4. btn.setAttribute("type", "text");
  5. btn.setAttribute("name", "q");
  6. btn.setAttribute("value", "使用setAttribute");
  7. btn.setAttribute("onclick", "javascript:alert('This is a text!');");
  8. body.appendChild(btn);
  9. </script>

效果:在HTML文档中,创建一个文本框,使用setAttribute设置属性值。 当点击这个文本框时,会弹出对话框“This is a text!”。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议