さらに詳しいJavaScript DOM学習メモ_JavaScriptスキル

PHP中文网
リリース: 2016-05-16 19:03:40
オリジナル
920 人が閲覧しました

多くの js dom 学習資料を読んだ後、これが非常に詳細であることがわかったので、

1. DOM の基本
1. ノード レベル
について学ぶために再版しました。 Document -- the most 他のすべてのノードが接続される最上位ノード。
DocumentType - DTD 参照のオブジェクト表現 ( 構文を使用)。子ノードを含めることはできません。
DocumentFragment - Document などの他のノードを保存できます。
要素 - など、開始タグと終了タグの間のコンテンツを表します。これは、属性と子ノードの両方を含めることができる唯一のノード タイプです。
Attr - 属性名と属性値のペアを表します。このノード タイプには子ノードを含めることはできません。
Text - XML ドキュメント内の開始タグと終了タグの間の通常のテキスト、または CDataSection に含まれるテキストを表します。このノード タイプには子ノードを含めることはできません。
CDataSection - のオブジェクト表現。このノード タイプには、子ノードとしてテキスト ノード Text のみを含めることができます。
Entity - DTD 内のエンティティ定義を表します ( など)。このノード タイプには子ノードを含めることはできません。
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&#39;t this exciting?</p>
        <p>You&#39;re learning to use the DOM!</p>
    </body>
</html>
ログイン後にコピー

要素 (これはドキュメントの document 要素であることを理解する必要があります) にアクセスするには、次のように document の documentElement 属性を使用できます。
変数 oHtml には、 を表す HTMLElement オブジェクトが含まれています。 要素と 要素を取得したい場合は、次のようにすることができます:
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 ページは、 要素へのポインターとして 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 属性は属性値に設定されます。たとえば、次のような要素があるとします。

Hello world!


同時に、変数 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 属性は常に、不等号の直後の名前と等しくなります。たとえば、 の tagName は「img」です。コードの次の行は、ドキュメント内のすべての 要素のリストを返します:
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元素中包含的所有特性都是可作为属性。
假设有如下图像元素:

如果要使用核心的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给

,和等元素添加了一些特性和方法。
元素添加了以下内容:

元素的集合元素(如果存在)元素(如果存在)元素并将其放入表格元素并将其放入表格元素元素
特性/方法 说明
caption 指向
元素并将其放入表格
tBodies
tFoot 指向
tHead 指向
rows 表格中所有行的集合
createTHead() 创建
createTFood() 创建
createCpation() 创建
元素并将其放入表格
deleteTHead() 删除
deleteTFood() 删除
deleteCaption() 删除
元素
deleteRow(position) 删除指定位置上的行
insertRow(position) 在rows集合中的指定位置上插入一个新行


元素添加了以下内容

中所有行的集合
特性/方法 说明
rows
deleteRow(position) 删除指定位置上的行
insertRow(position) 在rows集合中的指定位置上插入一个新行


要素は、次のコンテンツを追加します

元素中所有的单元格的集合
特性/方法 说明
cells
deleteCell(postion) 删除给定位置上的单元格
insertCell(postion) 在cells集合的给点位置上插入一个新的单元格


8. DOM を走査します
NodeIterator、TreeWalker
DOM Level2 関数。これらの関数は Mozilla と Konqueror/Safari でのみ利用できるため、ここでは紹介しません。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート