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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

4回答

2084閲覧

置換した HTMLから jQueryの起動(モーダル表示)を実行することはできないのでしょうか?

takujiji

総合スコア24

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

JavaScript

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/09/16 01:56

編集2020/09/16 02:29

置換した 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

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

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

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

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

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

Daregada

2020/09/16 02:12

> 「class」が「js-modal-open」であるボタンをクリックすると、モーダルが表示されます。 に相当する処理(当然、ありますよね?)を、質問文中に追加してください。
m.ts10806

2020/09/16 02:13

モーダル起動のコードをご提示ください。 参考先はあくまで参考であり、ご自身のコードではありません。
takujiji

2020/09/16 02:30

コメントありがとうございます。 モーダルを表示する箇所のスクリプトを追記させていただきました。
guest

回答4

0

ベストアンサー

追記依頼で複数の方が書かれている通り実際のイベント処理を確認した方が確実なのですが、おそらく

javascript

1$('.js-modal-open').on('click', function() { 2 :

というように記述されているのではないかと思います。この書き方ですと、動的生成された要素にはイベント設定されません。

javascript

1$(document).on('click', '.js-modal-open', function() { 2 :

とすれば動的生成された要素にもイベントが適用されます。

投稿2020/09/16 02:29

saoyagi2

総合スコア210

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

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

miyabi_takatsuk

2020/09/16 02:45

横槍すみません。 $(document).on('click', '.js-modal-open' これは、クリックイベント自体はドキュメントに適用され、 セレクターの要素がクリックされた時にコールバック起動となるのでしょうか??
takujiji

2020/09/16 02:48

コメントありがとうございます。 ご連絡をいただいたとおり、「$(document).on・・・」という記述方法に変えると無事に動作いたしました。 ありがとうございます。 「$(document).on・・・」を記述することで、置換した要素も含めて、もとからあるページ全体の要素を対象にすることができるために動作するようになった、という理解であってますか?
saoyagi2

2020/09/16 02:52

後者の書き方ではドキュメント全体に対してイベントハンドラが設定され、イベントハンドラ中で第2引数のセレクタに合致した際にのみ実際の処理が行われます。
takujiji

2020/09/16 03:02

追加のコメント、ありがとうございます。 多くの方にコメントをいただきまして、自身が書いていたソースコードの内容の理解が深まりました。 どのコメントも非常に参考になりましたが、具体的な対応方法を記載いただいたこちらの回答をベストアンサーとさせていただきます。 ありがとうございました。
guest

0

大変失礼しました。

誤認識があったようです。
(第二引数にセレクターを記載する方法ではできない云々の部分です)

saoyagi2さんの回答が有力解法になるかと思います。
下方に記載の、動的要素に改めてイベント付与を、する手法は、
解法の一つではありますので、ご参考になれば幸いです。

------ 以下元回答 ------

置換した要素(動的に作成した要素)にはイベントが当たらないので、改めてイベントを付与する必要があるからです。

でも、親に対してクリックイベントつけてるよ?とお思いかもしれませんが、
質問者さんの構文では、親にクリックイベントは当たらず、結果的には子要素にクリックイベントが当たっています。

【jQuery】onメソッドの使用方法 - Qiita

ではどうするかというと、
親にのみクリックイベントを当て、
その時、クリックされた子要素を特定するか、
イベント自体の関数を別に用意し、
動的に子要素を作成した際に、改めて子要素自体にイベントを付与する構文にするか、
のどちらかになるでしょう。

投稿2020/09/16 02:35

編集2020/09/16 03:02
miyabi_takatsuk

総合スコア9555

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

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

takujiji

2020/09/16 03:00

ソースを追記する前であったにもかかわらずコメントをいただきましてありがとうございました。 jQueryはまだ日が浅く、自身で書いたコードの違いについてもよく分かっていませんでしたが、今回多くの方からコメントをいただいたことで、自身が書いていた処理の内容についての理解が深まりました。 改めて、ありがとうございました。
miyabi_takatsuk

2020/09/16 03:04

情報やソースコードはなるたけ全部記載するようにしましょう。 回答者も人間なので、 質問の状況を鵜呑みにしてしまい、回答してしまうこともありますので。 誤回答は私の自業自得なので、申し訳ない限りです。
takujiji

2020/09/16 03:09

コメントありがとうございます。 モーダルの処理はほぼサンプルのとおりに書いていたため、書かなくても問題ないかと勝手な判断をしてしまっていましたが、自分勝手な判断は良くないと改めて思わされました。 今後は、ご指摘の通り、省略せずに記載させていただこうと思います。
guest

0

エスパー回答。
自身で書かれた
$(document).on("click", "[name='search']", function (e) {

この書き方で拾えるイベントの影響範囲が分かれば対応できます。

投稿2020/09/16 02:27

m.ts10806

総合スコア80875

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

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

takujiji

2020/09/16 02:59

ソースを追記する前であったにもかかわらずコメントをいただきましてありがとうございました。 jQueryはまだ日が浅く、自身で書いたコードの違いについてもよく分かっていませんでしたが、今回多くの方からコメントをいただいたことで、自身が書いていた処理の内容についての理解が深まりました。 改めて、ありがとうございました。
m.ts10806

2020/09/16 03:33

「動的」「静的」で要素の状態を把握できれば理解はもっと深まると思いますし、有効活用できると思います。
m.ts10806

2020/09/16 06:33 編集

あと、jQueryとJavaScriptの記法が混ざってるのはメンテナンス性もか可読性もよろしくないです。 特に要素を取得する処理。。 var modal = document.getElementById(target); ↑ここ。 jQueryを使うメリットは簡潔にかけることなので、そこは活かしましょう。
takujiji

2020/09/16 06:32

コメントありがとうございます。 ご指摘の、jQueryと JavaScriptの記法の違いについては全く意識していませんでした。 改めて jQueryの仕組みを、記法とともに理解し直してみようと思います。
m.ts10806

2020/09/16 06:34

コピペで動いたと満足しないことだと思います(たぶん今回はそれが原因)
takujiji

2020/09/16 08:38

そうですね。 コピペで動かないと挫折してしまうときもありますけども、動いてしまうと理解が広がらないときがありますからね。 ありがとうございます。
m.ts10806

2020/09/16 08:43

「意図を説明コードは使わない」くらいでちょうどよいと思います。
guest

0

追記・修正依頼にもある通り、js-modal-openにクリックイベントを追加する記載がないため何とも言えませんが、参考先ベースで下記のようなコードを記載している認識ですよね?

javascript

1$(function(){ 2 $('.js-modal-open').on('click',function(){ 3 $('.js-modal').fadeIn(); 4 return false; 5 }); 6 $('.js-modal-close').on('click',function(){ 7 $('.js-modal').fadeOut(); 8 return false; 9 }); 10});

この記載は、あくまでコードが実行された段階で存在しているjs-modal-openに対してクリックイベントを追加しているため、後から置換されて追加されたjs-modal-openには適用されません。

そのため、置換処理の後で同様にクリックイベント追加を行う必要があります。

投稿2020/09/16 02:19

nekoniki

総合スコア2411

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

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

takujiji

2020/09/16 02:58

ソースを追記する前であったにもかかわらずコメントをいただきましてありがとうございました。 jQueryはまだ日が浅く、見様見真似で動かしていましたが、今回多くの方からコメントをいただいたことで、自身が書いていた処理の内容についての理解が深まりました。 改めて、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問