При клике меняются элементы массива
В массиве все элементы = 0. При клике по квадрату в сетке grid получаем ID Diva и в этой координате вокруг значения элементов меняются на 3.
Но не работает замена. Кто знает, помогите пожалуйста!! Координаты клика q и w подставляю в console.log(replaceSurrounding(matrix, q, w)); Но это же неправильно? Надо цифры подставлять. А как это сделать - не понимаю... <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Замена в матрице</title> </head> <body> <style> *{ margin: 0; padding: 0; box-sizing: border-box; } .wrapper { display: grid; width: 220px; height: 220px; } #grid { display: grid; grid-template-columns: repeat(5, auto); grid-template-rows: repeat(5, auto); width: 220px; height: 220px; } #grid>div { height: 42px; width: 42px; background-color: #38d929; border: solid 1px white; } </style> <div class="wrapper"> <div id="grid"> <div class="block" id="0/0"></div> <div class="block" id="1/0"></div> <div class="block" id="2/0"></div> <div class="block" id="3/0"></div> <div class="block" id="4/0"></div> <div class="block" id="0/1"></div> <div class="block" id="1/1"></div> <div class="block" id="2/1"></div> <div class="block" id="3/1"></div> <div class="block" id="4/1"></div> <div class="block" id="0/2"></div> <div class="block" id="1/2"></div> <div class="block" id="2/2"></div> <div class="block" id="3/2"></div> <div class="block" id="4/2"></div> <div class="block" id="0/3"></div> <div class="block" id="1/3"></div> <div class="block" id="2/3"></div> <div class="block" id="3/3"></div> <div class="block" id="4/3"></div> <div class="block" id="0/4"></div> <div class="block" id="1/4"></div> <div class="block" id="2/4"></div> <div class="block" id="3/4"></div> <div class="block" id="4/4"></div> </div> </div> <script> const matrix = [ [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0] ]; const handleClick = event => { const id = event.target.id if (id) { console.log(id) let str1 = id; let q = str1.slice(0,-2); let w = str1.slice(-1); function replaceSurrounding(matrix, q, w) { for (let i = 0; i < 5; i++) { for (let j = 0; j < 5; j++) { if (i === q && j === w) { // Заменяем элементы справа, сверху и снизу for (let x = Math.max(0, j - 1); x < Math.min(5, j + 2); x++) { for (let y = Math.max(0, i - 1); y < Math.min(5, i + 2); y++) { if (x !== j || y !== i) { matrix[y][x] = "3"; } } } // Обработка особых случаев /* if (j === 0) { // Заменяем только элементы справа и снизу, если индекс j равен 0 for (let x = j + 1; x < Math.min(5, j + 2); x++) { for (let y = Math.max(0, i - 1); y < Math.min(5, i + 2); y++) { if (x !== j || y !== i) { matrix[y][x] = "1"; } } } } else if (j === 4) {*/ // Заменяем только элементы сверху и слева, если индекс j равен последнему /* for (let x = Math.max(0, j - 1); x < j; x++) { for (let y = Math.max(0, i - 1); y < Math.min(5, i + 2); y++) { if (x !== j || y !== i) { matrix[y][x] = "1"; }*/ // } // } // } } } } return matrix; } console.log(replaceSurrounding(matrix, q, w)); // console.log(replaceSurrounding(matrix, 11)); console.log(q); console.log(w); } } document.querySelector(".wrapper").addEventListene r ("click", handleClick); </script> </body> </html> |
Цитата:
<style> *{ margin: 0; padding: 0; box-sizing: border-box; } .wrapper { display: grid; width: 220px; height: 220px; } #grid { display: grid; grid-template-columns: repeat(5, auto); grid-template-rows: repeat(5, auto); width: 220px; height: 220px; } #grid > div { height: 42px; width: 42px; background-color: #38d929; border: solid 1px white; } </style> <div class="wrapper"> <div id="grid"></div> </div> <script> const arr = Array.from({length: 5}, _ => new Array(5).fill(0)) arr.forEach((a, i) => a.forEach((_, j) => { const o = document.createElement('div') o.dataset.i = i o.dataset.j = j grid.insertAdjacentElement('beforeend', o) })) grid.addEventListener('click', e => { const o = e.target.closest('[data-i]') if (!o) return const r = +o.dataset.i const c = +o.dataset.j for (let i = r - 1; i <= (r + 1); i++) { for (let j = c - 1; j <= (c + 1); j++) { if (i === r && j === c) continue if (arr[i][j] === undefined) continue arr[i][j] = 3 grid.querySelector(`[data-i='${i}'][data-j='${j}']`).textContent = 3 } } }) </script> |
Спасибо!! Но на некоторых квадратах выдает ошибку.
В нижнем левом, к примеру, main.js:31 Uncaught TypeError: Cannot read properties of undefined (reading '-1') at HTMLDivElement.<anonymous> (main.js:31:23) |
соседние клетки по клику
Димитр,
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> * { margin: 0; padding: 0; box-sizing: border-box; } .wrapper { display: grid; width: 220px; height: 220px; } #grid { display: grid; grid-template-columns: repeat(var(--columns, 5), auto); grid-template-rows: repeat(var(--rows, 5), auto); width: 220px; height: 220px; } #grid>div { height: 42px; width: 42px; background-color: #38d929; border: solid 1px white; text-align: center; line-height: 42px; } </style> </head> <body> <div class="wrapper"> <div id="grid"></div> </div> <script> let rows = 5; let columns = 8; grid.style.setProperty('--rows', rows); grid.style.setProperty('--columns', columns); const arr = Array.from({ length: rows }, _ => Array.from({ length: columns }, _ => { const o = document.createElement('div') grid.insertAdjacentElement('beforeend', o) return 0; })) let divs = Array.from(document.querySelectorAll('#grid > div')); grid.addEventListener('click', e => { const o = e.target.closest('#grid > div'); if (!o) return; let ii = divs.indexOf(o); const r = ii / columns | 0; const c = ii % columns; for (let i = r - 1; i <= r + 1; i++) { if (i < 0 || i == rows) continue for (let j = c - 1; j <= c + 1; j++) { if (j < 0 || j == columns) continue if (i === r && j === c) continue arr[i][j] = 3; let k = i * columns + j; divs[k].textContent = 3 } } }) </script> </body> </html> |
Да, все нормально!!! Спасибо!!!
А что значит const r = ii / columns | 0; Вертикальная линия? |
Цитата:
Цитата:
почти тоже самое, что Math.trunc() |
Спасибо!!
|
А как сделать, чтобы были не div в ячейках массива, а нули?
|
Цитата:
есть два массива: arr и divs, arr для значений, divs для элементов. |
У меня не получается связать мой массиы с матрицей.
[ [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0] ]; |
Часовой пояс GMT +3, время: 01:18. |