ホームページ >ウェブフロントエンド >jsチュートリアル >さらに詳しいJavaScript DOM学習メモ_JavaScriptスキル
多くの js dom 学習資料を読んだ後、これが非常に詳細であることがわかったので、
1. DOM の基本
1. ノード レベル
について学ぶために再版しました。 Document -- the most 他のすべてのノードが接続される最上位ノード。
DocumentType - DTD 参照のオブジェクト表現 (1a309583e26acea4f04ca31122d8c535 構文を使用)。子ノードを含めることはできません。
DocumentFragment - Document などの他のノードを保存できます。
要素 - 8bf259f5a6144433b921fb8b7de949700e9100648b0b4b6da2ed8dd45e1a0e54 や c5732311c9bc8f9578856d5c0fe1f791 など、開始タグと終了タグの間のコンテンツを表します。これは、属性と子ノードの両方を含めることができる唯一のノード タイプです。
Attr - 属性名と属性値のペアを表します。このノード タイプには子ノードを含めることはできません。
Text - XML ドキュメント内の開始タグと終了タグの間の通常のテキスト、または CDataSection に含まれるテキストを表します。このノード タイプには子ノードを含めることはできません。
CDataSection - 706a388e39e8555a9742f4594c5343bf のオブジェクト表現。このノード タイプには、子ノードとしてテキスト ノード Text のみを含めることができます。
Entity - DTD 内のエンティティ定義を表します (f3953a0c47aa44cfd43076fe8e65b58d など)。このノード タイプには子ノードを含めることはできません。
EntityReference - 「」などのエンティティ参照を表します。このノード タイプには子ノードを含めることはできません。
Processingstruction - PI を表します。このノード タイプには子ノードを含めることはできません。
Comment - XML コメントを表します。このノード
表記 - DTD で定義された表記を表します。
ノード インターフェイスは、すべてのノード タイプに含まれるプロパティとメソッドを定義します。
DOM は、ノードに加えて、ノードとともに使用できるいくつかのヘルパー オブジェクトも定義しますが、DOM ドキュメントの必須の部分ではありません。
NodeList - 要素の子ノードを表すために使用される値に従ってインデックス付けされたノード配列。
NamedNodeMap - 要素の特性を表すために使用される値と名前の両方によってインデックス付けされたノード テーブル。
2. 関連ノードにアクセスします
次のセクションでは、次の HTML ページについて検討します
<html> <head> <title>DOM Example</title> </head> <body> <p>Hello World!</p> <p>Isn't this exciting?</p> <p>You're learning to use the DOM!</p> </body> </html>
ab9f710e8a95de8822eb06cf01adf4e6 要素 (これはドキュメントの document 要素であることを理解する必要があります) にアクセスするには、次のように document の documentElement 属性を使用できます。
変数 oHtml には、ab9f710e8a95de8822eb06cf01adf4e6 を表す HTMLElement オブジェクトが含まれています。 5d86db81e494b82c29e979209d098205 要素と b2636b4e0e32f7cd731b9073897693b7 要素を取得したい場合は、次のようにすることができます:
var oHead = oHtml.firstChild;
var oBody = oHtml.lastChild;
childNodes 属性を使用して同じジョブを実行することもできます。角括弧でマークされた通常の JavaScript 配列として扱うだけです:
var oHead = oHtml.childNodes[0];
var oBody = oHtml.childNodes[1];
角括弧は実際にはJavaScript での NodeList の単純な実装。実際、childNodes リストから子ノードを取得する正式な方法は、 item() メソッドを使用することです。
var oHead = oHtml.childNodes.item(0);
var oBody = oHtml.childNodes.item( 1);
HTML DOM ページは、b2636b4e0e32f7cd731b9073897693b7 要素へのポインターとして document.body を定義します。
var oBody = document.body;
3 つの変数 oHtml、oHead、oBody を使用して、それらの間の関係を判断できます。
alert(oHead.parentNode==oHtml);
alert (oBody.parentNode==oHtml);
alert(oBody.previousSibling==oHead);
alert(bHead.nextSibling==oBody);
alert(oHead.ownerDocument==document); >上記はすべて「true」を出力します。
3. 属性の処理
前述したように、Node インターフェースにはすでに属性メソッドがあり、すべてのタイプのノードに継承されていますが、
Element ノードのみが属性を持つことができます。 Element ノードのattributes 属性は、実際には NameNodeMap であり、そのコンテンツにアクセスして処理するためのメソッドがいくつか用意されています:
getNamedItem(name)--nodename 属性値が name と等しいノードを返します;
removeNamedItem(name) --delete ノード名属性値が name と等しいノード。
setNamedItem(node) -- ノードをリストに追加し、nodeName 属性に従ってインデックスを付けます。
item(pos) -- NodeList と同様に、位置 pos のノード ;
注: これらのメソッドは属性値ではなく、Attr ノードを返すことに注意してください。
NamedNodeMap オブジェクトには、含まれるノードの数を示す length 属性もあります。
NamedNodeMap が属性を表すために使用され、各ノードが Attr ノードである場合、nodeName 属性は属性名に設定され、nodeValue 属性は属性値に設定されます。たとえば、次のような要素があるとします。
f703f6ab3d857132f2daf9892a29a3a9Hello world!94b3e26ee717c64999d7867364b1b4a3
同時に、変数 oP があるとします。この要素へのポインタが含まれています。したがって、次のように id 属性の値にアクセスできます:
var sId = oP.attributes.getNamedItem("id").nodeValue;
もちろん、id 属性に数値的にアクセスすることもできますが、これは少し直感的ではありません:
var sId = oP.attributes.item(1).nodeValue;
nodeValue 属性に新しい値を割り当てることで id 属性を変更することもできます:
oP.attributes.getNamedItem( "id").nodeValue=" newId";
Attr ノードには、nodeValue 属性と完全に同等 (かつ完全に同期) する value 属性もあり、nodeName 属性と同期する name 属性もあります。これらのプロパティを自由に使用して、プロパティを変更または変更できます。
このメソッドはやや面倒であるため、DOM では属性へのアクセスを支援する 3 つの要素メソッドが定義されています。
getAttribute(name) - attributes.getNamedItem(name).value と同等
setAttribute(name,newvalue) -- attribute.getNamedItem(name).value=newvalue;
removeAttribute(name) と等しい --attribute.removeNamedItem(name) と等しい。
4. 指定されたノードにアクセスします。
(1)
getElementsByTagName()
コア (XML) DOM は、すべての A を含む tagName() を返す getElementsByTagName() メソッドを定義します。タグ名) 属性が指定された値と等しい要素の NodeList。 Element オブジェクトでは、tagName 属性は常に、不等号の直後の名前と等しくなります。たとえば、6ed09268cbdd0015bce8dcbbdfa9bfe4 の tagName は「img」です。コードの次の行は、ドキュメント内のすべての 6ed09268cbdd0015bce8dcbbdfa9bfe4 要素のリストを返します:
var oImgs = document.getElementsByTagName("img");すべてのグラフィックを oImgs に保存した後は、角かっこを使用します。または、Item() メソッド (getElementsByTagName() は childNodes と同じ NodeList を返します) を使用すると、子ノードにアクセスするのと同じように、これらのノードに 1 つずつアクセスできます。
ページの最初の段落にあるすべての画像のみを取得したい場合は、次のように最初の段落要素で getElementsByTagName() を呼び出すことで取得できます。
var oPs = document.getElementByTagName("p ") ;
var oImgsInp = oPs[0].getElementByTagName("img");
アスタリスク メソッドを使用してドキュメント内のすべての要素を取得できます:
var oAllElements = document.getElementsByTagName("* " );
パラメータがアスタリスクの場合、IE6.0 はすべての要素を返しません。代わりに Document.all を使用する必要があります。
(2)
getElementsByName()
HTML DOM は getElementsByName() を定義します。これは、name 属性が指定された値と等しいすべての要素を取得するために使用されます。 (3)
getElementById()这是HTML DOM定义的第二种方法,它将返回id特性等于指定值的元素。在HTML中,id特性是唯一的--这意味着没有两个元素可以共享同一个id。毫无疑问这是从文档树中获取单个指定元素最快的方法。
注:如果给定的ID匹配某个元素的name特性,IE6.0还会返回这个元素。这是一个bug,也是必须非常小心的一个问题。
5.创建新节点
最常用到的几个方法是
createDocumentFragment()--创建文档碎片节点
createElement(tagname)--创建标签名为tagname的元素
createTextNode(text)--创建包含文本text的文本节点
createElement()、createTextNode()、appendChild()
<html> <head> <title>createElement() Example</title> <script type="text/javascript"> function createMessage() { var oP = document.createElement("p"); var oText = document.createTextNode("Hello World!"); oP.appendChild(oText); document.body.appendChild(oP); } </script> </head> <body onload="createMessage()"> </body> </html>
removeChild()、replaceChild()、insertBefore()
删除节点
<html> <head> <title>removeChild() Example</title> <script type="text/javascript"> function removeMessage() { var oP = document.body.getElementsByTagName("p")[0]; oP.parentNode.removeChild(oP); } </script> </head> <body onload="removeMessage()"> <p>Hello World!</p> </body> </html>
替换
<html> <head> <title>replaceChild() Example</title> <script type="text/javascript"> function replaceMessage() { var oNewP = document.createElement("p"); var oText = document.createTextNode("Hello Universe!"); oNewP.appendChild(oText); var oOldP = document.body.getElementsByTagName("p")[0]; oOldP.parentNode.replaceChild(oNewP, oOldP); } </script> </head> <body onload="replaceMessage()"> <p>Hello World!</p> </body> </html>
新消息添加到旧消息之前
<html> <head> <title>insertBefore() Example</title> <script type="text/javascript"> function insertMessage() { var oNewP = document.createElement("p"); var oText = document.createTextNode("Hello Universe!"); oNewP.appendChild(oText); var oOldP = document.getElementsByTagName("p")[0]; document.body.insertBefore(oNewP, oOldP); } </script> </head> <body onload="insertMessage()"> <p>Hello World!</p> </body> </html>
createDocumentFragment()
一旦把节点添加到document.body(或者它的后代节点)中,页面就会更新并反映出这个变化。对于少量的更新,这是很好的,然而,当要向document添加大量数据时,如果逐个添加这些变动,这个过程有可能会十分缓慢。为解决这个问题,可以创建一个文档碎片,把所有的新节点附加其上,然后把文档碎片的内容一次性添加到document中,假如想创建十个新段落。
<html> <head> <title>insertBefore() Example</title> <script type="text/javascript"> function addMessages() { var arrText = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"]; var oFragment = document.createDocumentFragment(); for (var i=0; i < arrText.length; i++) { var oP = document.createElement("p"); var oText = document.createTextNode(arrText[i]); oP.appendChild(oText); oFragment.appendChild(oP); } document.body.appendChild(oFragment); } </script> </head> <body onload="addMessages()"> </body> </html>
6.让特性像属性一样
大部分情况下,HTML DOM元素中包含的所有特性都是可作为属性。
假设有如下图像元素:
08eb671a6313b025fb2bd3d7f685f6c2
如果要使用核心的DOM来获取和设置src和border特性,那么要用getAttribute()和setAttribute()方法:
alert(oImg.getAttribute("src"));
alert(oImg.getAttribute("border"));
oImg.setAttribute("src","mypicture2.jpg");
oImg.setAttribute("border",1);
然而,使用HTML DOM,可以使用同样名称的属性来获取和设置这些值:
alert(oImg.src);
alert(oImg.border);
oImg.src="mypicture2.jpg";
oImg.border ="1";
唯一的特性名和属性名不一样的特例是class属性,它是用来指定应用于某个元素的一个CSS类,因为class在ECMAScript中是一个保留字,在javascript中,它不能被作为变量名、属性名或都函数名。于是,相应的属性名就变成了className;
注:IE在setAttribute()上有很大的问题,最好尽可能使用属性。
7.table方法
为了协助建立表格,HTML DOM给262fd5136f53c62e9a44a1fc2132297a,eb657ed06fa1cb552a30705c60d76f5d和bed2e7b14a405456e17405df6936f9bb等元素添加了一些特性和方法。
给262fd5136f53c62e9a44a1fc2132297a元素添加了以下内容:
特性/方法 | 说明 |
caption | 指向f7a5eba2d0f16371ee005a8b211f0ae6元素并将其放入表格 |
tBodies | eb657ed06fa1cb552a30705c60d76f5d元素的集合 |
tFoot | 指向f396c81ab2d6506b0e1dd3149bd49748元素(如果存在) |
tHead | 指向123c34ba660610a744463a4eef99d319元素(如果存在) |
rows | 表格中所有行的集合 |
createTHead() | 创建123c34ba660610a744463a4eef99d319元素并将其放入表格 |
createTFood() | 创建f396c81ab2d6506b0e1dd3149bd49748元素并将其放入表格 |
createCpation() | 创建f7a5eba2d0f16371ee005a8b211f0ae6元素并将其放入表格 |
deleteTHead() | 删除123c34ba660610a744463a4eef99d319元素 |
deleteTFood() | 删除f396c81ab2d6506b0e1dd3149bd49748元素 |
deleteCaption() | 删除f7a5eba2d0f16371ee005a8b211f0ae6元素 |
deleteRow(position) | 删除指定位置上的行 |
insertRow(position) | 在rows集合中的指定位置上插入一个新行 |
eb657ed06fa1cb552a30705c60d76f5d元素添加了以下内容
特性/方法 | 说明 |
rows | eb657ed06fa1cb552a30705c60d76f5d中所有行的集合 |
deleteRow(position) | 删除指定位置上的行 |
insertRow(position) | 在rows集合中的指定位置上插入一个新行 |
特性/方法 | 说明 |
cells | bed2e7b14a405456e17405df6936f9bb元素中所有的单元格的集合 |
deleteCell(postion) | 删除给定位置上的单元格 |
insertCell(postion) | 在cells集合的给点位置上插入一个新的单元格 |
8. DOM を走査します
NodeIterator、TreeWalker
DOM Level2 関数。これらの関数は Mozilla と Konqueror/Safari でのみ利用できるため、ここでは紹介しません。