🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

1回答

310閲覧

ラジオボタンの切り替えによる表示非表示

asako1010

総合スコア50

JavaScript

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

0グッド

0クリップ

投稿2019/12/17 07:18

##課題内容
上記課題内容のjavaScriptでtodoListを作っています。

ラジオボタンには、すべて/作業中/完了の3つチェックボタンがあり、それぞれチェックするとそれに合った配列が表示される様な仕組みを作っています。
チェックは1つしか選択できません。

現在、以下のコードでは「ラジオボタンの作業中を押したときにtr要素の完了が消え、ラジオボタンの完了を押したときにtr要素の作業中が消えるという仕組み」を作ろうとしています。

##質問の内容

現在、ラジオボタンの切り替えでtr要素の作業中または完了を非表示にする仕組みを作ろうとしています。

getElementByClassNameで作業中と完了の表示されているボタンの配列を取得し、parentNodeでtr要素まで遡ってstyle.displayを使って上記の仕組みを作ろうとしています。

しかし、現在ラジオボタンを押しても作業中も完了も非表示になりません。
その上、エラー(以下添付写真)が出ているのですが、調べてもどういうエラ―なのかが分かりません。
添付写真
イメージ説明

3時間以上、関連書籍やググったりしているのですが、解決できないでいます。

##使用エディタはVSCodeです。

HTML

1<!DOCTYPE html> 2<html lang="ja"> 34 5<head> 6 <meta charset="UTF-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 8 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 9 <title>ToDoリスト</title> 10 <link rel="stylesheet" href="css/style.css"> 1112</head> 1314 15<body> 16 <h1>ToDoリスト</h1> 1718 <div class="radiobutton"> 19 <input type="radio" id="button-1" name="radio1" value="1" checked="checked" /> 20 <label for="button-1">すべて</label> 21 <input type="radio" id="button-2" name="radio1" value="2" /> 22 <label for="button-2">完了中</label> 23 <input type="radio" id="button-3" name="radio1" value="3" /> 24 <label for="button-3">作業中</label> 2526 <table> 27 <thead id> 28 <tr> 29 <th>ID</th> 30 <th>コメント</th> 31 <th>状態</th> 32 </tr> 33 </thead> 34 <tbody id="idTbody"> 35 </tbody> 36 </table> 3738 <h2>新規タスクの増加</h2> 3940 <p id=id_p> 41 <input type="text" id="id_text" value=""> 42 <button id="btn" type="btn" class="button" value=""> 追加</button> 43 </p> 44 </div> 4546 <script src="js/main.js"></script> 47</body> 48 49</html>

JavaScript

1'use strict' 2let taskid = 0; 3function entryChange() { 4 radio = document.getElementsByClassName('radio1') 5 //ラジオボタンの0(すべて)がチェックされたとき 6 if (radio[0].checked) { 7 document.getElementsByClassName('done').style.display = ""; 8 document.getElementsByClassName('doing').style.display = ""; 9 //ラジオボタンの1(完了)がチェックされたとき 10 } else if (radio[1].checked) { 11 //フォーム 12 doing.forEach(done => { 13 console.log(done); 14 document.getElementsByClassName('done').style.display = ""; 15 document.getElementsByClassName('doing').style.display = "none"; 16 }) 17 //ラジオボタンの2(作業中)がチェックされたとき 18 } else if (radio[2].checked) { 19 //フォーム 20 doing.forEach(work => { 21 console.log(work); 22 document.getElementsByClassName('done').style.display = "none"; 23 document.getElementsByClassName('doing').style.display = ""; 24 }) 25 } 26} 27//オンロードさせ、リロード時に選択を保持 28window.onload = entryChange; 29 30//イベントリスナ―を登録 31const add_btn = document.getElementById('btn'); 32add_btn.addEventListener('click', () => { 33 const id_td = document.createElement("td"); 34 id_td.textContent = taskid; 35 const comment = document.getElementById("id_text").value; 36 const commentEl = document.createElement("td"); 37 commentEl.textContent = (comment); 38 39 const createWorkingBtn = function () { 40 //作業中ボタンを生成する処理 41 const workingBtn = document.createElement("button"); 42 workingBtn.classList.add("doing"); 43 workingBtn.textContent = "作業中"; 44 workingBtn.addEventListener('click', () => { 45 console.log('表示を変更'); 46 if (workingBtn.textContent === "作業中") { 47 workingBtn.classList.add("doing"); 48 workingBtn.textContent = "完了"; 49 // ボタン押下で生成されたdomの中の親要素へclassNameをつける処理 50 const doneParent = workingBtn.parentNode; 51 doneParent.className = 'workDone'; 52 } else { 53 workingBtn.classList.add("done"); 54 workingBtn.textContent = "作業中"; 55 // ボタン押下で生成されたdomの中の親要素へclassNameをつける処理 56 const workParent = this.parentNode; 57 workParent.className = 'work'; 58 } 59 }) 60 //生成した作業中ボタンを返す処理 61 return workingBtn; 62 } 63 const workingBtn = createWorkingBtn(); 64 65 66 const createDelBtn = function () { 67 //削除ボタンを生成する処理 68 const delBtn = document.createElement("button"); 69 delBtn.textContent = "削除"; 70 delBtn.addEventListener('click', () => { 71 idTbody.removeChild(trEl); 72 }) 73 //生成した削除ボタンを返す処理 74 return delBtn; 75 } 76 const delBtn = createDelBtn() 77 78 const trEl = document.createElement("tr"); 79 trEl.appendChild(id_td); 80 trEl.appendChild(commentEl); 81 trEl.appendChild(workingBtn); 82 trEl.appendChild(delBtn); 83 const todoEl = document.getElementById("idTbody"); 84 85 todoEl.appendChild(trEl); 86 taskid++; 87 88}, false);

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

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

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

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

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

x_x

2019/12/18 09:02

エラーは jQuery のようですが、jQuery を使っているのでしょうか?
guest

回答1

0

ベストアンサー

###気づいたこと
完全な回答ではありませんが、気づいたことがありますので、お伝えします。
ボタンの要素を取得しているところです。

** radio = document.getElementsByClassName('radio1')**

radio1はname属性なので、getElementsByName()を使えべきかと思います。
もしくは、ラジオボタンの方にradio1クラスをつけるか。

以上

投稿2019/12/17 07:42

編集2019/12/17 07:55
KazuSaka

総合スコア640

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

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

asako1010

2019/12/17 11:08

>>KazuSakaさん 修正します。 ご指摘ありがとうございます。
asako1010

2019/12/17 11:10 編集

>>AkitoshiManabeさん 前回ご指摘いただいた件について修正した後、コードミスがきっかけで過去のデータで上書きしたためリセットされたままにしていました。 再度修正します。 コメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問