置換した HTMLから jQueryの起動(モーダル表示)を実行することはできないのでしょうか?
下記のように「編集」ボタンを設置し、「編集」ボタンをクリックすると編集のモーダル画面が表示されるようにしています。
html
1 <tbody id="replaceTbody"> 2 <td> 3 <button class="js-modal-open" type="submit" data-target="modal01">編集</button> 4 </td> 5 </tbody>
モーダルの処理は下記を参考に作成しています。
https://webdesignday.jp/inspiration/pickup/4680/
「class」が「js-modal-open」であるボタンをクリックすると、モーダルが表示されます。
ここまでは特に問題は発生していません。
上記の「tbody」のタグの箇所は一覧ページで検索結果を表示する箇所でもあるため、検索処理を作成し、検索結果を「replaceWith」で置換する処理を作成しました。
その処理が下記になります。
javascript
1<script> 2 $(function() { 3 const token = $("meta[name='csrfToken']").attr('content'); 4 $(document).on("click", "[name='search']", function (e) { 5 e.preventDefault(); 6 const data = { 7 name: $('input[name="name"]').val(), 8 }; 9 $.ajax({ 10 url: "/users/search", 11 type: "POST", 12 data: data, 13 beforeSend: function (xhr, settings) { 14 xhr.setRequestHeader("X-CSRF-Token", token); 15 }, 16 success: function (data, textStatus, xhr) { 17 $("#replaceTbody").replaceWith(data.result); 18 }, 19 error: function (xhr, textStatus, settings) { 20 21 }, 22 complete: function (xhr, textStatus) { 23 } 24 }); 25 }); 26 }); 27</script> 28
URLの「/users/search」は PHPのプログラムで、検索を実行し、検索結果を「tbody」のタグごと置換できる形式に編集した HTMLを戻す処理にしています。
Firefoxの開発ツールで確認したところ、ボタンの HTMLは置換前と同じ下記のようになっていることを確認しました。
html
1<button class="js-modal-open" type="submit" data-target="modal01">編集</button>
しかし、「編集」ボタンをクリックしてもモーダルが表示されません。
これは、そもそも置換した HTMLではモーダルは起動しない(jQueryは起動しない)ものであるためこの方法は NGなのでしょうか?
もしくは、なにか私のプログラムにミスがあるものなのでしょうか?
ちなみに、
javascript
1$("#replaceTbody").replaceWith(data.result); 2
の部分を下記のように直接的な HTMLのソースを記述して試してみたりもしました。
javascript
1$("#replaceTbody").replaceWith('<button class="js-modal-open" type="submit" data-target="modal01">編集</button>'); 2
コメントに連絡をいただきましたモーダルを表示するスクリプトについて追記させていただきます。
スクリプトは下記にになります。
JavaScript
1 $(function () { 2 $('.js-modal-open').each(function () { 3 $(this).on('click', function () { 4 var target = $(this).data('target'); 5 var modal = document.getElementById(target); 6 $(modal).fadeIn(); 7 return false; 8 }); 9 }); 10 $('.js-modal-close').on('click', function () { 11 $('.js-modal').fadeOut(); 12 return false; 13 }); 14 }); 15
回答4件
あなたの回答
tips
プレビュー