前提・実現したいこと
ドットインストール「JavaScriptでビンゴシートを作ろう!」にて作ったビンゴシートに以下の機能を実装しようとしています。
・数字をクリックするとクラス(opened)を追加し色が変わる。
・シャッッフルボタンをクリックすると数字をシャッフルする。
・「カードを決定する」ボタンをクリックするとシャッフルボタンが無効化される。
発生している問題・エラーメッセージ
ページ再読み込み後、数字をクリックすると色が変わるが、一度でもシャッフルしてしまうと数字の色が変わらなってしまいます。
何度シャッフルしてもクリックして色が変わるようにしたいのですが上手くいきません。
該当のソースコード
長くなってしまいますが全コードを追記させていただきました。
HTML
1<body> 2 <table> 3 <thead> 4 <tr><th>B</th><th>I</th><th>N</th><th>G</th><th>O</th></tr> 5 </thead> 6 <tbody> 7 8 </tbody> 9 </table> 10 11 <div id="refresh">カードをシャッフル</div> 12 13 <div id="lock">カードを決定する</div> 14 15 <script src="js/main.js"> 16 </script> 17</body>
CSS
1body { 2 font-family: 'Courier New' , monospace; 3 user-select: none; 4} 5 6table { 7 margin: 15px auto; 8} 9 10th, td { 11 width: 60px; 12 height: 60px; 13 text-align: center; 14 line-height: 60px; 15} 16th { 17 font-size: 24px; 18 font-weight: bold; 19} 20td { 21 background-color: orange; 22 border: 2px solid orange; 23 border-radius: 5px; 24 cursor: pointer; 25 transition: 0.5s; 26} 27 28.opened { 29 background-color: white; 30 border-radius: 50%; 31 transform: rotateX(360deg); 32} 33 34#refresh { 35 height: 40px; 36 width: 200px; 37 background-color: lightsalmon; 38 border-radius: 10px; 39 box-shadow: 0 5px salmon; 40 margin: 40px auto; 41 text-align: center; 42 line-height: 40px; 43 cursor: pointer; 44 user-select: none; 45} 46#refresh:hover { 47 opacity: 0.8; 48} 49#refresh:active { 50 transform: translate(0, 5px); 51 box-shadow: none; 52 opacity: 1; 53} 54 55#lock { 56 height: 40px; 57 width: 200px; 58 background-color: lightgreen; 59 border-radius: 10px; 60 margin: 20px auto; 61 text-align: center; 62 line-height: 40px; 63 cursor: pointer; 64 user-select: none; 65} 66 67.inactive { 68 opacity: 0.5 !important; 69 background-color: #777 !important; 70 box-shadow: 0 5px #444 !important; 71 pointer-events: none !important; 72} 73 74.active { 75 background-color: green !important; 76}
JavaScript
1'use strict'; 2 3{ 4 function createColumn(col) { 5 const source = []; 6 for (let i = 0; i < 15; i++){ 7 source[i] = i + 1 + 15 * col; 8 } 9 10 const column = []; 11 for (let i = 0; i < 5; i++){ 12 column[i] = source.splice (Math.floor(Math.random() * source.length), 1)[0]; 13 } 14 15 return column; 16 } 17 18 function createColumns(){ 19 const columns = []; 20 for (let i = 0; i < 5; i++){ 21 columns[i] = createColumn(i); 22 } 23 24 columns[2][2] = 'FREE'; 25 return columns; 26 } 27 28 function renderBingo(columns){ 29 const tbody = document.querySelector('tbody') 30 31 while(tbody.firstChild) { 32 tbody.removeChild(tbody.firstChild); 33 } 34 35 for (let row = 0; row < 5; row++){ 36 const tr = document.createElement('tr'); 37 for (let col = 0; col < 5; col++){ 38 const td = document.createElement('td'); 39 td.textContent = columns[col][row]; 40 tr.appendChild(td); 41 } 42 document.querySelector('tbody').appendChild(tr); 43 } 44 } 45 46 const columns = createColumns(); 47 renderBingo(columns); 48 49 50 const refresh = document.getElementById('refresh'); 51 const lock = document.getElementById('lock'); 52 53 refresh.addEventListener('click', () => { 54 const columns = createColumns(); 55 renderBingo(columns); 56 }); 57 58 lock.addEventListener('click', () => { 59 refresh.classList.toggle('inactive'); 60 lock.classList.toggle('active'); 61 if(lock.classList.contains('active') === true){ 62 lock.textContent = 'カードを変更する'; 63 }else{ 64 lock.textContent = 'カードを決定する'; 65 } 66 67 }); 68 69 const td = document.querySelectorAll('td'); 70 71 for (let i = 0; i < 25; i++) { 72 td[i].addEventListener('click', ()=>{ 73 td[i].classList.toggle('opened'); 74 }); 75 } 76}
試したこと
最初に表示されている25マスが[0]〜[24]で、1度シャッフルすると[25]〜[49]になってしまうのではないかと思い、for文内の i < 25 を i < 100 などに変更して、一度だけシャッフルしてみたが動作しませんでした。
コンソール上にエラーは表示されていません。
プログラミング学習を初めて2ヶ月ほどの初心者で無知ではありますが、よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー