03-DOM操作练习:基础练习

DOM操作练习

举例1:点击按钮时,显示和隐藏盒子。

代码实现:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. button {
  8. margin: 10px;
  9. }
  10. div {
  11. width: 200px;
  12. height: 200px;
  13. background-color: pink;
  14. }
  15. .show {
  16. display: block;
  17. }
  18. .hide {
  19. display: none;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <button id="btn">隐藏</button>
  25. <div>
  26. 千古壹号
  27. </div>
  28. <script>
  29. //需求:点击button,隐藏盒子。改变文字,在点击按钮,显示出来。
  30. //步骤:
  31. //1.获取事件源和相关元素
  32. //2.绑定事件
  33. //3.书写事件驱动程序
  34. //1.获取事件源和相关元素
  35. var btn = document.getElementById("btn");
  36. var div1 = document.getElementsByTagName("div")[0];
  37. //2.绑定事件
  38. btn.onclick = function () {
  39. //3.书写事件驱动程序
  40. //判断btn的innerHTML属性值,如果为隐藏就隐藏盒子,并修改按钮内容为显示。
  41. //反之,则显示,并修改按钮内容为隐藏
  42. if (this.innerHTML === "隐藏") {
  43. div1.className = "hide";
  44. //修改按钮上的文字(innerHTML)
  45. btn.innerHTML = "显示";
  46. } else {
  47. div1.className = "show";
  48. //修改按钮上的文字(innerHTML)
  49. btn.innerHTML = "隐藏";
  50. }
  51. }
  52. </script>
  53. </body>
  54. </html>

代码解释:

当盒子是显示状态时,就设置为隐藏;当盒子是隐藏状态时,就设置为显示。注意这里的逻辑判断。

另外,这里用到了innerHTHL属性,它可以修改按钮上显示的文字。

代码最终显示的效果如下:

20180127_1518.gif

举例2:美女相册

这里推荐一个网站:

好处是:素材做出来之前,先留出空位,方便以后换图。比如http://via.placeholder.com/400x300这个链接可以生成400*300的占位图片。

需求:

  • (1)点击小图片,改变下面的大图片的src属性值,让其赋值为a链接中的href属性值。
  • (2)让p标签的innnerHTML属性值,变成a标签的title属性值。

为了实现美女相册,代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style type="text/css">
  7. body {
  8. font-family: "Helvetica", "Arial", serif;
  9. color: #333;
  10. margin: 1em 10%;
  11. }
  12. h1 {
  13. color: #333;
  14. background-color: transparent;
  15. }
  16. a {
  17. color: #c60;
  18. background-color: transparent;
  19. font-weight: bold;
  20. text-decoration: none;
  21. }
  22. ul {
  23. padding: 0;
  24. }
  25. li {
  26. float: left;
  27. padding: 1em;
  28. list-style: none;
  29. }
  30. #imagegallery {
  31. list-style: none;
  32. }
  33. #imagegallery li {
  34. margin: 0px 20px 20px 0px;
  35. padding: 0px;
  36. display: inline;
  37. }
  38. #imagegallery li a img {
  39. border: 0;
  40. }
  41. </style>
  42. </head>
  43. <body>
  44. <h2>
  45. 美女画廊
  46. </h2>
  47. <a href="#">注册</a>
  48. <ul id="imagegallery">
  49. <li>
  50. <a href="image/1.jpg" title="美女A">
  51. <img src="image/1-small.jpg" width="100" alt="美女1"/>
  52. </a>
  53. </li>
  54. <li>
  55. <a href="image/2.jpg" title="美女B">
  56. <img src="image/2-small.jpg" width="100" alt="美女2"/>
  57. </a>
  58. </li>
  59. <li>
  60. <a href="image/3.jpg" title="美女C">
  61. <img src="image/3-small.jpg" width="100" alt="美女3"/>
  62. </a>
  63. </li>
  64. <li>
  65. <a href="image/4.jpg" title="美女D">
  66. <img src="image/4-small.jpg" width="100" alt="美女4"/>
  67. </a>
  68. </li>
  69. </ul>
  70. <div style="clear:both"></div>
  71. <img id="image" src="image/placeholder.png" width="450px"/>
  72. <p id="des">选择一个图片</p>
  73. <script>
  74. //需求:
  75. //(1)点击小图片,改变下面的大图片的src属性值,让其赋值为a链接中的href属性值。
  76. //(2)让p标签的innnerHTML属性值,变成a标签的title属性值。
  77. //1.获取事件源和相关元素
  78. //利用元素获取其下面的标签。
  79. var ul = document.getElementById("imagegallery");
  80. var aArr = ul.getElementsByTagName("a"); //获取ul中的超链接<a>
  81. // console.log(aArr[0]);
  82. var img = document.getElementById("image");
  83. var des = document.getElementById("des");
  84. //2.绑定事件
  85. //以前是一个一个绑定,但是现在是一个数组。我们用for循环绑定
  86. for (var i = 0; i < aArr.length; i++) {
  87. aArr[i].onclick = function () {
  88. //3.【核心代码】书写事件驱动程序:修改属性值
  89. img.src = this.href; //this指的是函数调用者,和i并无关系,所以不会出错。
  90. // img.src = aArr[i].href; 注意,上面这一行代码不要写成这样
  91. des.innerHTML = this.title;
  92. return false; //return false表示:阻止继续执行下面的代码。
  93. }
  94. }
  95. </script>
  96. </body>
  97. </html>

代码解释:

(1)获取事件源:我们通过ul.getElementsByTagName("a")来获取ul里面的a元素。

(2)绑定事件:因为要绑定一个数组,所以这里用for循环来绑定

(3)【重要】书写事件驱动程序:这里是用img.src = this.href,而不是用img.src = aArr[i].href。因为this指的是函数的调用者。如果写成后者,等i变成了4,就会一直是4。显然不能达到效果。

(4)代码的最后一行:return false表示:阻止继续执行下面的代码。

实现的效果如下:

20180127_1630.gif

工程文件:

举例3:鼠标悬停时,显示二维码大图

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .code {
  8. width: 50px;
  9. height: 50px;
  10. }
  11. .code a {
  12. display: block;
  13. width: 50px;
  14. height: 50px;
  15. background: url(http://img.smyhvae.com/20180127_QRcode_small.png) no-repeat -159px -51px;
  16. position: relative;
  17. }
  18. .code-big {
  19. position: absolute;
  20. top: 10px;
  21. left: 80px;
  22. }
  23. .hide {
  24. display: none;
  25. }
  26. .show {
  27. display: block;
  28. }
  29. </style>
  30. <script>
  31. window.onload = function () {
  32. //需求:鼠标放到a链接上,显示二维码(添加show类名,去掉hide类名)
  33. // 鼠标移开a链接,隐藏二维码(添加hide类名,去掉show类名)
  34. //1.获取事件源和相关元素
  35. var a = document.getElementsByTagName("a")[0];
  36. var div = document.getElementsByClassName("code-big")[0];
  37. //2.绑定事件
  38. a.onmouseover = fn1; //鼠标悬停时
  39. a.onmouseout = fn2; //鼠标离开时
  40. //定义方法
  41. function fn1() {
  42. //3.书写事件驱动程序
  43. div.className = "code-big show";
  44. //div.className = div.className.replace("hide", "show");
  45. }
  46. function fn2() {
  47. div.className = "code-big hide";
  48. //了解,字符串操作,把字符串中的hide替换成show。
  49. // div.className = div.className.replace("show","hide");
  50. }
  51. }
  52. </script>
  53. </head>
  54. <body>
  55. <div class="code">
  56. <a href="#"></a>
  57. <img src="http://img.smyhvae.com/2016040102.jpg" alt="" class="code-big hide"/>
  58. </div>
  59. </body>
  60. </html>

实现效果:

20180127_1800.gif

表单元素的属性

表单元素的属性包括:type、value、checked、selected、disabled等。

举例1:禁用文本框/解禁文本框

  1. <body>
  2. 账号: <input type="text" value="千古壹号..."/><button>禁用</button><button>解禁</button><br><br>
  3. 密码: <input type="password" value="aaabbbccc"/>
  4. <script>
  5. var inp = document.getElementsByTagName("input")[0];
  6. var btn1 = document.getElementsByTagName("button")[0];
  7. var btn2 = document.getElementsByTagName("button")[1];
  8. btn1.onclick = function () {
  9. inp.disabled = "no"; //禁用文本框。属性值里随便写什么字符串都行,但不能为空。
  10. }
  11. btn2.onclick = function () {
  12. inp.disabled = false; //解禁文本框。让disabled属性消失即可。
  13. // inp.removeAttribute("disabled");
  14. }
  15. </script>
  16. </body>

当文本框被禁用之后,文本框只读,不能编辑,光标点不进去。

上方代码可以看到,禁用文本框的代码是:

  1. inp.disabled = "no"; //让disabled属性出现,即可禁用

我们的目的时让disabled这个属性出现,即可禁用。所以,属性值里可以写数字,可以写任意一个字符串,但不能写0,不能写false,不能为空。一般我们写no。

解禁文本框的代码是:

  1. inp.disabled = false; // 方法1:让disabled属性消失,即可解禁。
  2. inp.removeAttribute("disabled"); //方法2:推荐

我们的目的是删除disabled属性,即可解禁。属性值可以是false,可以是0。但我们一般采用方式2进行解禁。

实现效果:

举例2:文本框获取焦点/失去焦点

细心的读者会发现,京东和淘宝的搜索框,获取焦点时,提示文字的体验是不同的。

京东:

20180127_2000.gif

淘宝:

20180127_2005.gif

其实,淘宝的提示文字,是用一个绝对定位的单独的标签来做的

京东是判断输入框是否获取焦点;淘宝是判断输入框内是否有用户输入的文字。

我们现在来实现一下。代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. input {
  8. width: 300px;
  9. height: 36px;
  10. padding-left: 5px;
  11. color: #ccc;
  12. }
  13. label {
  14. position: absolute;
  15. top: 82px;
  16. left: 56px;
  17. font-size: 12px;
  18. color: #ccc;
  19. cursor: text;
  20. }
  21. .hide {
  22. display: none;
  23. }
  24. .show {
  25. display: block;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. 京东: <input id="inp1" type="text" value="微单相机"/><br><br>
  31. 淘宝: <label for="inp2">电动牙刷</label><input id="inp2" type="text"/><br><br>
  32. placeholder: <input type="text" placeholder="我是placeholder"/>
  33. <script>
  34. //需求:京东的input按钮获取焦点后,立刻删除内容。失去后光标显示文字。
  35. var inp1 = document.getElementById("inp1");
  36. inp1.onfocus = function () {
  37. //判断,如果input里面的内容是“微单相机”,那么把值赋值为“”;
  38. if (this.value === "微单相机") {
  39. inp1.value = "";
  40. inp1.style.color = "#000";
  41. }
  42. }
  43. //失去焦点事件
  44. inp1.onblur = function () {
  45. //判断:如果input内容为空,那么把内容赋值为微单相机。
  46. if (this.value === "") {
  47. inp1.value = "微单相机";
  48. inp1.style.color = "#ccc";
  49. }
  50. }
  51. //需求:在input中输入文字,label标签隐藏;当里面的文字变成空字符串,label显示。
  52. var inp2 = document.getElementById("inp2");
  53. var lab = document.getElementsByTagName("label")[0];
  54. //2.绑定事件(输入文字、和删除文字时,都会触动这个事件)
  55. inp2.oninput = function () {
  56. //判断input中的值是否为空,如果为空,那么label显示,否则隐藏。
  57. if (this.value === "") {
  58. lab.className = "show";
  59. } else {
  60. lab.className = "hide";
  61. }
  62. }
  63. </script>
  64. </body>
  65. </html>

实现效果如下:

20180127_2010.gif

如上方所示,我们还可以用placeholder来做,但是IE678并不支持,所以不建议使用。

举例3:用户注册信息错误时,输入框失去焦点后,高亮显示。

代码实现:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .wrong {
  8. border: 2px solid red;
  9. }
  10. .right {
  11. border: 2px solid #91B81D;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. 账号:<input type="text" onblur="fn(this)"/><br><br>
  17. 密码:<input type="password" onblur="fn(this)"/>
  18. <script>
  19. //需求:失去焦点的时候判断input按钮中的值,如果账号或密码在6-12个字符之间通过,否则报错。
  20. function fn(aaa){
  21. //html中的input标签行内调用function的时候,是先通过window调用的function,所以打印this等于打印window
  22. // console.log(this)
  23. //只有传递的this才指的是标签本身。
  24. // console.log(aaa)
  25. // console.log(this.value)
  26. if(aaa.value.length < 6 || aaa.value.length>12){
  27. aaa.className = "wrong";
  28. }else{
  29. aaa.className = "right";
  30. }
  31. }
  32. </script>
  33. </body>
  34. </html>

代码解释:这次我们是在标签内调用function的,此时是先通过window调用的function。所以行内调用的时候要带this。

实现效果:

20180127_2035.gif

举例4:全选和反选

对应的代码如下:

  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. .my-table {
  12. width: 300px;
  13. margin: 100px auto 0;
  14. }
  15. table {
  16. border-collapse: collapse;
  17. border-spacing: 0;
  18. border: 1px solid #c0c0c0;
  19. width: 300px;
  20. }
  21. th,
  22. td {
  23. border: 1px solid #d0d0d0;
  24. color: #404060;
  25. padding: 10px;
  26. }
  27. th {
  28. background-color: #09c;
  29. font: bold 16px "微软雅黑";
  30. color: #fff;
  31. }
  32. td {
  33. font: 14px "微软雅黑";
  34. }
  35. tbody tr {
  36. background-color: #f0f0f0;
  37. }
  38. tbody tr:hover {
  39. cursor: pointer;
  40. background-color: #fafafa;
  41. }
  42. </style>
  43. <script>
  44. window.onload = function () {
  45. //需求1:点击上面的的input,下面全选或者反选。
  46. //思路:获取了上面的input按钮,只需要判断,checked属性是true还是false,如果是true,下面的全部变成true;false同理。
  47. var topInp = document.getElementById("title");
  48. var tbody = document.getElementById("content");
  49. var botInpArr = tbody.getElementsByTagName("input");
  50. //绑定事件
  51. topInp.onclick = function () {
  52. //费劲版
  53. // for(var i=0;i<botInpArr.length;i++){
  54. // if(topInp.checked === true){
  55. // botInpArr[i].checked = true;
  56. // }else{
  57. // botInpArr[i].checked = false;
  58. // }
  59. // }
  60. //优化版(被点击的input按钮的checked属性值,应该直接作为下面的所有的input按钮的checked属性值)
  61. for(var i=0;i<botInpArr.length;i++){
  62. botInpArr[i].checked = this.checked;
  63. }
  64. }
  65. //需求2:点击下面的的input,如果下面的全部选定了,上面的全选,否则相反。
  66. //思路:为下面的每一个input绑定事件,每点击一次都判断所有的按钮
  67. // checked属性值是否全部都是true,如果有一个是false,
  68. // 那么上面的input的checked属性也是false;都是true,topInp的checked就是true;
  69. for(var i=0;i<botInpArr.length;i++){
  70. botInpArr[i].onclick = function () { //每一个input都要绑定事件
  71. //开闭原则(用开关来控制)
  72. var bool = true;
  73. //检测每一个input的checked属性值。
  74. for(var j=0;j<botInpArr.length;j++){
  75. if(botInpArr[j].checked === false){
  76. bool = false;
  77. }
  78. }
  79. topInp.checked = bool;
  80. }
  81. }
  82. }
  83. </script>
  84. </head>
  85. <body>
  86. <div class="my-table">
  87. <table>
  88. <thead>
  89. <tr>
  90. <th>
  91. <input type="checkbox" id="title" />
  92. </th>
  93. <th>菜名</th>
  94. <th>饭店</th>
  95. </tr>
  96. </thead>
  97. <tbody id="content">
  98. <tr>
  99. <td>
  100. <input type="checkbox" />
  101. </td>
  102. <td>菜品1</td>
  103. <td>木屋烧烤</td>
  104. </tr>
  105. <tr>
  106. <td>
  107. <input type="checkbox" />
  108. </td>
  109. <td>菜品2</td>
  110. <td>蒸菜馆</td>
  111. </tr>
  112. <tr>
  113. <td>
  114. <input type="checkbox" />
  115. </td>
  116. <td>菜品3</td>
  117. <td>海底捞火锅</td>
  118. </tr>
  119. <tr>
  120. <td>
  121. <input type="checkbox" />
  122. </td>
  123. <td>菜品4</td>
  124. <td>面点王</td>
  125. </tr>
  126. </tbody>
  127. </table>
  128. </div>
  129. </body>
  130. </html>

注意代码中的注释,需求2是比较难的地方,这里用到了两次for循环。第一次for循环是因为,要给每个input都要进行绑定事件。

实现的效果如下:

20180127_2320.gif