07-DOM操作练习:innerHTML的方式创建元素

动态创建DOM元素的三种方式

  • document.write(); 不常用,因为容易覆盖原来的页面。

  • innerHTML = (); 用的比较多。绑定属性和内容比较方便。(节点套节点)

  • document.createElement(); 用得也比较多,指定数量的时候一般用它。

1、方式一:

  1. document.write();

这种方式的好处是:比较随意,想创建就创建,可以直接在write里写属性都行。但是会把原来的标签给覆盖掉。所以不建议。

举例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul>
  9. smyhvae
  10. </ul>
  11. <script>
  12. //第一种创建方式:document.write();
  13. document.write("<li class='hehe'>我是document.write创建的</li>");
  14. </script>
  15. </body>
  16. </html>

效果如下:

07-DOM操作练习:innerHTML的方式创建元素 - 图1

方式二:innerHTML

举例如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul>
  9. smyhvae
  10. </ul>
  11. <script>
  12. var ul = document.getElementsByTagName("ul")[0];
  13. //第二种:直接利用元素的innerHTNL方法。(innerText方法不识别标签)
  14. ul.innerHTML += "<li id='li1'>我是innerHTML创建的</li>" //注意,是用符号“+=”,不是“=”
  15. </script>
  16. </body>
  17. </html>

注意,上方代码中,是用是用符号+=,不是=,前者是在原来的基础之上增加,后者是替换。

效果如下:

07-DOM操作练习:innerHTML的方式创建元素 - 图2

3、方式三:利用DOM的api创建

利用DOM的api创建节点,有很多种:

比如:

  • createElement()

  • appendChild()

  • removeChild()

  • insertBefore()

  • replaceChild()

这个我们在上一篇文章的DOM节点的操作这一段中已经讲到了。

innerHTML举例:在线用户的获取

现在要做下面这样一个页面:

07-DOM操作练习:innerHTML的方式创建元素 - 图3

上图的意思是,每次刷新页面,都从服务器获取最新的在线人数的名单(我们先用本地的数组来模拟服务器上的数据)。

它的结构是:div > ul > li。每一个li就是一个头像。

如果在本地直接添加几个头像的话,代码是:

  1. //往ul中添加li元素以及li元素中的内容
  2. ul.innerHTML += '<li>'+
  3. '<a href="#" target="_blank"><img src="images/noavatar_small.gif" width="48" height="48" alt="千古壹号"></a>'+
  4. '<p><a href="#" title="千古壹号" target="_blank">千古壹号</a></p>'+
  5. '</li>';
  6. ul.innerHTML += '<li>'+
  7. '<a href="#" target="_blank"><img src="images/noavatar_small.gif" width="48" height="48" alt="千古壹号"></a>'+
  8. '<p><a href="#" title="千古壹号" target="_blank">千古壹号</a></p>'+
  9. '</li>';
  10. ul.innerHTML += '<li>'+
  11. '<a href="#" target="_blank"><img src="images/noavatar_small.gif" width="48" height="48" alt="千古壹号"></a>'+
  12. '<p><a href="#" title="千古壹号" target="_blank">千古壹号</a></p>'+
  13. '</li>';

上方代码有两点比较重要:

  • 我们是通过ul.innerHTML += 元素节点的方式来不停地往ul里面加内容,比createElement的方式要方便。

  • 元素的内容本身有双引号",所以我们要用单引号'进行字符串的连接。

但是,当我们从服务器获取在线用户的时候,头像和用户的昵称是动态变化的,所以每个字符串要用变量进行表示:

  1. ul.innerHTML += '<li>'+
  2. '<a href="#" target="blank"><img src="'+users[i].icon+'" width="48" height="48" alt="'+users[i].name+'"></a>'+
  3. '<p><a href="#" title="'+users[i].name+'" target="_blank">'+users[i].name+'</a></p>'+
  4. '</li>';

这里我们暂时用本地的数组来代表服务器的数据,最终的完整版代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. * {
  8. word-wrap: break-word;
  9. }
  10. .wp {
  11. width: 730px;
  12. margin: 0px auto;
  13. }
  14. .mtn {
  15. margin-top: 5px !important;
  16. }
  17. #ct .frame {
  18. margin: 0;
  19. border: none;
  20. }
  21. .xfs_2 .frame-title, .xfs_2 .frametitle, .xfs_2 .tab-title {
  22. background-color: #A90000;
  23. background-position: 0 -99px;
  24. }
  25. .xfs .frame-title, .xfs .frametitle, .xfs .tab-title, .xfs .frame-title a, .xfs .frametitle a, .xfs .tab-title a {
  26. color: #FFF !important;
  27. }
  28. .xfs .frame-title, .xfs .frametitle, .xfs .tab-title {
  29. border: none;
  30. background: transparent url(images/mu.png) repeat-x 0 95;
  31. }
  32. .title {
  33. padding: 0 10px;
  34. height: 32px;
  35. font-size: 14px;
  36. font-weight: 700;
  37. line-height: 32px;
  38. overflow: hidden;
  39. }
  40. .block {
  41. margin: 10px 10px 0;
  42. }
  43. ul, menu, dir {
  44. display: block;
  45. list-style: none;
  46. -webkit-margin-before: 1em;
  47. -webkit-margin-after: 1em;
  48. -webkit-margin-start: 0px;
  49. -webkit-margin-end: 0px;
  50. -webkit-padding-start: 25px;
  51. }
  52. .mls li {
  53. padding: 0 0 5px;
  54. width: 66px;
  55. height: 85px;
  56. }
  57. .ml li {
  58. float: left;
  59. text-align: center;
  60. overflow: hidden;
  61. }
  62. a {
  63. color: #333;
  64. text-decoration: none;
  65. font: 12px/1.5 Tahoma, 'Microsoft Yahei', 'Simsun';
  66. }
  67. .mls p {
  68. margin-top: 5px;
  69. }
  70. .ml p, .ml span {
  71. display: block;
  72. width: 100%;
  73. height: 20px;
  74. white-space: nowrap;
  75. text-overflow: ellipsis;
  76. overflow: hidden;
  77. }
  78. .mls img {
  79. width: 48px;
  80. height: 48px;
  81. }
  82. .ml img {
  83. display: block;
  84. margin: 0 auto;
  85. }
  86. a img {
  87. border: none;
  88. }
  89. </style>
  90. </head>
  91. <body>
  92. <div class="wp mtn">
  93. <div id="diy3" class="area">
  94. <div id="frameipq7f2" class="xfs xfs_2 frame move-span cl frame-1">
  95. <div
  96. class="title frame-title"><span class="titletext">当前在线用户</span></div>
  97. <div id="frameipq7f2_left"
  98. class="column frame-1-c">
  99. <div
  100. id="frameipq7f2_left_temp" class="move-span temp"></div>
  101. <div id="portal_block_695"
  102. class="block move-span">
  103. <div
  104. id="portal_block_695_content" class="dxb_bc">
  105. <div class="module cl ml mls" id="users">
  106. <ul>
  107. <!--<li>-->
  108. <!--<a href="#" target="_blank"><img src="images/noavatar_small.gif" width="48" height="48" alt="千古壹号"></a>-->
  109. <!--<p><a href="#" title="千古壹号" target="_blank">千古壹号</a></p>-->
  110. <!--</li>-->
  111. </ul>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. <script>
  120. //模拟从服务器获取数据
  121. var users = [
  122. {"name": "smyhvae", "icon": "images/noavatar_small.gif"},
  123. {"name": "smyh", "icon": "images/noavatar_small.gif"},
  124. {"name": "smyh02", "icon": "images/75_avatar_small.jpg"},
  125. {"name": "vae", "icon": "images/89_avatar_small.jpg"},
  126. {"name": "today", "icon": "images/noavatar_small.gif"},
  127. {"name": "enen", "icon": "images/noavatar_small.gif"},
  128. {"name": "oyey", "icon": "images/noavatar_small.gif"},
  129. {"name": "dongxiaojie", "icon": "images/noavatar_small.gif"},
  130. {"name": "qishi", "icon": "images/noavatar_small.gif"},
  131. {"name": "qqtang", "icon": "images/noavatar_small.gif"},
  132. {"name": "wawawa", "icon": "images/noavatar_small.gif"},
  133. {"name": "haha", "icon": "images/noavatar_small.gif"},
  134. {"name": "robot", "icon": "images/noavatar_small.gif"},
  135. {"name": "heheda", "icon": "images/noavatar_small.gif"},
  136. {"name": "smyhvae1", "icon": "images/noavatar_small.gif"},
  137. {"name": "lihaile", "icon": "images/noavatar_small.gif"}
  138. ];
  139. //需求:页面显示所有的在线用户。
  140. //思路:模拟服务器获取数据(数组中装着json).获取ul,把ul的innerHTML属性获取到,然后不间断的往innerHTML属性中赋值。
  141. //赋值要求:li标签的内容。
  142. //步骤:(获取元素)
  143. var div = document.getElementById("users");
  144. var ul = div.firstElementChild || div.firstChild;
  145. // var ul = div.children[0];
  146. //1.模拟服务器获取数据(定义数组),通过循环添加元素(定义for)
  147. //数组中有多少元素,我们就创建多少个li标签
  148. for (var i = 0; i < users.length; i++) {
  149. //2.模拟实验的操作方式。
  150. ul.innerHTML += '<li>' +
  151. '<a href="#" target="blank"><img src="' + users[i].icon + '" width="48" height="48" alt="' + users[i].name + '"></a>' +
  152. '<p><a href="#" title="' + users[i].name + '" target="_blank">' + users[i].name + '</a></p>' +
  153. '</li>';
  154. }
  155. </script>
  156. </body>
  157. </html>

工程文件:

innerHTML举例2:模拟百度搜索的下方提示

要求实现的效果如下:

07-DOM操作练习:innerHTML的方式创建元素 - 图4

在这之前,我们先实现这样一个例子:判断字符串以某个字符串为开头

判断字符串是否以某个字符串为开头:

  1. var str = "smyhvae";
  2. //判断str是否以sm为开头?(给定字符串,然后他的索引值为0)
  3. var num = str.indexOf("sm");
  4. //只有返回值为0,那么字符串才是以参数为开头
  5. //如果在任何位置都查询不到参数,则返回值为-1;

代码解释:我们可以通过indexOf("参数")来实现。如果返回的索引值为0,说明字符串就是以这个参数开头的。

为了实现上方gif图的搜索功能,完整版代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. }
  11. .box {
  12. width: 500px;
  13. margin: 200px auto;
  14. }
  15. ul {
  16. width: 392px;
  17. padding: 5px;
  18. list-style: none;
  19. border: 1px solid red;
  20. }
  21. li:hover {
  22. background-color: red;
  23. }
  24. input {
  25. width: 400px;
  26. }
  27. button {
  28. width: 70px;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <div class="box">
  34. <input type="text"/>
  35. <button>搜索</button>
  36. <!--<ul>-->
  37. <!--<li>aaaa</li>-->
  38. <!--<li>bbb</li>-->
  39. <!--<li>ccc</li>-->
  40. <!--</ul>-->
  41. </div>
  42. <script>
  43. //需求:输入内容(输入事件,键盘弹起事件),模拟服务器获取内容,创建ul,并在其中显示。
  44. //1.获取事件源
  45. //模拟服务器获取内容
  46. var arr = ["a", "ab", "abc", "abcd", "aa", "aaa"];
  47. var box = document.getElementsByTagName("div")[0];
  48. var inp = box.children[0];
  49. // var inp = document.getElementsByTagName("input")[0];
  50. //2.绑定事件(输入内容(输入事件,键盘弹起事件))
  51. inp.onkeyup = function () {
  52. //创建一个字符串,里面添加满了li和对应的内容。
  53. var newArr = [];
  54. //遍历老数组arr,然后判断每一项,只要是以input的内容为开头的,就添加到新数组newArr中,然后转成字符串。
  55. for (var i = 0; i < arr.length; i++) {
  56. //获取输入内容input标签的value属性值。
  57. if (arr[i].indexOf(this.value) === 0) { //【重要】判断老数组arr中的每一项,是否以input的内容为开头
  58. newArr.push("<li>" + arr[i] + "</li>");
  59. }
  60. }
  61. var str = newArr.join("");
  62. //Bug1:每次创建新的ul之前,如果有就的ul,就先删除旧的ul
  63. if (box.getElementsByTagName("ul")[0]) {
  64. //只要存在,那么就是object,object类型的数据,只要不是null,对应的boolean值都是true;
  65. box.removeChild(box.children[2]);
  66. }
  67. //Bug2.如果input的内容为空,那么就不能再生成ul了。
  68. //如果input为空,那就切断函数
  69. //Bug3.如果arr数组中找不到以input为开头的元素。那就切断函数
  70. //newArr的长度为0,就能证明以input内容为开头的元素,在arr中不存在
  71. if (this.value.length === 0 || newArr.length === 0) { //fix bug2、fix bug3
  72. //切断函数,直接return
  73. return;
  74. }
  75. //3.书写事件驱动程序
  76. var ul = document.createElement("ul");
  77. //把创建好的内容添加到ul中。
  78. ul.innerHTML = str;
  79. box.appendChild(ul);
  80. }
  81. </script>
  82. </body>
  83. </html>

动态操作表格

方式1:

  1. createElement()

方式2:

  • rows (只读,table和textarea能用)

  • insertRow() (只有table能调用)

  • deleteRow() (只有table能调用)

  • cells (只读,table和textarea能用)

  • insertCell() (只有tr能调用)

  • deleteCell() (只有tr能调用)

PS:括号里可以带index。用的不多。