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

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

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

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2039閲覧

Cannot read property 'addEventListener' of nullの理由が分からない。

s.mima

総合スコア8

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/09/03 13:06

編集2021/09/03 13:09

前提・実現したいこと

プログラミングの初心者です。

javascriptでclickイベントを発火させようと思っているのですが、何故か上手く行きません。

function gamememo() { const game_submit = document.getElementById("comment-btn-id"); console.log(game_submit); game_submit.addEventListener("click", (e) => { e.preventDefault(); console.log("アイウエオ"); ~省略~ } window.addEventListener("load", gamememo);

ちなみに、console.log(game_submit)の結果は、nullでした。
この理由が本当にわかりません。

また、chromeの検証ツールには以下のような記載がありました。
イメージ説明

見ての通り、"Cannot read property 'addEventListener' of null"なので、game_submitがnullだと示されています。

また、HTMLのフォーム部分を貼り付けます。

<%= form_with(model: [@game, @game_comment], url:game_game_comments_path(game_id: @game.id), id:"comment-form", local: true) do |f| %> <%= f.text_area :game_comment_text, placeholder:"対局を申し込もう!",class:"comment-text", id:"comment-text-id" %> <%= f.submit "対局の申し込み", class:"comment-btn", id:"comment-btn-id" %>

clickイベントを発火させたいのですが、それができず、その原因は

const game_submit = document.getElementById("comment-btn-id");

がnullであることは明白だと思いますが、この解決方法がわかりません。
どなたか、教えていただけないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

loadイベントが起きた時点で comment-btn-id がIDの要素が(まだ)文書中にないのでしょう。確認方法を覚えるとよいですよ。以下、Google Chrome での確認方法です

  1. 対象ページをChromeで開く
  2. 開発者ツールを開く
  3. 開発者ツールのSourcesタブでgamememo()の定義を探し、その中の1行目にブレークポイントをセット
  4. 対象ページをリロード
  5. ブレークポイントでスクリプト実行が止まるので、開発者ツールのElementsタブを表示してその時点で comment-btn-id の要素がないか確認する

問題の解決方法は、以下のどれかでしょうか:

  1. comment-btn-id の要素が load イベントより前に生成されるようにする
  2. gamememo() の実行を load イベントではなく comment-btn-id の要素が生成されるより後に移動する
  3. 特定の要素に addEventListener() するのはやめる。例:

js

1function gamememo() { 2 document.addEventListener('click' e => { 3 if (e.target.closest('#comment-btn-id')) { 4 e.preventDefault(); 5 console.log("アイウエオ"); 6 ... 7 } 8 });

投稿2021/09/03 13:36

編集2021/09/03 13:38
int32_t

総合スコア20884

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

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

s.mima

2021/09/03 13:56

int32_tさん、ご回答本当にありがとうございます! アドバイスを元に自分で、やってみます。
s.mima

2021/09/03 15:14

3の方法でやったら、できました!! 本当に本当にありがとうございます! 助かりました!
guest

0

HTMLのフォーム部分を貼り付けます。

実際に生成されたHTMLはどのようになっていますか?

JavaScriptは生成後のHTMLを見て処理を行いますので、そちらできちんとIDが付いているか確認してみましょう。

投稿2021/09/03 13:20

maisumakun

総合スコア145184

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

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

s.mima

2021/09/03 13:31

maisumakunさん、ご回答本当にありがとうございます。 ただ、初心者なもので、おっしゃっている意味が失礼ながら理解できません。 「生成後のHTML」とは、何のことでしょうか。 HTMLファイルとJavascriptファイル、全て添付します。 ``` function gamememo() { const game_submit = document.getElementById("comment-btn-id"); console.log(game_submit) game_submit.addEventListener("click", (e) => { e.preventDefault(); console.log("アイウエオ"); const formData = new FormData(document.getElementById("comment-form")); const XHR = new XMLHttpRequest(); const list = document.getElementById("comment-list-id"); const gameId = list.getAttribute("game-comment-id"); console.log(gameId) XHR.open("POST",`/games/${gameId}/game_comments`, true); XHR.responseType = "json"; console.log(1); XHR.send(formData); console.log(2) XHR.onload = () => { if (XHR.status != 200) { alert(`Error ${XHR.status}: ${XHR.statusText}`); return null; } console.log(3) const gamecomment = XHR.response.game_comment; const formText = document.getElementById("comment-text-id"); const current_user_nickname = document.getElementById("current_user_nickname").textContent; console.log(current_user_nickname) const HTML = ` <div class="comment-list", id="comment-list-id"> <div class="comment-user"> 対局希望者 : ${current_user_nickname} </br> </div> <div class="comment-content"> コメント内容 : ${gamecomment.game_comment_text} </div> </div>`; console.log(HTML) list.insertAdjacentHTML("beforebegin", HTML); formText.value = ""; }; }); } window.addEventListener("load", gamememo); ``` ``` <table class="detail-table"> <tbody> <tr> <th class="detail-item">投稿者</th> <td class="detail-value"><%= @game.user.nickname %></td> </tr> <tr> <th class="detail-item">対戦者の希望日時</th> <td class="detail-value"><%= @game.game_date %></td> </tr> <tr> <th class="detail-item">使用する将棋アプリ</th> <td class="detail-value"><%= @game.game_app %></td> </tr> <tr> <th class="detail-item">対戦者の棋力</th> <td class="detail-value"><%= @game.kiryoku.name %></td> </tr> <tr> <th class="detail-item">対戦者からのコメント</th> <td class="detail-value"><%= @game.text %></td> </tr> </tbody> </table> <div class="comment-box"> <%= form_with(model: [@game, @game_comment], url:game_game_comments_path(game_id: @game.id), id:"comment-form", local: true) do |f| %> <%= f.text_area :game_comment_text, placeholder:"対局を申し込もう!",class:"comment-text", id:"comment-text-id" %> <%= f.submit "対局の申し込み", class:"comment-btn", id:"comment-btn-id" %> <% end %> <p><コメント一覧></p> <% @game_comments.each do |game_comment| %> <div class="comment-list", id="comment-list-id" game-comment-id=<%= current_user.id %> > <div class="comment-user"> 対局希望者 : <%= game_comment.user.nickname %> </div> <div class="comment-content"> コメント内容 : <%= game_comment.game_comment_text %> </div> </div> <% end %> </div>
maisumakun

2021/09/03 13:34

> 「生成後のHTML」とは、何のことでしょうか。 ブラウザの検証ツールなどで、Railsが吐き出した結果としてのHTMLを確認してください。 > HTMLファイルとJavascriptファイル、全て添付します。 Railsのソースコードが「意図したように処理されているか」が問題なので、Railsのコードを提示されても確認できません。
maisumakun

2021/09/03 13:45

えっと、そこではなくてHTMLの方を確認してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問