###解決したいこと
askama、jinjaのテンプレートエンジンのforループで生成(表示)された分だけのHTMLのテキストコンテンツと、それとは別で生成(表示)されるテキストコンテンツをJavaScriptのfor文を使って照らし合わせて、一致しているものはそのまま表示し、一致していないものは表示しないようにする方法を教えてください。
###該当するソースコード
これでdivタグがデータべースに元々ある値の数だけ表示されます。
HTML
1{% for entry in entries %} 2<div> 3 (このdivタグが量産される) 4</div> 5{% endfor %}
例: データベースに3個の値があった場合。
HTML
1{% for entry in entries %} 2<div> 3 <p>hogehoge</p> 4 ... 5</div> 6<div> 7 <p>hogehoge</p> 8 ... 9</div> 10<div> 11 <p>hogehoge</p> 12 ... 13</div> 14{% endfor %}
このdivタグのテキストコンテンツと別でJSを使って自動生成される<p>タグのテキストコンテンツを一つ一つ照らし合わせて、値が同じであればそのまま表示し、違っていれば表示しないようにしたいと考えています。
HTML
1{% for entry in entries %} 2<div> 3 <p>hogehoge</p> 4 ... 5</div> 6<div> 7 <p>HUGEHUGE</p> 8 <!-- これは値が異なっているので表示しない。 --> 9 ... 10</div> 11<div> 12 <p>hogehoge</p> 13 ... 14</div> 15{% endfor %} 16 17<p id="other_content">hogehoge</P> <!-- JSを使ってid指定でテキストコンテンツを埋め込んだ<p>タグと比較する -->
自分で試したこと
askamaのテンプレートシンタックスでif文やmatch文があるのでそれを使って再現しようと思ったのですが、id指定でテキストを埋め込んでいたのでできませんでした。
比較対象のpタグにclass="db_val"を付与
JavaScript
1var other_content = document.getElementById("other_content").textContent; 2var arr = document.getElementsByClassName("db_val"); 3 4for (var i = 0; i < arr.length; i++) { 5 if (arr[i].textContent != other_content) { 6 arr[i].style.display = "none"; 7 } 8}
上記のコードに書き換えて実行するとarrがclass指定なので、lengthは取れるのですが、中のテキストコンテンツが取れず、undefinedになり比較することができません。
なので実行すると本来は表示されるはずの要素まで、すべてが消えてしまします。
逆にarrをid指定にすると、中のテキストコンテンツは取れるのですが、lengthが取れずにundefinedになります。なのでdivタグにclass="node_count"をつけてノードを数えるためのdivを作った以下のコードを実行すると、
JavaScript
1var other_content = document.getElementById("other_content").textContent; 2var arr = document.getElementById("db_val"); //NEW 3var node_count = document.getElementsByClassName("node_count"); //NEW 4 5for (var i = 0; i < node_count.length; i++) { //NEW 6 if (arr[i].textContent != other_content) { 7 arr[i].style.display = "none"; 8 } 9}
「Uncaught (in promise) TypeError: arr[i] is undefined」
とエラーが出ました。
回答1件
あなたの回答
tips
プレビュー