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

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

詳細はこちら
JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

610閲覧

条件を満たすDOM要素の取得方法

Taka009

総合スコア2

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/01/30 12:39

やりたいこと

ビンゴゲームを作成しています。
ボタンを押すと、1〜9のいずれかの数字を選択し、そこで選択された数字がビンゴシート上で色が変わるようにしたいです。
※通常のビンゴに必要な諸々の機能はまだ実装していません。

解決したい問題

ボタンを押して選択された数字「selectedNum」と、ビンゴシートにある9マスのうちの、いずれかの「sheetNum」が一致する場合、そのマスのDOM要素を取得し、選択されたことがわかりやすいよう背景色をつけるためのクラスを付与したいのですが、特定の条件にあうDOM要素の取得方法、クラスの付与方法が思いつきません。アドバイスをお願いいたします。

javascript

1import { useEffect, useState } from 'react' 2import styled from 'styled-components' 3 4function App() { 5 const [drawedNum, setDrawedNum] = useState(' ') 6 const [sheetNums, setSheetNums] = useState([1,2,3,4,5,6,7,8,9]) 7 8 const shuffle = ([...array]) => { 9 for (let i = array.length - 1; i >= 0; i--) { 10 const j = Math.floor(Math.random() * (i + 1)); 11 [array[i], array[j]] = [array[j], array[i]]; 12 } 13 return array; 14 } 15 16 // ビンゴシート作成 17 // 1〜9の組み合わせて、マウントのたびに異なるシートを作成 18 useEffect ( () => { 19 setSheetNums(shuffle(sheetNums)) 20 }, []) 21 22// くじ引き 23// 1~9いずれかの数字をランダムで引く。 24 var selectedNum; 25 function selectNum () { 26 const array = [1,2,3,4,5,6,7,8,9] 27 selectedNum = array[Math.floor(Math.random() * 9)] 28 setDrawedNum(selectedNum) 29 } 30 31 console.log(drawedNum) 32 33 return ( 34 <> 35 <Field> 36 { 37 sheetNums.map((sheetNum, index) => { 38 return <div key={index}>{sheetNum}</div> 39 }) 40 } 41 </Field> 42 <SelectedNum>選ばれた番号は{drawedNum}です</SelectedNum> 43 <button onClick={selectNum}>くじ引きボタン</button> 44 </> 45 ); 46} 47 48export default App; 49 50const Field = styled.div` 51 box-sizing: border-box; 52 height: 270px; 53 width: 270px; 54 display: flex; 55 flex-wrap: wrap; 56 margin-bottom: 20px; 57 div { 58 box-sizing: border-box; 59 border: 1px solid black; 60 height: 90px; 61 width: 90px; 62 line-height: 90px; 63 text-align: center; 64 font-size: 25px; 65 } 66` 67const SelectedNum = styled.div` 68 width: 240px; 69 height: 100px; 70 border: solid 1px black; 71 line-height: 100px; 72 text-align: center; 73`

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

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

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

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

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

babu_babu_baboo

2021/01/31 03:13

<div data-key={index}>{sheetNum} class="mejirusi"</div>にして getElementsByClassName / querySelectorAll で取得して、 .dataset.key で番号を取得してはどうですか?
Taka009

2021/01/31 11:00

返信が遅れ申し訳ございません! アドバイスありがとうございました。 早速この方法で試してみたいと思います。
Taka009

2021/02/01 10:04

たびたびの質問ですみません。 9つあるdivにclassName、data-keyをつけて、querySelectorAllで取得しました。 そのNodeListの要素の1つからdataset.keyの値を取得しようとするとエラーが発生します。 エラー:TypeError: Cannot read property 'dataset' of undefined NodeListはちゃんと取得できているようで、要素の1つをconsole.logで確認したところ、 コンソールには、このように表示されました。 一行目 undefined 二行目 <div data-key=0 class='square' >5</div> 二行目をみるとちゃんと取得できているようなのですが、一行目にundefinedとあるのが問題なのでしょうか? ````javascript function App() { const [drawedNum, setDrawedNum] = useState(' ') const [sheetNums, setSheetNums] = useState([1,2,3,4,5,6,7,8,9]) const shuffle = ([...array]) => { for (let i = array.length - 1; i >= 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } return array; } // ビンゴシート作成 // 1〜9の組み合わせて、マウントのたびに異なるシートを作成 useEffect ( () => { setSheetNums(shuffle(sheetNums)) }, []) //質問に該当する部分 const sheetList = document.querySelectorAll("div.square") const sheetListItem = sheetList[3] console.log(sheetListItem.dataset.key) // くじ引き // 1~9いずれかの数字をランダムで引く。 var selectedNum; function selectNum () { // くじで引いた番号 selectedNum = sheetNums[Math.floor(Math.random() * 9)] setDrawedNum(selectedNum) } return ( <> <Field> { sheetNums.map((sheetNum, index) => { return <div key={index} data-key={index} className='square'>{sheetNum}</div> }) } </Field> <SelectedNum>選ばれた番号は{drawedNum}です</SelectedNum> <button onClick={selectNum}>くじ引きボタン</button> </> ); } ````
babu_babu_baboo

2021/02/01 10:33 編集

まず 素のJavascript で書きませんか?とても私には苦行です。 document.querySelectorAll("div.square") この時に、親要素にもつけていたとか・・・ 0番目のノードをconsole.log すればわかるのでは? 1つアドバイスですが、こういったものを作るときは、ビンゴゲームの内部的な処理と、出力するための処理を分離して制作します。 そうすれば、後からCANVASで描きたくなった時とか、SVGで描きたくなった時、出力される部分を書き換えるだけで応用できます。 あっ、ここは質問を再編集できたんだべ。
Taka009

2021/02/01 11:02

ご親切に何度もありがとうございます!! そうですね、javascriptも初心者にもかかわらず、使い慣れていないreactを使ってしまったため、質問が余計わかりにくいものになってしまいました。申し訳ございません!! 親要素にはclassはつけておらず、0番目のノードも思った通りのものになっているのを確認しました。 分離して制作するという考えも全く持っていませんでした。勉強になります。 その辺りもよく考えて、作り直してみます。 何度もありがとうございました!!
guest

回答1

0

ベストアンサー

js

1const 2ary =[ 3 0,0,1, 4 0,1,1, 5 1,0,1 6], 7 8ptn = [ 9 [0,1,2], [3,4,5], [6,7,8], 10 [0,3,6], [1,4,7], [2,5,8], 11 [0,4,8], [2,4,6] 12]; 13 14 15let bingo = 16 ptn.reduce ( 17 (a, b, c)=> 18 b.map ( 19 d=> 20 ary[d] 21 ).reduce ( 22 (a,b)=> 23 a + b 24 ) == 3 25 ? [...a, c] 26 : a 27 , []); 28 29console.log (bingo.length + " 箇所がビンゴ!") 30console.log(bingo);

投稿2021/02/01 11:44

編集2021/02/01 11:47
babu_babu_baboo

総合スコア616

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

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

Taka009

2021/02/01 11:48

何度もアドバイス、そしてご回答いただきありがとうございます!! とても勉強になります????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問