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

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

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

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

jQuery

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

Q&A

解決済

2回答

242閲覧

動的に生成した項目へのイベントの定義

toshiki_iwata

総合スコア13

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/06/03 01:17

前提・実現したいこと

チャット機能の実装を検討しており、websocketでサーバーと送受信を行い、発言を検知したらその発言を吹き出し上のボックスに表示しようとしています。
javascipt上で、発言を検知したときに、以下のコードをhtmlにappendする仕組みです。

<div class="hoge" id = "messagebox-id"> ・・・ ・・・ <div> (idはGUID)

この動的に作成したボックスに「ある項目をドラッグし、このボックスにドロップしたときに処理を行う」機能を実装したく、以下のように定義しました。
$(document).on('drop','[id^=messagebox]',function(e){
alert('ドロップ機能の組み込み');
})

しかし、この通りに実装をしたところ、このjsファイルは実行されていませんでした。(F12の開発者ツールでブレークポイントを設置したのですが、該当行を通りませんでした。)
上記の機能を実現するためには、どのような実装方法が必要でしょうか。

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

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

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

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

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

guest

回答2

0

動的に作成すると言うことは、初期状態では対象が 0 ではないですか?
その状態で $(document).on() を書いたとしても、対象がいないからアタッチされないでしょう。

HTML を append しているのですから、そのすぐ後で「今append した <div>」に対するイベントハンドラを追加してやればいいのでは?

投稿2019/06/03 03:47

tacsheaven

総合スコア13703

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

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

think49

2019/06/03 04:01 編集

高評価がついていますが、本当にそうなのでしょうか。 document は存在しているので、イベントのアタッチは成功しているように読めますが…。
toshiki_iwata

2019/06/03 05:06

tacsheaven様 think49様 ご回答ありがとうございます。 >tacsheaven様 ありがとうございます。一度その方法で試してみて再度回答させていただきます。 >think49様 まだ私は高評価を押下しておりませんので、おそらくほかの方かもしれません。 コードの書き方としては「chat_room.html」と「app.js」があり、app.js側でchat_room.htmlの「main」というidに対してのappend処理を記載しています。dropの処理もapp.jsです。 _______ app.js 「$('main').append(<div class="hoge" id = "messagebox-id"> ・・・ ・・・ <div>)」
tacsheaven

2019/06/03 09:48

だとすると drop 自体が発生しない、ということで終わりかと思います。
toshiki_iwata

2019/06/03 14:54

tacsheaven様 think49様 貴重なお時間を割かれての再度のご回答、ありがとうございます。 お二人のご助言をいただきつつ、こちらも試していたのですが、やはりうまくいきませんでした。 例えば以下のような対応はうまくいくのですが、「動的に生成する」かつ「drop」だとイベントが発生しないのですかね・・・ ①静的な項目「txthoge~」に対してドロップイベントを定義する。 $(document).on('drop','[id^=txthoge]',function(e){ alert('ドロップ機能の組み込み'); }) ②動的な項目にclickイベントを仕込む $(document).on('click','[id^=messagebox]',function(e){ alert('ドロップ機能の組み込み'); })
toshiki_iwata

2019/06/03 15:00

なお、htmlへは以下のコードをhtmlにappendしています。 var tagstring = <div class="chat-convo d-flex flex-row my-2" id="messagebox-${this.id}"> <ul class="chat-convo chat-info m-1"> <li class="chat-convo chat-datetime" id = time-${this.id}>${moment(this.datetime).format('HH:mm:ss')}</li> <li class="chat-convo chat-username"id = speaker-${this.id}>${this.username_last}</li> </ul> <div id = 'testy-${this.id}" class="rounded-lg flex-fill chat-convo chat-box ${this.usertype}"> <span class="chat-convo chat-message" id="text-${this.id}">${this.message} <div class="chat-convo chat-tags"> <ul id = "tagtable-${this.id} class="list-group list-group-horizontal"> </ul> </div> </div> </div>` $('main').append(tagstring)
think49

2019/06/03 15:09 編集

@toshiki_iwata さん コードの追記はコメントにするのではなく、質問本文にmarkdownで追記して下さい。 ここに書くのもなんですが、私はyambejpさんがコメントされた内容が正解だと思いますよ。 検証すれば分かるのですから、本番コードとは別に「最小限のコード」を書いて切り分けしましょう。 そして、「yambejpさんに」返信しましょう。
guest

0

ベストアンサー

id = "messagebox-id"

だとスタティックに「messagebox-id」というidを指定しています。
これが複数存在するとidが競合するのでNGです

投稿2019/06/03 02:20

yambejp

総合スコア114843

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

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

toshiki_iwata

2019/06/03 03:38

>yambejpさん ご回答ありがとうございます。 申し訳ございません。記載方法に誤りがありました。 ここでいうidはguid値をとっています。 そのため、各idは「messagebox-xxxx-xxxx....」等と発言事に毎回ランダムなidを杯盤しているイメージです。
yambejp

2019/06/03 03:54

[id^=messagebox]のHTML要素がドロッパブルな属性をもってないのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問