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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

1499閲覧

JavaScriptでonclickが実行された際、メソッドから引数を受け取りたい

Kawachi236

総合スコア7

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

onclick

onclickとはユーザーのクリック処理を指します。これは"onmousedown"(押下)と"onmouseup"(押上)の二つの事象の組み合わせです

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2020/04/05 09:38

onclickが実行された際、メソッドから引数を受け取りたい

JavaScriptでマルバツゲームを作っています。
実行ブラウザはGoogle Chromeです。
盤面がクリックされた際、マスに○印を描写する機能の実装中にエラーが発生しました。
コメントアウトされたハイフンで囲った箇所が該当箇所と思われます。

発生している問題・エラーメッセージ

index.js:22 Uncaught TypeError: Cannot set property 'textContent' of null at HTMLTableCellElement.onClicked (index.js:22)

該当のソースコード

JavaScript

1 2function initializeGame() { 3 4 var boardTable = document.getElementById("boardTable"); 5 6 for (var i = 0; i < 3; i++) { 7 var tr = document.createElement("tr"); 8 9 for (var j = 0; j < 3; j++) { 10 var td = document.createElement("td"); 11 td.className = "cell"; 12 td.id = "cell" + i + '-' + j; 13 14//------------------------------------------------------------ 15 td.onclick = onClicked; 16 tr.appendChild(td); 17 } 18 boardTable.appendChild(tr); 19 } 20} 21 22function onClicked(e) { 23 var clickedCellId = e.target.id; 24 document.getElementById("clickedCellId").textContent = "○"; 25} 26//------------------------------------------------------------ 27 28

試したこと

デバッグしてみたところ、メソッドonClickedの仮引数(e)に何も引数が渡されてないのかもしれないと思いました。

onclickというイベントが実行された際に、仕組みとして自動(?)でeventオブジェクトという実引数が、onclickプロパティにセットされたメソッドの仮引数に渡される認識だったのですが、この認識は間違っていますか?

どのようなコードにすれば改善されるか、教えて頂けると幸いです。
よろしくお願いいたします。

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

Google Chrome

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

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

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

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

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

guest

回答2

0

ベストアンサー

メソッドonClickedの仮引数(e)に何も引数が渡されてないのかもしれない

違います。

e.target はクリックされた要素が渡されています。

エラーの原因は id を取得し、変数 clickedCellId に格納しているのに、文字列 "clickedCellId"(存在しない id の要素)を getElementById() したため、null が返却され、ご質問で示したエラーメッセージとなっています。

javascript

1function onClicked(e) { 2 console.log( e.target ); // 要素が渡されていることを確認できる。 3 var clickedCellId = e.target.id; 4 console.log( clickedCellId ); // id を確認できる 5 document.getElementById(clickedCellId).textContent = "○"; 6}

ご質問のコードでは、全ての td 要素にイベントリスナを適用しているので、以下のようにできます。

javascript

1function onClicked(e) { 2 e.target.textContent = "○"; 3}

動くサンプル では、クリックする度に ○と×が切り替わる内容にしてみました。

投稿2020/04/05 10:38

編集2020/04/05 10:53
AkitoshiManabe

総合スコア5432

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

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

Kawachi236

2020/04/05 11:07

回答ありがとうございます。 原因から改善案までご提示頂き大変恐縮です。 console.logを使い細かにデバッグする方法、これから積極的に使っていきます。 また、動くサンプルも早速ローカルにコピペさせて頂きました。 よりよいコードを書けるよう勉強させていただきます! ありがとうございました!
AkitoshiManabe

2020/04/05 11:11

おそらく、盤面のサイズを動的変更されるのだろうと感じ、ご質問のコードをそのまま解説させていただきました。 table 要素に1回だけ同じイベントリスナを適用する バブリング を活用した方法もありますので、こちらも試してみると良いと思います。頑張ってください。
guest

0

以下のように書く方ががシンプルだと思います。

javascript

1function onClick(button){ 2 button.value= "○"; 3} 4

html

1<input type="button" onclick="onClick(this)">

投稿2020/04/05 10:18

soliste16

総合スコア757

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

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

Kawachi236

2020/04/05 10:51

回答ありがとうございます! テーブルを使って書くよりも、ボタンを組み合わせて盤面を作ったほうがシンプル、ということでしょうか? ボタンを使ったパターンも書いてみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問