《Javascript 高级程序设计(第三版)》笔记0x10 节点:Element、Text、Comment等

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/funkstill/article/details/84996134

目录

Element类型

    HTML 元素

     取得特性

    设置特性

     attributes 属性

     创建元素

    元素的子节点

Text类型

     创建文本节点

    规范化文本节点

    分割文本节点

 Comment类型

 CDATASection类型

DocumentType类型

 DocumentFragment类型

 Attr类型


Element类型

Element 节点具有以下特征:
    nodeType 的值为 1;
    nodeName 的值为元素的标签名;
    nodeValue 的值为 null;
    parentNode 可能是 Document 或 Element;
    其子节点可能是 Element、 Text、 Comment、 ProcessingInstruction、 CDATASection 或EntityReference。

<div id="myDiv"></div>

var div = document.getElementById("myDiv");
alert(div.tagName); //"DIV"
alert(div.tagName == div.nodeName); //true

        在 HTML 中,标签名始终都以全部大写表示;而在 XML(有时候也包括 XHTML)中,标签名则始终会与源代码中的保持一致。

if (element.tagName == "div"){ //不能这样比较,很容易出错!
	//在此执行某些操作
}
if (element.tagName.toLowerCase() == "div"){ //这样最好(适用于任何文档)
	//在此执行某些操作
}

    HTML 元素

    HTMLElement 类型直接继承自 Element 并添加了一些属性。添加的这些属性分别对应于每个 HTML元素中都存在的下列标准特性。
    id,元素在文档中的唯一标识符。
    title,有关元素的附加说明信息,一般通过工具提示条显示出来。
    lang,元素内容的语言代码,很少使用。
    dir,语言的方向,值为"ltr"(left-to-right,从左至右)或"rtl"(right-to-left,从右至左),也很少使用。
    className,与元素的 class 特性对应,即为元素指定的 CSS 类。没有将这个属性命名为 class,是因为 class 是 ECMAScript 的保留字

<div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr"></div>
var div = document.getElementById("myDiv");
alert(div.id); //"myDiv""
alert(div.className); //"bd"
alert(div.title); //"Body text"
alert(div.lang); //"en"
alert(div.dir); //"ltr"

     取得特性

var div = document.getElementById("myDiv");
alert(div.getAttribute("id")); //"myDiv"
alert(div.getAttribute("class")); //"bd"
alert(div.getAttribute("title")); //"Body text"
alert(div.getAttribute("lang")); //"en"
alert(div.getAttribute("dir")); //"ltr"

    设置特性

div.setAttribute("id", "someOtherId");
div.setAttribute("class", "ft");
div.setAttribute("title", "Some other text");
div.setAttribute("lang","fr");
div.setAttribute("dir", "rtl");

div.removeAttribute("class");

     attributes 属性

    Element 类型是使用 attributes 属性的唯一一个 DOM 节点类型。attributes 属性中包含一个NamedNodeMap,与 NodeList 类似,也是一个“动态”的集合。元素的每一个特性都由一个 Attr 节点表示,每个节点都保存在 NamedNodeMap 对象中。 NamedNodeMap 对象拥有下列方法。
        getNamedItem(name):返回 nodeName 属性等于 name 的节点;
        removeNamedItem(name):从列表中移除 nodeName 属性等于 name 的节点;
        setNamedItem(node):向列表中添加节点,以节点的 nodeName 属性为索引;
        item(pos):返回位于数字 pos 位置处的节点。

var id = element.attributes.getNamedItem("id").nodeValue;

var id = element.attributes["id"].nodeValue;

element.attributes["id"].nodeValue = "someOtherId";

var oldAttr = element.attributes.removeNamedItem("id");

element.attributes.setNamedItem(newAttr);

     创建元素

var div = document.createElement("div");//创建
document.body.appendChild(div);//添加

if (client.browser.ie && client.browser.ie <=7){
	//创建一个带 name 特性的 iframe 元素
	var iframe = document.createElement("<iframe name=\"myframe\"></iframe>");
	//创建 input 元素
	var input = document.createElement("<input type=\"checkbox\">");
	//创建 button 元素
	var button = document.createElement("<button type=\"reset\"></button>");
	//创建单选按钮
	var radio1 = document.createElement("<input type=\"radio\" name=\"choice\" "+"value=\"1\">");
	var radio2 = document.createElement("<input type=\"radio\" name=\"choice\" "+"value=\"2\">");
}

    元素的子节点

Text类型

  文本节点由 Text 类型表示,包含的是可以照字面解释的纯文本内容。纯文本中可以包含转义后的HTML 字符,但不能包含 HTML 代码。 Text 节点具有以下特征:
    nodeType 的值为 3;
    nodeName 的值为"#text";
    nodeValue 的值为节点所包含的文本;
    parentNode 是一个 Element;
    不支持(没有)子节点。
  可以通过 nodeValue 属性或 data 属性访问 Text 节点中包含的文本,这两个属性中包含的值相同。对 nodeValue 的修改也会通过 data 反映出来,反之亦然。使用下列方法可以操作节点中的文本。
    appendData(text):将 text 添加到节点的末尾。
    deleteData(offset, count):从 offset 指定的位置开始删除 count 个字符。
    insertData(offset, text):在 offset 指定的位置插入 text。
    replaceData(offset, count, text):用 text 替换从 offset 指定的位置开始到 offset+count 为止处的文本。
    splitText(offset):从 offset 指定的位置将当前文本节点分成两个文本节点。
    substringData(offset, count):提取从 offset 指定的位置开始到 offset+count 为止处的字符串。

<!-- 没有内容,也就没有文本节点 -->
<div></div>
<!-- 有空格,因而有一个文本节点 -->
<div> </div>
<!-- 有内容,因而有一个文本节点 -->
<div>Hello World!</div>
var textNode = div.firstChild; //或者 div.childNodes[0]
div.firstChild.nodeValue = "Some other message";

//输出结果是"Some &lt;strong&gt;other&lt;/strong&gt; message"
div.firstChild.nodeValue = "Some <strong>other</strong> message";

     创建文本节点

var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
document.body.appendChild(element);

    规范化文本节点

        如果在一个包含两个或多个文本节点的父元素上调用 normalize()方法,则会将所有文本节点合并成一个节点,结果节点的 nodeValue 等于将合并前每个文本节点的 nodeValue 值拼接起来的值。 

var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
var anotherTextNode = document.createTextNode("Yippee!");
element.appendChild(anotherTextNode);
document.body.appendChild(element);
alert(element.childNodes.length); //2
element.normalize();
alert(element.childNodes.length); //1
alert(element.firstChild.nodeValue); // "Hello world!Yippee!"

    分割文本节点

        splitText(),将一个文本节点分成两个文本节点,即按照指定的位置分割 nodeValue 值。原来的文本节点将包含从开始到指定位置之前的内容,新文本节点将包含剩下的文本。返回一个新文本节点,该节点与原节点的parentNode 相同。

var element = document.createElement("div");
element.className = "message";
var textNode = document.createTextNode("Hello world!");
element.appendChild(textNode);
document.body.appendChild(element);
var newNode = element.firstChild.splitText(5);
alert(element.firstChild.nodeValue); //"Hello"
alert(newNode.nodeValue); //" world!"
alert(element.childNodes.length); //2

 Comment类型

    Comment 节点具有下列特征:
        nodeType 的值为 8;
        nodeName 的值为"#comment";
       nodeValue 的值是注释的内容;
       parentNode 可能是 Document 或 Element;
       不支持(没有)子节点。
    Comment 类型与 Text 类型继承自相同的基类,因此它拥有除 splitText()之外的所有字符串操作方法。与 Text 类型相似,也可以通过 nodeValue 或 data 属性来取得注释的内容

<div id="myDiv"><!--A comment --></div>
var div = document.getElementById("myDiv");
var comment = div.firstChild;
alert(comment.data); //"A comment"

 CDATASection类型

    CDATASection 类型只针对基于 XML 的文档,表示的是 CDATA 区域。与 Comment 类似,CDATASection 类型继承自 Text 类型,因此拥有除 splitText()之外的所有字符串操作方法。
    CDATASection 节点具有下列特征:
        nodeType 的值为 4;
        nodeName 的值为"#cdata-section";
        nodeValue 的值是 CDATA 区域中的内容;
        parentNode 可能是 Document 或 Element;
        不支持(没有)子节点。
    CDATA 区域只会出现在 XML 文档中,因此多数浏览器都会把 CDATA 区域错误地解析为 Comment或 Element。

<div id="myDiv"><![CDATA[This is some content.]]></div>

DocumentType类型

    DocumentType 包含着与文档的 doctype 有关的所有信息,它具有下列特征:
        nodeType 的值为 10;
        nodeName 的值为 doctype 的名称;
        nodeValue 的值为 null;
        parentNode 是 Document;
        不支持(没有)子节点。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

alert(document.doctype.name); //"HTML"

 DocumentFragment类型

    DOM 规定文档片段(document fragment)是一种“轻量级”的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源。 DocumentFragment 节点具有下列特征:
        nodeType 的值为 11;
        nodeName 的值为"#document-fragment";
        nodeValue 的值为 null;
        parentNode 的值为 null;
        子节点可以是 Element、 ProcessingInstruction、 Comment、 Text、 CDATASection 或EntityReference。

var fragment = document.createDocumentFragment();
var ul = document.getElementById("myList");
var li = null;
for (var i=0; i < 3; i++){
  li = document.createElement("li");
  li.appendChild(document.createTextNode("Item " + (i+1)));
  fragment.appendChild(li);
}
ul.appendChild(fragment);

 Attr类型

    元素的特性在 DOM 中以 Attr 类型来表示。在所有浏览器中(包括 IE8),都可以访问 Attr 类型的构造函数和原型。从技术角度讲,特性就是存在于元素的 attributes 属性中的节点。特性节点具有下列特征:
        在nodeType 的值为 2;
        在nodeName 的值是特性的名称;
        在nodeValue 的值是特性的值;
        在parentNode 的值为 null;
        在在 HTML 中不支持(没有)子节点;
        在 XML 中子节点可以是 Text 或 EntityReference。

var attr = document.createAttribute("align");
attr.value = "left";
element.setAttributeNode(attr);
alert(element.attributes["align"].value); //"left"
alert(element.getAttributeNode("align").value); //"left"
alert(element.getAttribute("align")); //"left"

猜你喜欢

转载自blog.csdn.net/funkstill/article/details/84996134