質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Jinja2

Jinja2は、Python用のテンプレートエンジンです。テンプレートファイルの読込や文字列の埋込、分岐/ループの制御文のサポートなどの機能を持ちます。HTMLやXML生成によく使用されますが、どのような文書でも生成することが可能です。

Askama

Askamaは、Rustのテンプレートエンジンの一つです。Jinjaに基づく記法になっており、コンパイル時にテンプレートからRustコードを生成。Rustイディオマティックな方法でテンプレートの文脈を保持することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1354閲覧

askama、jinjaのテンプレートエンジンのforループで生成された分のHTMLをJSのfor文で繰り返し処理できるようにする

haruka4434

総合スコア0

Jinja2

Jinja2は、Python用のテンプレートエンジンです。テンプレートファイルの読込や文字列の埋込、分岐/ループの制御文のサポートなどの機能を持ちます。HTMLやXML生成によく使用されますが、どのような文書でも生成することが可能です。

Askama

Askamaは、Rustのテンプレートエンジンの一つです。Jinjaに基づく記法になっており、コンパイル時にテンプレートからRustコードを生成。Rustイディオマティックな方法でテンプレートの文脈を保持することができます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/06/06 19:31

編集2021/06/08 06:23

###解決したいこと

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」
とエラーが出ました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

html

1{% for entry in entries %} 2<div class="elements_group"> 3 <p>hogehoge</p> 4</div> 5<div class="elements_group"> 6 <p>HUGEHUGE</p> 7</div> 8<div class="elements_group"> 9 <p>hogehoge</p> 10</div> 11{% endfor %} 12 13<p id="key_content">hogehoge</p> 14 15<script> 16 const keyContent = document.getElementById("key_content").textContent; 17 const elementsGroup = document.getElementsByClassName("elements_group"); 18 19 for (let i = 0; i < elementsGroup.length; i++) { 20 if (elementsGroup.item(i).children[0].textContent.trim() != keyContent) { 21 elementsGroup[i].style.display = "none"; 22 } 23 } 24</script>

投稿2021/06/09 19:55

haruka4434

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問