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

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

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

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

Q&A

解決済

1回答

1802閲覧

thのcellIndexの取得

pokenasu11

総合スコア23

JavaScript

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

0グッド

0クリップ

投稿2020/05/23 00:25

前提・実現したいこと

javascriptでソート付きの表を作成しています。
見出しセルをクリックして、セルのインデックスを取得したいのですが、
どのセルをクリックしても同じ数字が出てしまいます。

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

どのthをクリックしても3

該当のソースコード

js

1 2const tbl_ths =['Name', 'gender','Team', 'Score',]; 3const tbl_dat=[ 4 ['Tokieda','男','red','2'], 5 ['takahashi','男','blue','12'], 6 ['miyahashi','男','blue','31'], 7 ['taguchi','女','Orange','32'], 8]; 9 10class setHead { 11 constructor(els){ 12 const table = document.querySelector('table'); 13 this.thead = document.createElement('thead'); 14 this.tr=document.createElement('tr'); 15 for(let i=0;i<els.length;i++){ 16 this.th=document.createElement('th'); 17 this.th.innerHTML=els[i]; 18 this.th.addEventListener('click',()=>{ 19 20 console.log(this.th.cellIndex) 21       //この部分が問題↑ 22 23 }) 24 this.tr.appendChild(this.th); 25 } 26 this.thead.appendChild(this.tr); 27 table.appendChild(this.thead); 28 } 29} 30 31class setDate { 32 constructor(array){ 33 const table = document.querySelector('table'); 34 this.tbody = document.createElement('tbody'); 35 36 array.forEach(els => { 37 this.tr=document.createElement('tr'); 38 39 for(let i=0;i<els.length;i++){ 40 this.td=document.createElement('td'); 41 this.td.innerHTML=els[i]; 42 this.tr.appendChild(this.td); 43 }; 44 45 this.tbody.appendChild(this.tr); 46 }) 47 table.appendChild(this.tbody); 48 } 49 50} 51 52const header=new setHead(tbl_ths); 53const date = new setDate(tbl_dat);

何故同じ番号しか現れないのか?どのようにしたら取得できるか、教えてください。

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

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

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

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

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

m.ts10806

2020/05/23 00:37

thisってこのとき必要なんでしょうか(まだ動かして確認してないけど、ここが原因な気もする)
pokenasu11

2020/05/23 02:57

ありがとうございます。ご指摘の通りでした。
guest

回答1

0

ベストアンサー

forループで、this.thという変数が上書きされていることが原因です。
this.thには一度はcellIndexが0や1の要素が代入されますが、最終的にforループを抜けたときにはthis.thにはcellIndexが3の要素が上書き代入された状態になっており、全てのイベントハンドラはそのcellIndexが3の要素を見ることになります。

forループ内でletやconstで新たに宣言したものであればループして上書きされることはないので、以下のようにしましょう。

javascript

1class setHead { 2 constructor(els){ 3 const table = document.querySelector('table'); 4 this.thead = document.createElement('thead'); 5 this.tr=document.createElement('tr'); 6 for(let i=0;i<els.length;i++){ 7 const th=document.createElement('th'); 8 th.innerHTML=els[i]; 9 th.addEventListener('click',()=>{ 10 11 console.log(th.cellIndex); 12 13 }) 14 this.tr.appendChild(th); 15 } 16 this.thead.appendChild(this.tr); 17 table.appendChild(this.thead); 18 } 19}

投稿2020/05/23 00:43

編集2020/05/23 00:45
ku__ra__ge

総合スコア4524

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

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

pokenasu11

2020/05/23 02:59

ご指摘の通りに変更したらうまくいきました。 thisの使い方をよく考えないとダメですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問