第二章 DOM初识之节点的属性和操作

2.4 DOM的属性

nodeName

文档里的每个节点都有以下属性。 
nodeName:一个字符串,其内容是给定节点的名字。 
var name = node.nodeName; 
* 如果节点是元素节点,nodeName返回这个元素的名称 
* 如果是属性节点,nodeName返回这个属性的名称 
* 如果是文本节点,nodeName返回一个内容为#text 的字符串 
注:nodeName 是一个只读属性。

nodeType

nodeType:返回一个整数,这个数值代表着给定节点的类型。 
nodeType 属性返回的整数值对应着 12 种节点类型,常用的有三种: 
Node.ELEMENT_NODE —1 – 元素节点 
Node.ATTRIBUTE_NODE —2 – 属性节点 
Node.TEXT_NODE —3 – 文本节点 
nodeType 是个只读属性

nodeValue

nodeValue:返回给定节点的当前值(字符串) 
如果给定节点是一个属性节点,返回值是这个属性的值。 
如果给定节点是一个文本节点,返回值是这个文本节点的内容。 
如果给定节点是一个元素节点,返回值是 null 
nodeValue 是一个 读/写 属性,但不能对元素节点的 nodeValue 属性设置值, 
但可以为文本节点的 nodeValue 属性设置一个值。 
var li = document.getElementById(“li”); 
if(li.firstChild.nodeType == 3) 
li.firstChild.nodeValue = “康康康康”; 
[练习1]

<h1 id="h1">明天休息</h1>
  • 1
  • 1

问题: 
打印 ”明天休息” (利用两种方法) 
提示:使用(firstChild lastChild childNodes) 
[练习2]

<ul>
    <li id="bj" value="beijing">
    北京
    <p>海淀</p>
    奥运
    </li>
    <li id="sh" value="shanghai">上海</li>
</ul>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

问题: 
打印出 id=“bj” 该节点的所有子节点的(nodeName, nodeType, nodeValue) 
同时打印文本值 北京 海淀 奥运

[练习3]

<select name="edu" id="edu">
    <option value="本科">本科^^</option>
    <option value="大专">大专^^</option>
    <option value="中专">中专^^</option>
    <option value="幼儿园">幼儿园^^</option>
</select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

问题: 
输出所有select元素下的所有option元素中对应的文本内容 
例如:<option value="中专">中专^^</option> 输出—>中专^^

元素节点

//测试元素节点,输出节点名称,节点的类型,节点的值
  var liElements=document.getElementsByTagName("li");
  for(var i=0;i<liElements.length;i++){
     alert(liElements[i].nodeName);
     alert(liElements[i].nodeType);
     alert(liElements[i].nodeValue);
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

属性节点

//测试属性节点,输出属性节点名称,节点的类型,节点的值
  var liElements=document.getElementsByTagName("li");
  for(var i=0;i<liElements.length;i++){
      var attrElement=liElements[i].getAttributeNode("value")
      alert("attrElement.nodeName "+attrElement.nodeName);
      alert("attrElement.nodeType "+attrElement.nodeType);
      alert("attrElement.nodeValue "+liElements[i].getAttribute("value"));
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

文本节点

//测试元素节点,输出节点名称,节点的类型,节点的值
  var liElements=document.getElementsByTagName("li");
  for(var i=0;i<liElements.length;i++){
   alert(liElements[i].childNodes[0].nodeName);
   alert(liElements[i].childNodes[0].nodeType);
   alert(liElements[i].childNodes[0].nodeValue);
   liElements[i].childNodes[0].nodeValue="南京";
   alert(liElements[i].childNodes[0].nodeValue);
   //另一种读取方法
   alert(liElements[i].firstChild.nodeName);
   alert(liElements[i].firstChild.nodeType);
   alert(liElements[i].firstChild.nodeValue);
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.5 节点的操作

替换节点

replaceChild() 
把一个给定父元素里的一个子节点替换为另外一个子节点

var reference = element.replaceChild(newChild,oldChild);
  • 1
  • 1

返回值是一个指向已被替换的那个子节点的引用指针。 
如果被插入的子节点还有子节点,则那些子节点也被插入到目标节点中。

[练习4]

您喜欢的城市:<br/>
<ul id="city">
    <li id="bj" value="beijing">北京</li>
    <li id="sh" value="shanghai">上海</li>
    <li id="cq" value="chongqing">重庆</li>
</ul>
您喜欢的游戏:<br/>
<ul id="game">
    <li id="fk" value="fankong">反恐<p id="jingying">精英</p></li>
    <li id="ms" value="moshou">魔兽</li>
    <li id="hj" value="hongjing">红警</li>
</ul>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

问题:当单击“北京”这个节点时,北京这个节点被“反恐精英”替换

替换节点例子

//方法一
//  var cityElement=document.getElementById("city");
//  var loveElement=document.getElementById("love");
//  var cityChildElement=document.getElementById("beijing");
//  var loveChildElement=document.getElementById("fankong");
//  var oldElement=cityElement.replaceChild(loveChildElement,cityChildElement);
//  loveElement.appendChild(oldElement);
//  alert(oldElement.getAttribute("id")); 

  var cityElement=document.getElementById("city");
         cityElement.onclick=function(){
         var cityChildElement=document.getElementById("beijing");
         var loveChildElement=document.getElementById("fankong");
         var oldElement=cityElement.replaceChild(loveChildElement,cityChildElement);
         loveElement.appendChild(oldElement);
         alert(oldElement.getAttribute("id"));
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

查找属性节点

getAttribute() 
返回一个给定元素的一个给定属性节点的值 
var attributeValue = element.getAttribute(attributeName); 
给定属性的名字必须以字符串的形式传递给该方法。 
给定属性的值将以字符串的形式返回,如果给定属性不存在,getAttribute() 将返回一个空字符串. 
通过属性获取属性节点 
getAttributeNode(属性的名称)–Node

  <li name="beijing" id="bj">北京</li> 

   //通过属性名获取属性的值
     var  bjElement=document.getElementById("bj");
     var attributeValue=eduElement.getAttribute("name");
     alert("attributeValue    "+attributeValue);

   //通过属性名获取属性的节点
   var  bjNode=eduElement.getAttributeNode("name");
       alert(eduNode.nodeValue);
       alert(eduNode.nodeType);
       alert(eduNode.nodeName);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

设置属性节点

setAttribute() 
将给定元素节点添加一个新的属性值或改变它的现有属性的值。 
element.setAttribute(attributeName,attributeValue); 
属性的名字和值必须以字符串的形式传递给此方法 
如果这个属性已经存在,它的值将被刷新; 
如果不存在,setAttribute()方法将先创建它再为其赋值。

   <li  id="bj" >北京</li> 

   //获取元素的引用
   var bjElement=document.getElementById("bj");
   //设置属性值
   bjElement.setAttribute("name","beijing");
   //获取设置的属性值
   var nameValue=bjElement.getAttribute("name");
   alert("nameValue "+nameValue);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

创建新元素节点

createElement() 
按照给定的标签名创建一个新的元素节点。方法只有一个参数:将被创建的元素的名字,是一个字符串. 
var reference = document.createElement(element); 
方法的返回值:是一个指向新建节点的引用指针。返回值是一个元素节点,所以它的 nodeType 属性值等于 1。 
新元素节点不会自动添加到文档里,新节点没有 nodeParent 属性,它只是一个存在于 JavaScript 上下文的对象. 
var pElement = document.createElement(“p”);

   //创建一个新的元素
  var pElement=document.createElement("li");
  //设置属性值
  pElement.setAttribute("id","pid");

  //获取父元素
  var loveElement=document.getElementById("love");
  //在父元素中增加子元素
loveElement.appendChild(pElement);

  //通过id获取刚创建的元素
  var pidElement=document.getElementById("pid");
  alert(pidElement.getAttribute("id"));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

创建新文本节点

createTextNode() 
创建一个包含着给定文本的新文本节点。这个方法的返回值是一个指向新建文本节点引用指针。 
var textNode = document.createTextNode(text); 
方法只有一个参数:新建文本节点所包含的文本字符串 
方法的返回值:是一个指向新建节点的引用指针。它是一个文本节点,所以它的 nodeType 属性等于 3. 
新元素节点不会自动添加到文档里,新节点没有 nodeParent 属性

  var pElementText=document.createElement("li");
  var textElement=document.createTextNode("南京");
  pElementText.appendChild(textElement);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

插入节点

(1)appendChild() 
为给定元素增加一个子节点: 
var newreference = element.appendChild(newChild). 
给定子节点 newChild 将成为给定元素节点 element 的最后一个子节点。 
方法的返回值是一个指向新增子节点的引用指针。 
该方法通常与 createElement() createTextNode() 配合使用 
新节点可以被追加给文档中的任何一个元素

var newliElement=document.createElement("li");
 var textNode=document.createTextNode("北京");
 newliElement.appendChild(textNode);
 document.body.appendChild(newliElement);

 var liElement=document.getElementsByTagName("li");
 var textValue=liElement[0].firstChild.nodeValue;
 alert(textValue);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

[练习5]

<select name="edu" id="edu">
    <option value="博士">博士^^^^</option>
    <option value="硕士">硕士^^^^</option>
    <option value="本科">本科^^^^</option>
    <option value="幼儿园">幼儿园^^^^</option>
</select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

问题: 在id=edu下增加<option value="大专">大专^^^^^</option> 
(2)insertBefore() 
把一个给定节点插入到一个给定元素节点的给定子节点的前面 
var reference = element.insertBefore(newNode,targetNode); 
节点 newNode 将被插入到元素节点 element 中并出现在节点 targetNode 的前面. 
节点 targetNode 必须是 element 元素的一个子节点。 
该方法通常与 createElement() 和 createTextNode() 配合使用

  <ul id="city">     
      <li value="beijing^" id="beijing">北京</li>
  </ul>
  <ul id="city01">
      <li value="shanghai^" id="shanghai">上海</li>
  </ul>

 //获取父节点
 var parentCityNode=document.getElementById("city");
 //获取子节点
 var beijingNode=document.getElementById("beijing");
 var shanghaiNode=document.getElementById("shanghai");
 //插入
 parentCityNode.insertBefore(shanghaiNode,beijingNode);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
<ul id="city">
        <li value="beijing^" id="beijing">北京</li>
 </ul>
 //获取父节点
 var parentCityNode=document.getElementById("city");
 //获取子节点
 var beijingNode=document.getElementById("beijing");
 //创建节点newShanghaiNode
 var newShanghaiNode=document.createElement("li"); 
 //创建newShanghaiNode节点的文本节点
 var newTextNode=document.createTextNode("上海");
//在创建的节点上增加文本
 newShanghaiNode.appendChild(newTextNode);
 //插入节点
 parentCityNode.insertBefore(newShanghaiNode,beijingNode);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(3)DOM 没有提供 insertAfter() 方法

function insertAfter(newElement,targetElement){
   //获取目标元素的父节点
    var parentElement=targetElement.parentNode;
   //如果目标元素是最后一个元素,则新元素插入到目标元素的后面
    if(parentElement.lastChild==targetElement){
        parentElement.appendChild(newElement);
            }else{//如果目标元素不是最后一个元素,则新元素插入到目标元素的下一个兄弟节点的前面,即目标元素的后面
            parentElement.insertBefore(newElement,targetElement.nextSibling);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

删除节点

removeChild() 
从一个给定元素里删除一个子节点 
var reference = element.removeChild(node); 
返回值是一个指向已被删除的子节点的引用指针。 
某个节点被removeChild()方法删除时,这个节点所包含的所有子节点将同时被删除。

<ul id="city">  <li value="beijing^" id="beijing">北京</li> </ul>
 var ulElement=document.getElementById("city");
 var liElement=document.getElementById("beijing");
 ulElement.removeChild(liElement);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

如果想删除某个节点,但不知道它的父节点是哪一个,parentNode 属性可以帮忙。

<ul id="city">
    <li value="beijing^" id="beijing">北京</li>
</ul>
   var liElement=document.getElementById("beijing");
   var parentElement=liElement.parentNode;
   parentElement.removeChild(liElement);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

遍历节点树

ChildNodes:返回一个数组,这个数组由给定元素节点的子节点构成: 
var nodeList = node.childNodes; 
文本节点和属性节点都不可能再包含任何子节点,所以它们的 ChildNodes 属性永远会返回一个空数组。 
如果想知道某个元素有没有子节点,可以用 hasChildNodes 方法。 
如果想知道某个元素有多少个子节点,可以用 childNodes 数组的 length 属性。 
childNodes 属性是一个只读属性。

获取第一个子节点

firstChild:该属性返回一个给定元素节点的第一个子节点,返回这个节点对象的指针。 
var reference = node.firstChild; 
文本节点和属性节点都不可能包含任何子节点,所以它们的 firstChild 属性永远会返回 null。 
某个元素的 firstChild 属性等价于这个元素的 childNodes 节点集合中的第一个节点,即: 
var reference = node.ChildNodes[0]; 
firstChild 属性是一个只读属性。

获取最后一个子节点

lastChild:对应 firstChild 的一个属性。 
nextSibling: 返回一个给定节点的下一个兄弟节点。 
parentNode:返回一个给定节点的父节点。 
parentNode 属性返回的节点永远是一个元素节点,因为只有元素节点才有可能包含子节点。 
document 节点的没有父节点。 
previousSibling:返回一个给定节点的上一个兄弟节点

innerHTML属性

浏览器几乎都支持该属性,但不是 DOM 标准的组成部分。 
innerHTML 属性可以用来读,写某给定元素里的 HTML 内容。

<div id="city"></div>
  var divElement=document.getElementById("city");
  divElement.innerHTML="<li value='beijing^'' id='beijing'>北京</li>";
posted @ 2017-01-11 16:02  天涯海角路  阅读(308)  评论(0)    收藏  举报