#javascript #arrays #function #matrix #swap
#javascript #массивы #функция #матрица #обмен
Вопрос:
Мне нужно иметь возможность просматривать рандомизированную матрицу 3 x 3 и проверять, в порядке ли числа (т. Е. Верхняя строка равна 1-3, центральная 4-6 и нижняя 7-9). До сих пор я писал эту функцию на JS:
function winningorder(topleft, topcenter, topright, centerleft, centercenter, centerright, bottomleft, bottomcenter, bottomright){
if(document.getElementById(topleft).innerHTML = 1 amp;amp; document.getElementById(topcenter).innerHTML = 2 amp;amp; document.getElementById(topright).innerHTML = 3 amp;amp; document.getElementById(centerleft).innerHTML = 4 amp;amp; document.getElementById(centercenter).innerHTML = 5 amp;amp; document.getElementById(centerright).innerHTML = 6 amp;amp;document.getElementById(bottomleft).innerHTML = 7 amp;amp; document.getElementById(bottomcenter).innerHTML = 8 amp;amp; document.getElementById(bottomright).innerHTML = 9){
setTimeout(function(){ alert("Well Done!"); }, 250);
}
Я не знаю, нужно ли мне указывать все местоположения (HTML-идентификатор каждой ячейки) в качестве параметров, так что это мой первый вопрос. Во-вторых, куда бы я поместил свою функцию в HTML-коде. код:
<table border=1>
<tr class="numberrow">
<td id="topleft" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)" ></td>
<td id="topcenter" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
<td id="topright" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
</tr>
<tr class="numberrow">
<td id="centerleft" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
<td id="centercenter" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
<td id="centerright" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
</tr>
<tr class="numberrow">
<td id="bottomleft" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
<td id="bottomcenter" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
<td id="bottomright" class="numbertile" onclick="processclick(this.id)" onchange=="winningorder(id)"></td>
</tr>
Моим первым решением было использовать событие onchange и запустить функцию, но это не работает. Спасибо за любую помощь!
Комментарии:
1. Поместите
document.getElementById(tileId)
в глобальную переменную и используйте ее вelse
блоке.2. поскольку выбранная ячейка уже является глобальной, вместо того, чтобы хранить innerHTML в clickedcell, сохраните элемент (и ваш if будет
if(!clickedcell)
для простоты) — остальное должно быть написано само3. но если я пытаюсь изменить внутреннюю часть ячейки (число в ячейке), разве мне не нужно было бы где-то хранить это число? или как мне точно написать этот код, я все еще застрял
4. Совершенно новая проблема, с которой я столкнулся, решил мою старую, был бы признателен за любую помощь @JaromandaX
5. @Barmar ты тоже
Ответ №1:
Я не знаю, нужно ли мне указывать все местоположения (идентификатор HTML каждой ячейки) в качестве параметров
Нет, вам не нужно. Вы получите объект события с элементом, который вызвал определенное событие ( event.target
) в вашей функции обратного вызова (processclick).
function processclick(event) {
var targetId = event.target.id;
}
Во-вторых, куда бы я поместил свою функцию в HTML-коде. код:
Трудно сказать, чего вы пытаетесь достичь, поэтому, вероятно, этот ответ будет отредактирован, но я предполагаю, что вы рендерите свою сетку на сервере и в javascript пытаетесь проверить ее правильность. Если это так, то самый простой способ — поместить код javascript после кода вашей таблицы html.
Полный пример (я предпочел читаемость кода производительности):
<html>
<head>
<style>
.numbertile {
height: 5em;
width: 5em;
}
</style>
</head>
<body>
<table border=1>
<tr class="numberrow">
<td id="topleft" class="numbertile">1</td>
<td id="topcenter" class="numbertile">2</td>
<td id="topright" class="numbertile">3</td>
</tr>
<tr class="numberrow">
<td id="centerleft" class="numbertile">4</td>
<td id="centercenter" class="numbertile">5</td>
<td id="centerright" class="numbertile">6</td>
</tr>
<tr class="numberrow">
<td id="bottomleft" class="numbertile">7</td>
<td id="bottomcenter" class="numbertile">8</td>
<td id="bottomright" class="numbertile">9</td>
</tr>
</table>
<script>
function winningorder() {
//[id, innerHTML]
var winningMap = {
topleft: 1,
topcenter: 2,
topright: 3,
centerleft: 4,
centercenter: 5,
centerright: 6,
bottomleft: 7,
bottomcenter: 8,
bottomright: 9
};
var tilesEl = document.getElementsByClassName('numbertile');
var isDone = Array.prototype.slice.call(
tilesEl, 0
).every(function (el) {
// the every() method tests whether all elements in the array pass
// the test implemented by the provided function.
return winningMap[el.id] === Number(el.innerHTML);
});
if (isDone) {
setTimeout(function(){ alert("Well Done!"); }, 250);
} else {
setTimeout(function(){ alert("Try again!"); }, 250);
}
}
winningorder();
</script>
</body>
</html>