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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

838閲覧

jqueryでループしたいだけ

tohmey

総合スコア10

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2020/05/25 06:06

編集2020/05/25 06:43

htmlで、ベタ書きしている箇所をループにしたいだけなんですが、
一日近く格闘して、どうにもうまくいきません。

ベタ書きの下記htmlでは、slctline2~6の<div th:replace="this :: sortAjaxBody"></div>の部分が、slctline1の<div th:fragment="sortAjaxBody">で囲まれた部分と置き換わり、画面にプルダウンなどが6個並んだ状態になるのですが、
ループ(※いろいろ試しましたがいったん割愛)にし、html的にはベタ書きと同じ形までもっていくことはできるのですが、<div th:replace="this :: sortAjaxBody"></div>が置き換わらずにそのままです。画面には表示されません。

Thymeleafにこだわりがあるわけではなく、slctline1の内容をitmMap のサイズ分だけID付きで並べたい、というのが目指すゴールになります。

アドバイスをいただけるとありがたいです。

java

1(コントローラからこういうMAPを送っています) 2private static final Map<String, String> itmMap = Collections 3 .unmodifiableMap(new LinkedHashMap<String, String>() { 4 { 5 put("いちご","fluit1"); 6 put("りんご","fluit2"); 7 put("めろん","fluit3"); 8 put("ばなな","fluit4"); 9 put("もも","fluit5"); 10 put("さくらんぼ","fluit6"); 11 } 12});

html5

1<div id="slctline"> 2 <div id="slctline1"><div th:fragment="sortAjaxBody"> 3 <div class="inline-block"> 4 <select name="sortitem"> 5 <option value="">選択してください</option> 6 <option th:each="itm:${itmMap}" 7 th:value="${itm.value}" th:inline="text">[[${itm.key}]] 8 </option> 9 </select> 10 </div> 11 <div class="inline-block"> 12 <select name="sortcon" > 13 <option value="asc">昇順</option> 14 <option value="desc">降順</option> 15 </select> 16 </div></div> 17 </div> 18<!-- ここから --> 19 <div id="slctline2"><div th:replace="this :: sortAjaxBody"></div></div> 20 <div id="slctline3"><div th:replace="this :: sortAjaxBody"></div></div> 21 <div id="slctline4"><div th:replace="this :: sortAjaxBody"></div></div> 22 <div id="slctline5"><div th:replace="this :: sortAjaxBody"></div></div> 23 <div id="slctline6"><div th:replace="this :: sortAjaxBody"></div></div> 24<!-- ここまで --> 25</div>

javascript

1//ひとまずここでは 2//上記htmlからslctline2~6を削除したうえで、slctline2~6タグを作っています 3//itmMap のサイズがjs上で取得できず(うまくいかず)、コントローラからmapサイズを別途送っています 4 5var mapSize = /*[[${mpsiz}]]*/0; 6window.onload =function() { 7 for(var i = 2; i <= mapSize; i++) { 8 $('#slctline').append('<div id="abcdefgz"></div>'); 9 $('#abcdefgz').attr('id', 'slctline' + i); 10 } 11}

javascript

1//これは、ボタンを置いて 2//1クリック毎に上記slctline2~6タグに<div th:replace="this :: sortAjaxBody">を追記しています 3//mapSize分クリックすると、べた書きhtmlと同じコードになります 4 5$("#button").on('click', function() { 6 for(i = 2; i <= mapSize; i++) { 7 var $line = document.getElementById("slctline" + i); 8 if (!$line.hasChildNodes()) { 9 $line.insertAdjacentHTML('beforeend', '<div th:replace="this :: sortAjaxBody"></div>'); 10 break; 11 } 12 } 13});

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

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

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

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

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

guest

回答1

0

ベストアンサー

Thymeleafはわからないのですが、クライアント側の話なのかな?という認識で回答いたします。

id="slctline1" の中身そのままでいいのであれば以下のようなコードでいいのかなと思います。
また、HTMLとJSのファイルが別れていて、HTMLレンダリング後、JSが実行される状態であるという認識です。

html

1<!-- id="slctline" の属性に th:data-copy-num を追加 --> 2<div id="slctline" th:data-copy-num="${mpsiz}"> 3 <div id="slctline1"><div th:fragment="sortAjaxBody"> 4 <div class="inline-block"> 5 <select name="sortitem"> 6 <option value="">選択してください</option> 7 <option th:each="itm:${itmMap}" 8 th:value="${itm.value}" th:inline="text">[[${itm.key}]] 9 </option> 10 </select> 11 </div> 12 <div class="inline-block"> 13 <select name="sortcon" > 14 <option value="asc">昇順</option> 15 <option value="desc">降順</option> 16 </select> 17 </div></div> 18 </div> 19</div>

js

1var mapSize = $('#slctline').data('copy-num'); 2window.onload = function() { 3 var $slctline1 = $('#slctline1'); 4 for(var i = 2; i <= mapSize; i++) { 5 var $newObj = $slctline1.clone(); 6 $newObj.attr('id', 'slctline' + i); 7 $('#slctline').append($newObj); 8 } 9}

投稿2020/05/27 03:09

nawada

総合スコア26

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

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

tohmey

2020/05/27 04:33

ありがとうございました。 バッチリやりたいことが実現できました! MAPサイズの取り方も併せて、大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問