ホームページ ウェブフロントエンド jsチュートリアル javascript_javascriptのヒントでNodeListをArray配列として扱う方法

javascript_javascriptのヒントでNodeListをArray配列として扱う方法

May 16, 2016 pm 06:23 PM
array 配列

例:

コードをコピー コードは次のとおりです:

varアンカー = document.getElementsByTagName ("a" );
for (i = 0; i var ele=anchors[i];// 特定の要素を取得します
// ここにコードを入力します
}

上記のコードは、ドキュメント内のすべてのリンク要素を取得し、トラバースして何かを行うことを意味します。
おそらく、このメソッドで取得した DOM 要素のグループは配列ではないのではないかと疑問に思うかもしれません。ご存知のとおり、長さ属性を直接取得でき、インデックスに従って対応する個々の要素を取得することもできます。ダニエルの有名なアヒル理論によると、アヒルのように歩き (長さ属性を持ち)、アヒルのように鳴き声を上げます。インデックス値に)の場合、それはアヒルです。結論は自明ですよね?
すでに JavaScript を少し深く理解している場合は、値を取得するためにインデックスを付けることができる length 属性があります。これは引数で行うことができるようです。配列?実際の開発では通常の配列として操作しますが、lengthやforループなどは非常に使いやすく、エラーも発生しません。
しかし、実際には配列 (Array) ではなく、NodeList です。 NodeList は配列ではありません。
なんと驚くことでしょう?

1. NodeList が配列ではないのはなぜですか?

NodeList が配列であるかどうかを確認します。おそらく、最も直接的な方法は、Array 独自のプッシュ メソッドとポップ メソッドを試すことです。
コードをコピー コードは次のとおりです:

varアンカー = document.getElementsByTagName("a");
var newEle = document.createElement("a");// new a element
anchors.push(newEle);//push
var element=アンカーs.pop();//pop

上記のコードかどうかは、自分でテストできますプッシュまたはポップ メソッドである場合、例外なく、プッシュまたはポップ メソッドが存在しないことを示すメッセージが表示されます。まだ質問がありますか?これで終わりですか?このような一方的なテストでは、Louzhu は落ち着いてリラックスすることができません。引数が配列ではないことを証明したのと同じ方法を使用して、NodeList が配列ではないことを証明できます。以下のコードを見てください:
コードをコピー コードは次のとおりです:

Array.prototype .testNodeList = "テストノードリスト"; //プロトタイプ属性を配列に追加します
function funcNodeList() {
var links = document.getElementsByTagName("a");
alert(links.testNodeList); >}
function test() {
alert(new Array().testNodeList); //#ff0000 とは何ですか? 🎜>test( ); //テストしてみます



上記の分析を通じて、NodeList が配列 (Array) ではないことを確認できます。では、コレクションを操作する習慣に従って NodeList を操作するにはどうすればよいでしょうか?
2. NodeList を配列のように操作する

NodeList は長さがあるので、for ループでインデックスして値を取得するのは簡単ではないでしょうか。笑、最も直接的なアイデアは次のとおりです。 g




コードをコピーします
コードは次のとおりです: var arr = new Array(); varアンカー = document.getElementsByTagName("a")
for (var i = 0; i var ele =アンカー[i ];
arr.push(ele); //arr は必要な配列です
}


まず、配列を作成し、NodeList を走査します。を追加し、配列変数に単一の要素をプッシュし、最後に配列変数を操作します。自分の知性が侮辱されたように感じますか?
上記は冗談ではありません。以下は Lou Zhu がインターネット上の Google で見つけたもので、2 行のコードで NodeList を Array に変換して使用できます。



コードをコピー
コードは次のとおりです。 varアンカー = document.getElementsByTagName("a"); var arr = Array.prototype .slice.call(anchors) ; //IE以外の通常のブラウザ


しかし、最も残念なことが起こりました。上記のコードは邪悪な IE では正しく動作せず、IE は「JScript オブジェクトが見つかりません」というプロンプトを表示します。
あなたは上記の分析を否定し、操作のために NodeList を Array に変換する必要はないと考えるかもしれません。実際、Lou Zhu は、どのようなプログラミング言語であっても、型変換は非常に賢明ではない行為であると個人的に信じています。最も一般的なものは、C# でのボックス化とボックス化解除、および数値データ変換ですが、これらにはパフォーマンス上の問題があり、注意しないと鉱山事故を引き起こす可能性があります。しかし、Lou Zhu はなぜ NodeList を単独の配列として扱うのでしょうか? NodeList を動的に変更する場合、NodeList を直接操作すると、気付かないうちに誤って制限エリアに入ってしまう可能性が高いためです。以下に例を示します。
(1)、HTML ドキュメントのフラグメント


(2)、JavaScript テスト コード

コードをコピー コードは次のとおりです:

varアンカー = document.getElementsByTagName("a");
for (i = 0; i var ele= document.createElement("a");
ele.setAttribute("href", "http://www.cnblogs.com/jeffwongishandsome/"); .appendChild( document.createTextNode("new link test"));
document.getElementById("divAnchor").appendChild(ele); // div は新しいリンクを追加します
}

in ドキュメントがロードされたら、上記のスクリプトを実行します。私たちの本来の目的は、div 内の既存の a 要素の後に a 要素を追加することです。ただし、実行してもブラウザはクラッシュしますよね。 Louzhu ここで IE が直接ハングし、FF はスクリプトがビジー状態であることを確認し、スクリプトの実行を停止するかどうかを確認します。停止をクリックした後、ページ内に n 個のリンクが生成されます。実際、その理由を大胆に分析できます。for ループ NodeList (前提: for ループ内に新しい要素が追加され、ノードリストの長さが変わります。提案してくれた Chen Tongxie に感謝します)、その長さは変化し続け、増加します。とループが何度も繰り返され、最終的には無限ループになってしまいました。次のコードを使用すると、期待した効果と同じになります:

コードをコピーします コードは次のとおりです:
var links = document.getElementsByTagName("a");
varアンカー = null; //Array
try {
anchors = Array.prototype.slice.call(links) ;
}
catch (e) { //ie と互換性があります
anchors = new Array();
for (var i = 0; i < links.length; i ) {
anchors.push (links[i]);
}
}
for (i = 0; i var ele = document.createElement ("a");
ele.setAttribute("href", "http://www.cnblogs.com/jeffwongishandsome/");
ele.appendChild(document.createTextNode("new)リンクテスト") ;もちろん、これは厳密ではありません。私たちの慣れ親しんだコーディング習慣に少し手を加えるだけです。



コードをコピー

コードは次のとおりです: varアンカー = document.getElementsByTagName("a"); var len = anchors.length; //変数を定義します(i = 0; i < len i ) { //ローカル変数 len var ele = document.createElement("a");
ele.setAttribute("href", "http://www.cnblogs .com/jeffwongishandsome/");
ele.appendChild(document.createTextNode("new link test"));
document.getElementById("divAnchor").appendChild(ele); // div は新しいリンクを追加しますLink
}


ここまでで、ご質問のある方も無い方も、読んでいただきありがとうございます。アドバイスをお待ちしております。
作者: ジェフ・ウォン
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

foreach ループを使用して PHP 配列から重複要素を削除するにはどうすればよいですか? foreach ループを使用して PHP 配列から重複要素を削除するにはどうすればよいですか? Apr 27, 2024 am 11:33 AM

foreach ループを使用して PHP 配列から重複要素を削除する方法は次のとおりです。配列を走査し、要素がすでに存在し、現在の位置が最初に出現しない場合は、要素を削除します。たとえば、データベース クエリの結果に重複レコードがある場合、このメソッドを使用してそれらを削除し、重複レコードのない結果を取得できます。

PHP 配列ディープ コピーの技術: さまざまな方法を使用して完璧なコピーを実現する PHP 配列ディープ コピーの技術: さまざまな方法を使用して完璧なコピーを実現する May 01, 2024 pm 12:30 PM

PHP で配列をディープ コピーする方法には、json_decode と json_encode を使用した JSON エンコードとデコードが含まれます。 array_map と clone を使用して、キーと値のディープ コピーを作成します。シリアル化と逆シリアル化には、serialize と unserialize を使用します。

PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 May 03, 2024 pm 09:03 PM

PHP の配列キー値の反転メソッドのパフォーマンスを比較すると、array_flip() 関数は、大規模な配列 (100 万要素以上) では for ループよりもパフォーマンスが良く、所要時間が短いことがわかります。キー値を手動で反転する for ループ方式は、比較的長い時間がかかります。

PHP 配列のディープ コピーのベスト プラクティス: 効率的な方法を発見する PHP 配列のディープ コピーのベスト プラクティス: 効率的な方法を発見する Apr 30, 2024 pm 03:42 PM

PHP で配列のディープ コピーを実行するためのベスト プラクティスは、 json_decode(json_encode($arr)) を使用して配列を JSON 文字列に変換し、それから配列に戻すことです。 unserialize(serialize($arr)) を使用して配列を文字列にシリアル化し、それを新しい配列に逆シリアル化します。 RecursiveIteratorIterator を使用して、多次元配列を再帰的に走査します。

データソートにおけるPHP配列グループ化機能の応用 データソートにおけるPHP配列グループ化機能の応用 May 04, 2024 pm 01:03 PM

PHP の array_group_by 関数は、キーまたはクロージャ関数に基づいて配列内の要素をグループ化し、キーがグループ名、値がグループに属する要素の配列である連想配列を返すことができます。

PHP 配列の多次元ソートの実践: 単純なシナリオから複雑なシナリオまで PHP 配列の多次元ソートの実践: 単純なシナリオから複雑なシナリオまで Apr 29, 2024 pm 09:12 PM

多次元配列のソートは、単一列のソートとネストされたソートに分類できます。単一列のソートでは、array_multisort() 関数を使用して列ごとにソートできますが、ネストされたソートでは、配列を走査してソートするための再帰関数が必要です。具体的な例としては、製品名による並べ替えや、売上数量や価格による化合物の並べ替えなどがあります。

重複要素の検索における PHP 配列グループ化関数の役割 重複要素の検索における PHP 配列グループ化関数の役割 May 05, 2024 am 09:21 AM

PHP の array_group() 関数を使用すると、指定したキーで配列をグループ化し、重複する要素を見つけることができます。この関数は次の手順で動作します。 key_callback を使用してグループ化キーを指定します。必要に応じて、value_callback を使用してグループ化値を決定します。グループ化された要素をカウントし、重複を特定します。したがって、array_group() 関数は、重複する要素を見つけて処理するのに非常に役立ちます。

PHPで配列内の値をサイズで並べ替える方法 PHPで配列内の値をサイズで並べ替える方法 Mar 22, 2024 pm 05:24 PM

PHP は、Web サイト開発およびデータ処理分野で広く使用されている、一般的に使用されるサーバー側スクリプト言語です。 PHP では、配列内の値をサイズで並べ替えるのは非常に一般的な要件です。組み込みのソート関数を使用すると、配列を簡単にソートできます。以下では、PHP を使用して配列内の値をサイズで並べ替える方法を、具体的なコード例とともに紹介します。 1. 配列内の値を昇順に並べ替えます。

See all articles