HTML 属性操作 - 对象属性

HTML 属性操作,指的是使用 JavaScript 来操作一个元素的 HTML 属性。如下面的 input 元素,HTML 属性操作指的就是操作它的 id、type、value 等,其他元素也类似。

  1. <input type="button" id="btn" value="替换">

获取 HTML 值

  1. obj.attr

obj 是元素名,它是一个 DOM 对象。所谓的 DOM 对象,指的是使用 getElementById( )、getElementsByTagName( )等方法获取的元素节点。我们在后面的章节中说到的 DOM 对象指的就是它。attr 是属性名,对于一个对象来说,可以通过点运算符(.)来获取它的属性值。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      oBtn.onclick=function(){
        alert(oBtn.id)
      }
    }
  </script>
</head>

<body>
  <input type="button" class="myBtn" id="btn" value="获取">
</body>

</html>
想要获得某个属性的值,首先需要使用 getElementById( )等方法找到这个元素节点,然后才可以获取该属性的值。
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      //创建一个动态按钮
      var oInput = document.createElement("input");
      oInput.id = "submit";
      oInput.type = "button";
      oInput.value = "提交";
      document.body.appendChild(oInput);
      //为按钮添加点击事件
      oInput.onclick = function(){
        alert(oInput.id);
      }
    }
  </script>
</head>
<body>
</body>
</html>
obj.value
对于单行文本框,HTML默认给它添加了一个value属性
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      var oFruite = document.getElementsByName("fruit");
      oBtn.onclick = function(){
        for(var i = 0;i<oFruite.length;i++){
          if(oFruite[i].checked){
            alert(oFruite[i].value);
          }
        }
      }
    }
  </script>
</head>
<body>
  <div>
    <label for=""><input type="radio" name="fruit" value="苹果" checked>苹果</label>
    <label for=""><input type="radio" name="fruit" value="香蕉" checked>香蕉</label>
    <label for=""><input type="radio" name="fruit" value="西瓜" checked>西瓜</label>
  </div>
  <input type="button" id="btn" value="获取">
</body>
</html>
document.getElementsByName("fruit")表示获取所有 name 属性值为 fruit 的表单元素。getElementsByName( )只限用于表单元素,它获取的也是一个元素集合,也就是类数组。
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      var oFruite = document.getElementsByName("fruit");
      oBtn.onclick = function(){
        var str = "";
        for(var i = 0;i<oFruite.length;i++){
          if(oFruite[i].checked){
            str+=oFruite[i].value;
          }
        }
        alert(str);
      }
    }
  </script>
</head>
<body>
  <div>
    <label for=""><input type="checkbox" name="fruit" value="苹果" checked>苹果</label>
    <label for=""><input type="checkbox" name="fruit" value="香蕉" >香蕉</label>
    <label for=""><input type="checkbox" name="fruit" value="西瓜" >西瓜</label>
  </div>
  <input type="button" id="btn" value="获取">
</body>
</html>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      var oSelect = document.getElementById("select");
      oBtn.onclick = function () {
        alert(oSelect.value);
      }
    }
  </script>
</head>

<body>
  <select name="s" id="select">
    <option value="beijing">beijing</option>
    <option value="shanghai">shanghai</option>
    <option value="guangzhou">guangzhou</option>
    <option value="shenzhen">shenzhen</option>
    <option value="hangzhou">hangzhou</option>
  </select>
  <input type="button" id="btn" value="获取">
</body>

</html>
下拉菜单有点特殊,当用户选中一个 option 时,该 option 的 value 值就会自动变成当前 select 元素的 value 值。其中,value 是传给后台处理的,而标签中的文本是给用户看的。在大多数情况下,这两个值是一样的,有时会不一样,这取决于我们的开发需求。

设置 HTML 属性值

obj.attr = “属性值”;

HTML 属性操作 - 对象方法

getAttribute( )

obj.grtAttribute("attr")
obj.attr
上边的方法可以做到一些下边方法做不到的效果。
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      oBtn.onclick = function(){
        // alert(oBtn.data987);
        alert(oBtn.getAttribute("data987"));
      }
    }
  </script>
</head>

<body>
  <input type="button" id="btn" value="修改" data987="JS">
</body>

</html>
其中 data987 是一个用户自定义类型,此时 13 行 obj.attr (对象属性方式)的方式不再适用,而 obj.getAttribute("dis") (对象方法方式)可以实现目的。

setAttribute( )

obj.setAttribute("attr","值")
obj.attr = "值";

obj是元素名,attr是属性名。setAttribute( )方法有两个参数:第1个参数是属性名,第2个参数是要设置的属性值。两种设置属性值的形式是等价的。

同样,对于自定义属性也只能用第一个方式实现。

removeAttribute( )

obj.removeAttribute("attr");
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    .main {
      color: aqua;
    }
  </style>
  <script>
    window.onload = function () {
      var oP = document.getElementsByTagName("h1");
      oP[0].onclick = function () {
        oP[0].removeAttribute("class");
      }
    }
  </script>
</head>

<body>
  <h1 class="main">你点我呀</h1>
</body>

</html>
removeAttribute( )在更多情况下是结合 class 属性来“整体”控制元素的样式属性。
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    .main {
      color: aqua;
    }
  </style>
  <script>
    window.onload = function () {
      var oP = document.getElementsByTagName("p");
      var oAdd = document.getElementById("add");
      var oRemove = document.getElementById("remove");
      oAdd.onclick = function(){
        oP[0].className = "main";
      }
      oRemove.onclick = function(){
        oP[0].removeAttribute("class");
        oP[0].className = "";
      }
    }
  </script>
</head>

<body>
  <p class="main">我飘向北方</p>
  <input type="button" id="add" value="添加属性">
  <input type="button" id="remove" value="去除属性">
</body>

</html>

hasAttribute( )

obj.hasAttribute("attr")
返回一个布尔值,判断元素是否含有某一个属性。我们直接使用 removeAttribute( )删除元素的属性的做法是不太正确的,比较严谨的做法是先用 hasAttribute( )判断这个属性是否存在,只有存在,才去删除。
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    .main {
      color: aqua;
    }
  </style>
  <script>
    window.onload = function () {
      var oP = document.getElementsByTagName("p");
      var oAdd = document.getElementById("add");
      var oRemove = document.getElementById("remove");
      oAdd.onclick = function(){
        oP[0].className = "main";
      }
      oRemove.onclick = function(){
        if(oP[0].hasAttribute("class")){
        oP[0].removeAttribute("class");
        //oP[0].className = "";
        }
      }
    }
  </script>
</head>

<body>
  <p class="main">我飘向北方</p>
  <input type="button" id="add" value="添加属性">
  <input type="button" id="remove" value="去除属性">
</body>

</html>

CSS 属性操作

获取 CSS 属性值

getComputedStyle(obj).attr
getComputedStyle(obj).["attr"]

obj 表示 DOM 对象,也就是通过 getElementById( )、getElementsByTagName( )等方法获取的元素节点。attr 表示 CSS 属性名。需要注意的是,这里的属性名使用的是“骆驼峰型”的 CSS 属性名。何为“骆驼峰型”?如 font-size 应该写成 fontSize , border-bottom-width 应该写成 borderBottomWidth(看起来像骆驼峰)。JS 命名中不能出现“-”,所以要修改形式。

从命名中可以看出,最后得到的是经过计算后的数据。所谓“计算后的样式”,是指不管是内部样式,还是行内样式,最终获取的是根据 CSS 优先级计算后的结果。

设置 CSS 属性值

style 对象

使用 style 对象来设置一个 CSS 属性的值,其实就是在元素的 style 属性中添加样式,这种方式设置的是“行内样式”。

obj.style.attr = "值";
obj 表示 DOM 对象,attr 表示 CSS 属性名,采用的同样是“骆驼峰”型。
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    #box
    {
      width: 200px;
      height: 200px;
      background-color: wheat;
    }
  </style>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      var oBox = document.getElementById("box");
      oBtn.onclick = function(){
        var attr = document.getElementById("attr").value;
        var val = document.getElementById("val").value;
        oBox.style[attr] = val;
      };
    }
  </script>
</head>

<body>
  属性: <input type="text" id="attr"><br>
  取值: <input type="text" id="val"><br>
  <input type="button" id="btn" value="设置">
  <div id="box"></div>
</body>

</html>

cssText 属性

在 JavaScript 中,我们可以使用 cssText 属性来同时设置多个 CSS 属性,这也是在元素的 style 属性中添加的。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    #box
    {
      width: 200px;
      height: 200px;
      background-color: wheat;
    }
  </style>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      var oBox = document.getElementById("box");
      oBtn.onclick = function(){
        var txt = document.getElementById("txt").value;
        oBox.style.cssText=txt;
      }
    }
  </script>
</head>

<body>
  <input type="text" id="txt">
  <input type="button" id="btn" value="设置盒子属性">
  <div id="box"></div>
</body>

</html>
上述方式比较少用,通常是通过给元素添加一个类标签实现为整体添加样式。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    .oldBox
    {
      width: 100px;
      height: 100px;
      background-color: palegoldenrod;
    }
    .newBox
    {
      width: 100px;
      height: 100px;
      background-color: rgb(170, 197, 238);
    }
  </style>
  <script>
    window.onload = function(){
      var oBtn = document.getElementById("btn");
      var oBox = document.getElementById("box")
      oBtn.onclick = function(){
        oBox.className = "newBox";
      }
    }
  </script>
</head>
<body>
  <input type="button" id="btn" value="change">
  <div id="box" class="oldBox"></div>
</body>
</html>

DOM 遍历

DOM 遍历,可以简单地理解为“查找元素”。举个例子,如果你使用 getElementById( )等方法获取一个元素,然后又想得到该元素的父元素、子元素,甚至是下一个兄弟元素,这种操作涉及的就是 DOM 遍历。

JS 中 DOM 遍历一般分为三种情况:查找父元素/子元素/兄弟元素。

查找父元素

obj.parentNode
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    table{border-collapse: collapse;}
    table,td,tr{border: 1px solid gray;}
  </style>
  <script>
    window.onload = function(){
      var oTd = document.getElementsByTagName("td")
      //遍历 td 元素
      for(var i = 0;i<oTd.length;i++){
        //为每一个 td 添加点击事件
        oTd[i].onclick = function(){
          var oParent = this.parentNode;
          oParent.style.color = "white"
          oParent.style.backgroundColor = "red";
        }
      }
    }
  </script>
</head>
<body>
  <table>
    <caption>成绩表</caption>
    <tr>
      <td>name</td>
      <td>Chinese</td>
      <td>Math</td>
      <td>English</td>
    </tr>
    <tr>
      <td>xiaoming</td>
      <td>100</td>
      <td>100</td>
      <td>100</td>
    </tr>
  </table>
</body>
</html>

查找子元素

childNodes, firstChild, lastChild, children, 
firstElementChild, lastElementChild.

其中,childNodes 获取的是所有的子节点。注意,这个子节点是包括元素节点以及文本节点的。而 children 获取的是所有的元素节点,不包括文本节点。

查找兄弟元素

previousSibling、nextSibling。
previousElementSibling、nextElementSibling。

兄弟节点和元素兄弟节点的区别,同查找子元素类似。

innerHTML 和 innerText

在 JavaScript 中,我们可以使用 innerHTML 属性很方便地获取和设置一个元素的“内部元素”,也可以使用 innerText 属性获取和设置一个元素的“内部文本”。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function(){
      var oP = document.getElementById("content");
      document.getElementById("txt1").value = oP.innerHTML;
      document.getElementById("txt2").value = oP.innerText;
    }
  </script>
</head>
<body>
  <p id="content"><strong style="color: aqua;">四月</strong></p>
  innerHTML 是: <input type="text" id="txt1"><br>
  innerText 是: <input type="text" id="txt2">
</body>
</html>