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

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

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

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

JavaScript

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

Q&A

解決済

2回答

1910閲覧

スクリプトをレンダリング後に実行したい

pecchan

総合スコア555

Ruby on Rails 5

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

JavaScript

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

0グッド

0クリップ

投稿2020/07/21 05:34

編集2020/07/21 05:34

rails5.2とjavascriptで開発してます。
javascriptは特に分かりません。

ここ
を参考にしてます。

上記の、「Room.idを受け取り、監視する場所を分ける」
という箇所のスクリプトを流用しました。

app/javascript/channels/room_channel.js

javascript

1/* global $*/ 2// $(function() {}; で囲むことでレンダリング後に実行される 3// レンダリング前に実行されると $('#messages').data('room_id') が取得できない 4$(function() { 5 alert("test") 6 const chatChannel = App.cable.subscriptions.create({ channel: 'ChatChannel', room: $('#messages').data('room_id') }, { 7 connected() { 8 }, 9 10 disconnected() { 11 }, 12 13 received: function(data) { 14 return $('#messages').append(data['message']); 15 }, 16 17 post: function(message) { 18 return this.perform('post', { message: message }); 19 } 20 }); 21 22 $(document).on('keypress', '[data-behavior~=chat_post]', function(event) { 23 if (event.keyCode === 13) { 24 chatChannel.post(event.target.value); 25 event.target.value = ''; 26 return event.preventDefault(); 27 } 28 }); 29}); 30

上記スクリプトは、ページのレンダリング後に実行されなければいけません。

参考先では、「$(function() {}; で囲むとレンダリング後に実行される」とコメントに記載されてます。

ですが当方の環境ではレンダリング前に実行されているようです。
というのは、2行目でalertを差し込みましたが、初回ページ表示にはalretが出ず、
F5更新でalertが出るからです。

どうすれば毎回レンダリング後に実行されるようになるでしょうか?

$(document).on('turbolinks:load', function(){
で囲ってあげるのでしょうか?
→試したいのですが、恥ずかしながら動くものを書けませんでした・・・。

分かる方教えていただけないでしょうか?
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

turbolinksの利用を前提で考えるとturbolinks:renderというオプションで実装できるかと思います。

turbolinks:render fires after Turbolinks renders the page. This event fires twice during an application visit to a cached location: once after rendering the cached version, and again after rendering the fresh version.

https://github.com/turbolinks/turbolinks#full-list-of-events

なのでコードとしては下記のような形で実装できるのではないでしょうか?

JavaScript

1$(document).on('turbolinks:render', function(){ 2 //ご提示頂いたJavaScript 3 $(function() { 4   : 5 }); 6});

投稿2020/07/21 06:13

編集2020/07/22 08:05
no1knows

総合スコア3365

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

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

pecchan

2020/07/21 06:39

有難う御座います。 turbolinks:loadではなくturbolinks:renderという使い方があるのですね! 記載したjava scriptを $(document).on('turbolinks:render', function(){ } でまるっと囲んだのですがParsing error:Unexpected token となりました。
no1knows

2020/07/21 08:15

パースエラーなので、ご提示いただいたJavaScript側でエラーが出ていますね。 alert("test")だけで、実行タイミングを確認いただき、期待する動作であれば、JavaScriptを修正していくと良いかと思います!
pecchan

2020/07/22 07:13

有難う御座います。 仰る通りalert("test")だけにしてみましたが、同じエラーでした。 ひょっとして 最後の、 } は、 }); でしょうか? であればエラー消えました。
no1knows

2020/07/22 08:05

あぁ、タイポです。申し訳ありません。
pecchan

2020/07/27 13:44

今回は、turbolinks:loadで行くことにしました。 有難う御座いました!
guest

0

windowのpageshowイベントはどうでしょう?

投稿2020/07/21 05:43

yambejp

総合スコア114769

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

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

yambejp

2020/07/21 06:40 編集

ちなみに処理順番はこんな感じ、 function→DOMContentLoaded→load→pageshow 逆順に書いても、上記のように処理されているのがわかります $(window).on('pageshow',function(){ console.log('pageshow'); }); $(window).on('load',function(){ console.log('load'); }); $(window).on('DOMContentLoaded',function(){ console.log('DOMContentLoaded'); }); $(function(){ console.log('function'); });
pecchan

2020/07/22 07:11

ご親切に有難う御座います。 逆順に記載しても仰る通りの順番でした! 問題のレンダリングですが、とりあえず test.jsを作り $(window).on('pageshow',function(){ alert("test"); }); としました。どのページに遷移してもalertが表示されると思ったのですが、 F5更新しないとalertが表示されないです。 何が考えられるでしょうか?
yambejp

2020/07/22 08:08

pageshow後に発生するイベントについては、その要素のイベントをトレースするか その作業後になんらかの属性がいれかわるなら MutationObserver的な対応も可能です
pecchan

2020/07/27 13:43

沢山教えていただき本当に有難う御座います。 恐縮ですが、今回は「turbolinks:load」で進めることにしました。 すみません、有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問