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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

1回答

561閲覧

投稿された記事に対してコメント機能を実装しています。コメント機能をjs.erbを用いて非同期で部分的に変更したのですが、その際にすでに読み込めれていたjsが反応しなくなりました。

so_ma

総合スコア5

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2021/04/06 07:03

前提・実現したいこと

投稿された記事に対してコメント機能をjs.erbファイルを用いて部分的に非同期で変更したのですが、コメントする前に読み込めれていたjsがコメントを投稿後に反応しなくなりました。
また、非同期でのコメント機能は正常に動作しています。
特にエラーなどはでず、コメントの送信ボタンを押すとコメント保存されています

該当のソースコード

Ruby

1# view/articles/index.html.erb 2 3<div class="timeline-content"> 4 <div id="scroll"> 5 <% @articles.each do |article| %> 6 <div class="card"> 7 <div class="card-top"> 8 <div class="left-side"> 9 <%= image_tag article.celeb.image, class: "image"%> 10 <div class="profile"> 11 <p style="font-weight: bold;"><%= article.celeb.name%></p> 12 <p><%= l article.created_at, format: :short %></p> 13 </div> 14 </div> 15 <div class="right-side"> 16 <i class="fa fa-bars"></i> 17 <div class="down-bar hidden"> 18 <% if @current_celeb && article.celeb.id == @current_celeb.id%> 19 <ul> 20 <li><%= link_to "削除", article_path(article.id), method: :delete ,class: "card-bar"%></li> 21 <li><%= link_to "編集", edit_article_path(article) ,class: "card-bar"%></li> 22 <li><%= link_to "公開設定を変更","#" ,class: "card-bar"%></li> 23 </ul> 24 <% else %> 25 <ul> 26 <li><%= link_to "この投稿を非表示にする", edit_article_path(article) ,class: "card-bar"%></li> 27 <li><%= link_to "この投稿者の投稿を非表示","#" ,class: "card-bar"%></li> 28 <li><%= link_to "この投稿を通報する","#" ,class: "card-bar"%></li> 29 </ul> 30 <% end %> 31 </div> 32 </div> 33 </div> 34 <div class="card-body"> 35 <% if article.image.attached? %> 36 <div class="samune"> 37 <%= image_tag article.image, class: "samune-image"%> 38 </div> 39 <% end %> 40 <p class="card-title"><%= article.title%></p> 41 <p class="card-text"><%= article.content%></p> 42 </div> 43 <div class="card-like" id="like-<%= article.id%>"> 44 <%= render partial: "like" , locals: {article: article}%> 45 </div> 46 <% if current_user %> 47 <%= form_with model: @comment, url: article_comments_path(article.id), remote: true do |f|%> 48 <div class="comment-space"> 49 <%= image_tag current_user.image, class: "comment-user-img"%> 50 <%= f.text_area :content, class: "comment", placeholder: "コメントを入力"%> 51 <%= f.submit "送信", class: "comment-submit"%> 52 </div> 53 <% end %> 54 <% end %> 55 <div class="comment-body" id="comments-<%= article.id%>"> 56 <%= render partial: "comment", locals: {article: article} %> 57 </div> 58 </div> 59 <% end %> 60 <div class='hidden'><%= paginate @articles %></div> 61 </div> 62</div> 63

Ruby

Ruby

1# view/articles/_comment.html.erb 2 3<% unless article.comments.empty? %> 4 <div class="comment-index"> 5 <p class="more-comment">コメント<%= article.comments.count%>件</p> 6 <div class="comments hidden"> 7 <% article.comments.each do |comment| %> 8 <div class="comments-set"> 9 <div class="left-side"> 10 <%= image_tag comment.user.image, class: "comment-user-img"%> 11 <div class="comment-profile"> 12 <div class="comment-time"> 13 <p style="font-weight: bold;"><%= comment.user.nickname%></p> 14 <p style="color: #868686;"><%= l comment.created_at, format: :short%></p> 15 </div> 16 <p class="comment-content" style="color: #868686;"><%= comment.content%></p> 17 </div> 18 </div> 19 <div class="right-side"> 20 <% if current_user && comment.user_id == current_user.id%> 21 <%= link_to "×", article_comment_path(article.id, comment.id), method: :delete, class: "delete-btn", remote: true%> 22 <% end %> 23 </div> 24 </div> 25 <% end %> 26 </div> 27 </div> 28<% end %>

Ruby

1# view/comments/create.js.erb 2 3$('#comments-<%= @article.id%>').html("<%= j(render partial: 'articles/comment', locals: {article: @article}) %>");

Ruby

1# view/comments/destroy.js.erb 2 3$('#comments-<%= @article.id%>').html("<%= j(render partial: 'articles/comment', locals: {article: @article}) %>");

JavaScript

1 2$(document).on("turbolinks:load", function() { 3 var article = function(){ 4 5 ### .more-commentの要素をクリックするとコメントの一覧が出現する 6 const MoreComment = document.querySelectorAll(".more-comment") 7 MoreComment.forEach((comment) => { 8 comment.addEventListener("click", () => { 9 const CommentIndex = comment.parentNode.querySelector(".comments") 10 if (CommentIndex.classList.contains("hidden")){ 11 const Comments = document.querySelectorAll(".comments") 12 Comments.forEach(com => com.classList.add("hidden")) 13 } 14 CommentIndex.classList.toggle("hidden") 15 }) 16 }) 17 18 ### .right-sideの要素をクリックすると、サイドのバーが出現する 19 const DownMenu = document.querySelectorAll(".right-side") 20 DownMenu.forEach((icon) => { 21 icon.addEventListener("click", () => { 22 const DownBar = icon.parentNode.querySelector(".down-bar") 23 if (DownBar.classList.contains("hidden")){ 24 const DownBars = document.querySelectorAll(".down-bar") 25 DownBars.forEach(bar => bar.classList.add("hidden")) 26 } 27 DownBar.classList.toggle("hidden") 28 }) 29 }) 30 31 ### コメントの記入欄の高さが改行に応じて変化する 32 var lineHeight = parseInt($('.comment').css('lineHeight')); 33 $('.comment').on('input', function() { 34 var lines = ($(this).val() + '\n').match(/\n/g).length; 35 $(this).height(lineHeight * lines); 36 }); 37 } 38 39 article(); ## 上で定義したarticleをturbolinksが読み込まれたら実行 40 41 $(document).on('scrollThreshold.infiniteScroll', function() { 42 article(); 43 }) 44 $(document).on('append.infiniteScroll', function() { 45 article(); 46 }) ## InfiniteScrollを用いて無限スクロールを導入しているので新たに画面が読み込まれたらこちらの二つを実行 47 48 $(".comment-body").on("DOMSubtreeModified propertychange",function(){ 49 $(".comment").val; 50 article(); 51 }); ## classのcomment-bodyに新たにDOMが加えられたらこちらを実行。しかしうまくいかなかった。 52 53});

試したこと

新しくコメントがDOMとして追加されたらというのを”DOMSubtreeModified propertychange”としてイベント発火させようとしたのですが、コメントが投稿されても発火しませんでした。

補足情報(FW/ツールのバージョンなど)

rails 6.0

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

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

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

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

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

guest

回答1

0

【JavaScript + JQuery】DOMの変更を監視するリスナー

DOMSubtreeModified propertychange が発火しないのは、
この記事の「セレクタが配列だとだめ」に該当するからかもしれません。

create/destroy.js.erb でイベントを発生させる

erb

1$('#comments-<%= @article.id%>').html("<%= j(render partial: 'articles/comment', locals: {article: @article}) %>"); 2// 下記を追加 3document.dispatchEvent(new Event('updateComment'));

イベントを処理する

javascript

1$(document).on("updateComment", function () { 2 article() 3})

投稿2021/04/07 13:36

neko_daisuki

総合スコア2090

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

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

so_ma

2021/04/09 02:21

こちらのやり方でやってみたのですが、create/destroy.js.erbの記載したものが反応しなかったですね。。
so_ma

2021/04/09 02:23

js.erbでイベントの発火をすることができなかったら、コメントの一覧に追加があったときにイベント発火させる方法しかないのかなあと思ったのですが、どうでしょうか??
neko_daisuki

2021/04/09 02:56

こちらの環境だと create.js.erb(POST /) に document.dispatchEvent(new Event('updateComment')); application.js(Sprockets) に //= require rails-ujs document.addEventListener("updateComment", () => { console.log("fired") }) とかいて、application.html.erb の下のボタンをクリックしたら <%= link_to "button", root_path, method: "post", remote: true %> fired と表示されました。
so_ma

2021/04/09 04:12

自分の方ではtimeline-form.jsにdocument.addEventListener("updateComment", () => { console.log("fired") })を create.js.erb方にdocument.dispatchEvent(new Event('updateComment'));と追加してやってみたのですが、firedと表示されることはなかったですね。。 ちなみにこのdispatchEventと言うのは.on("click")のようなイベント発火とは何が異なるのですか??
neko_daisuki

2021/04/09 04:25

dispatchEvent で引数のイベントを発生させてます。 それを addEventListener (jQuery だと on) で監視します。 このイベントを発生させたとき、ブラウザのコンソールには何かエラーが表示されていませんか?
neko_daisuki

2021/04/09 04:38

1.開発者ツールを開く 2.上のタブから Elements を選択 3. 右のパネル(Styles Computed ...) からEvent Listeners を選択 ここに updateComment があるかも確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問