Home >Web Front-end >HTML Tutorial >DOM之节点的基本属性_html/css_WEB-ITnose

DOM之节点的基本属性_html/css_WEB-ITnose

WBOY
WBOYOriginal
2016-06-24 11:21:101658browse

Dom节点是一个对象, 它包含了关于他自己的属性信息和他的内容. 有些属性是只读的, 有些属性是可以更改的.

结构和内容属性

nodeType

下面是所有的节点类型. 总共有12种类型节点. 更多的介绍: DOM Level

interface Node {  // NodeType  const unsigned short      ELEMENT_NODE       = 1;  const unsigned short      ATTRIBUTE_NODE     = 2;  const unsigned short      TEXT_NODE          = 3;  const unsigned short      CDATA_SECTION_NODE = 4;  const unsigned short      ENTITY_REFERENCE_NODE = 5;  const unsigned short      ENTITY_NODE        = 6;  const unsigned short      PROCESSING_INSTRUCTION_NODE = 7;  const unsigned short      COMMENT_NODE       = 8;  const unsigned short      DOCUMENT_NODE      = 9;  const unsigned short      DOCUMENT_TYPE_NODE = 10;  const unsigned short      DOCUMENT_FRAGMENT_NODE = 11;  const unsigned short      NOTATION_NODE      = 12;     ...}

  最重要的两个类型是ELEMENT_NODE, 对应的值为1, TEXT_NODE, 对应的值为3. 其他的类型很少使用.

例如, 使用childNodes和类型属性(childNodes[i].nodeType != 1)去迭代显示所有元素节点.

下面是例子的演示:

<body>  <div>Allowed readers:</div>  <ul>    <li>John</li>    <li>Bob</li>  </ul>   <!-- a comment node -->  <script>        var childNodes = document.body.childNodes     for(var i=0; i<childNodes.length; i++) {if (childNodes[i].nodeType != 1) continue       alert(childNodes[i])     }  </script></body>

下面的页面会弹出什么, 大家试试写写看例子?

<!DOCTYPE HTML><html>  <body>     <script>      alert(document.body.lastChild.nodeType)   </script></body>  </html>

nodeName,  tagName

nodeName和tagName包含了元素节点的名称.

例如 document.body:

alert( document.body.nodeName )   // BODY

在HTML任何的nodeName都是大写的, 不过不要紧, 在文档中你可以使用它.

当'nodeName'不是大写的时候.

当nodeName不是大写的时候, 是个特殊情况, 是非常的少见的. 如果感到好奇, 那继续阅读下去.

正如我们所知, 一个浏览器有两种解析方式: HTML模式和XML模式. 通常都是用HTML模式解析, 但是XML文档, 通过XMLHttpRequest(AJAX技术)接收的时候, XML模式激活.

在火狐中, 当XHTML文档有xmlish内容类型的时候,XML模式也被使用.

在XML模式nodeName保留大小写, 因此他们可能呈现"body"和"bOdY"的节点名称.

因此, 如果通过XMLHttpRequest从服务器中加载XML文档到HTML文档中, 他们保持原来的样子.

对于元素节点, nodeName和tagName也是一样的. 

但是nodeName属性在不是元素节点中也是存在的. 这样的节点包含特殊的值, 比如下面的例子:

alert(document.nodeName) // #document

tagName属性在多数节点类型和IE中等于'!'的注释中, 他们是undefined的.

因此, 通常tagName的信息少于nodeName. 但是他的符号简短. 因此,如果你仅在使用元素节点, 你会更喜欢用它.

innerHTML

innerHTML属性是HTML5标准的一部分. 

他允许你访问节点的内容. 下面这个例子将会输出document.body的所有内容,以及通过一个新的内容来代替原有的内容.

<body>  <p>The paragraph</p>  <div>And a div</div>  <script>    alert( document.body.innerHTML ) // read current contents    document.body.innerHTML = 'Yaaahooo!' // replace contents  </script></body>

innerHTML需要包含一个有效的HTML.但是通常浏览器可以将那些不友好的HTML解析的很好.

innerHTML在任何元素节点都是有效的. 他在我们写代码中, 非常的有用.

innerHTML陷阱

innerHTML不像看起来那么简单的. 对于一个新手,甚至一个有经验的开发人员, 都会遇到一些陷阱.

只读 `innerHTML` (在IE的表格使用中)

在IE中, innerHTML对于  COL, COLGROUP, FRAMESET, HEAD, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR 是只读的.

在IE中, innerHTML 对于所有的表格相关标签都是只读的(除了TD标签).

`innerHTML` 不能被追加

通常情况下, 我们可以通过innerHTML追加内容(elem.innerHTML += "NEW TEXT"), 例如:

chatDiv.innerHTML +=  "

Hi DOM之节点的基本属性_html/css_WEB-ITnose !
"

chatDiv.innerHTML +=  "How you doing?"

但是实际他是这样工作的:

  1. 原来的内容被去除

  2. 新的值通过innerHTML解析替换.

内容不能被追加, 他是重新构建的. 因此, 所有的图片和其他资源在+=之后, 将会被重载. 比如上面的例子的smile.gif文件.

幸运的是, 我们有另外的方法去更新内容. 更新内容我们就不要使用innerHTML方式了.否则带来性能问题.

nodeValue

innerHTML在标签元素中可以使用.但是对于另外的节点类型, 有nodeValue属性来访问内容.

下面这个例子展示了文本节点和注释的节点内容.

<body>  The text  <!-- A comment -->  <script>    for(var i=0; i<document.body.childNodes.length; i++) {      alert(document.body.childNodes[i].nodeValue)    }  </script></body>

在上面的例子中, 有些会弹出空的数据, 因为有些空白的文本节点. 注意SCRIPT的nodeValue === null. 这是因为SCRIPT是一个元素节点. 元素节点使用innerTHML.

总结

  • nodeType

  • 节点类型, 多说情况下使用的是标签元素节点值为1 和 文本节点,值为3. 属性是只读的.

  • nodeName/tagName

  • 标签名称是大写的. 不是元素标签的节点 nodeName有着特殊的值. 属性是只读的.

  • innerHTML

  • 元素节点的内容. 可写.

  • nodeValue

  • 文本节点的内容. 可写.

DOM节点还有另外的属性, 依靠本身是什么样的标签. 例如, 一个INPUT元素有value和checked属性 A标签有href属性等等

编程的人正在在线培训

"前端编程开发","后端开发","移动开发"等,

需要学习的可以加入群或者微信留言

原创内容,转载请注明出处.

公众微信号:bianchengderen

QQ群: 186659233

欢迎大家传播与分享.

融入编程人的生活,了解他们的思维模式,了解他们的喜怒哀乐,关注编程的人.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn