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

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

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

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

Q&A

解決済

1回答

4033閲覧

初回ロードだけでイベント発火させたいのですが、リロードしなければイベント発火してくれません。

tamagokake

総合スコア33

JavaScript

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

1グッド

1クリップ

投稿2022/02/17 15:56

編集2022/02/18 03:21

前提・実現したいこと

プログラミングに初めて触れたばかりの初心者で初めての質問なので、初歩的なミスだと思うのですがお手柔らかにお願いいたします。
javascriptで編集ボタンをクリックすると非同期通信でラベルが非表示になりコメントエリアが表示されるようにしたいです。WebアプリケーションはRailsを使っています。

発生している問題

なんとか表示非表示の変更ができるようになったのですが、初回ロードした後一度リロードしなければ編集ボタンをクリックするというイベント発火ができません。DOMContentLoadedイベントがページ遷移の際に発火されません。

該当のソースコード

js

1window.addEventListener('DOMContentLoaded', () => { 2 const corporateEditButton = document.getElementById("js-edit-corporate-btn"); 3 corporateEditButton.addEventListener("click", () => { 4 const corporateListTitle = document.getElementById("js-corporate-label") 5 var corporateLabelArea = document.getElementsByClassName("corporate-data") 6 var corporateTextArea = document.getElementsByClassName("corporate-text") 7 const corporateButton = document.getElementById("js-corporate-button") 8 const corporateFormButton = document.getElementById("button-box") 9 for(let i = 0; i < 13; i++) { 10 corporateFormButton.style.display = "none"; 11 corporateListTitle.style.display = "none"; 12 corporateLabelArea[i].style.display = "none"; 13 corporateTextArea[i].style.display = "block"; 14 corporateButton.style.display = "block"; 15 } 16 }); 17});

html

1 <div class='list-title-show'> 2 <h2 id='js-corporate-label'> 3 <%= @corporate.name %> 4 </h2> 5 <div id="js-textarea-corporate" class="list-title-edit"> 6 <input style="display: none;" class="corporate-text" value=<%= @corporate.name %>> 7 </div> 8 </div> 9 <div class='corporate-info'> 10 <p class='corporate-data'> 11 <%= @corporate.industry %> 12 </p> 13 <input style="display: none;" class="corporate-text" value=<%= @corporate.industry %>> 14 <p class='corporate-data'> 15 <%= @corporate.capital %> 16 </p> 17 <input style="display: none;" class="corporate-text" value=<%= @corporate.capital %>> 18 <p class='corporate-data'> 19 <%= @corporate.business_content %> 20 </p> 21 <input style="display: none;" class="corporate-text" value=<%= @corporate.business_content %>> 22 <p class='corporate-data'> 23 <%= @corporate.strength %> 24 </p> 25 <input style="display: none;" class="corporate-text" value=<%= @corporate.strength %>> 26 <p class='corporate-data'> 27 <%= @corporate.weakness %> 28 </p> 29 <input style="display: none;" class="corporate-text" value=<%= @corporate.weakness %>> 30 <p class='corporate-data'> 31 <%= @corporate.others %> 32 </p> 33 <input style="display: none;" class="corporate-text" value=<%= @corporate.others %>> 34 <div id="button-box"> 35 <div class='form-btn-box'> 36 <span class="form-btn", id="js-edit-corporate-btn">編集</span> 37 <%=link_to 'もどる', root_path, class:"back-btn" %> 38 </div> 39 </div> 40 <div class='form-btn-box' id="js-corporate-button" style="display: none;"> 41 <button data-update type="submit" class="form-btn">変更</button> 42 <button data-cancel type="button" id = "cancel-id" class="edit-back-btn">キャンセル</button> 43 </div> 44 </div>

試したこと

初めはloadイベントを使っていたのですが、DOMツリーの構築が完了した時点でイベント発火されるDOMContentLoadedイベントの方が速いということが分かりDOMContentLoadedイベントに変更しました。それでも同じように一度ロードしなければならないのは変わりませんでした。
alert()やconsole.log()で動きを確認しましたが、やはり初回ロードでは反応せずもう一度ロードした際に反応がありました。

loadイベントやDOMContentLoadedイベントでは初回ロードでイベント発火させることはできないのでしょうか?
何かご助言を頂けたら幸いです。

shinoharat👍を押しています

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

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

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

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

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

int32_t

2022/02/17 16:07

「ページ遷移」とはどういう操作のことを指していますか? ページの初回ロードやリロードとは違うのですよね?
tamagokake

2022/02/17 16:24

言葉足らずで申し訳ありません。 ページの初回ロードのことをページ遷移と書いてしまいました。初回ロードではイベント発火しないのですが、リロードするとイベント発火するので初回ロードからイベント発火させたいです。
m.ts10806

2022/02/17 22:46

HTMLも提示してください。 コピペで再現できないと応えようがないです。
int32_t

2022/02/18 00:11

DOMContentLoaded イベントは初回のロードでも発火します。 まずは、DOMContentLoaded イベントリスナの先頭に console.log() や alert() でも入れてイベントリスナが呼ばれているかどうかの確認をしましょう。
shinoharat

2022/02/18 00:27

> 初回ロードした後一度リロードしなければ編集ボタンをクリックするというイベント発火ができません。 症状を聞いた感じ、turbolinks のような高速化ライブラリが悪さをしている気がします。 何かのWebアプリケーションフレームワーク(Rails とか、Laravel とか)を使ってたりしますか?
guest

回答1

0

ベストアンサー

質問文の編集ありがとうございます!

Rails を使っていて、リロードしなければ javascript が動作しないということは、十中八九 Turbolinks(Rails7以降は Turbo)が犯人だと思います。

【1】まずは rails -v コマンドを使って、ご自身のRailsのバージョンを確認してください。

【2】Rails のバージョンが 7 以上 なら、イベントリスナーに turbo:load を加えてください。

diff

1- window.addEventListener('DOMContentLoaded', () => { 2+ window.addEventListener('DOMContentLoaded turbo:load', () => {

Rails のバージョンが 7 未満 なら、イベントリスナーに turbolinks:load を加えてください。

diff

1- window.addEventListener('DOMContentLoaded', () => { 2+ window.addEventListener('DOMContentLoaded turbolinks:load', () => {

--

【おまけ】
Turbolinks(または Turbo)というのは、Rails が標準で採用している、ページ遷移高速化ライブラリです。
簡単にWebアプリを高速化できる反面、ライブラリの知識が無い場合、今回のようなトラブルを引き起こすこともあります。

最終的には Turbolinks を使いこなせるようになるのがベストですが、初心者のうちは Turbolinks を off にして基礎を学び、後から Turbolinks 部分を追加で学ぶという手法もアリかと思います。

google で「rails turbolinks」と検索すれば、off にする方法含め、色々と情報が出てくると思いますので、また調べてみてください。

--

ちなみに、Rails 6 までは Turbolinks というライブラリが採用されていましたが、
Rails 7 からは Turbo という別のライブラリを使うようになりました。

名前は似ていますが別物ですので、ググる際は混同しないようにご注意ください。

投稿2022/02/18 05:28

shinoharat

総合スコア1685

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

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

tamagokake

2022/02/18 05:54 編集

丁寧に順序立てた解決方法とTurbolinksの知識まで付け加えてくださりありがとうございます! 'DOMContentLoaded'を'turbolinks:load'に変更したら仰ったように解決しました。 Turbolinksについてさらに検索して勉強したいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問