Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- >>550321
- Это стоит спросить у техподдержки сервиса.
- >>550687
- Я заметил что у тебя нет модели поля (то есть например массива с информацией о состоянии ячеек), а ты хранишь все в DOM. В простых случаях это упрощает код, но в более сложных делает его запутаннее, и сложность этой задачи приближается к тому моменту когда модель становится нужна.
- Также, стоит вынести все стили в CSS а в JS коде работать только с классами.
- Также, получение элементов (getElementBy...) стоит вынести из кода отдельно.
- > table {
- А это не помешает если мы на страницу какую-то другую таблицу захотим добавить, например таблицу рекордов? Я думаю, хоть тут и нет других таблиц, лучше приучаться сразу использовать правильные селекторы, то есть добавить таблице класс и к нему уже применять стили.
- Также стоило наверно поставить для ячеек vertical-align.
- Баг: если поставить на клетке флажок, а затем нажать на нее, то остается флажок и не появляется цифры.
- > if (e.target.innerHTML == '10x10')
- Не стоит привязываться к тексту кнопки. Ведь достаточно добавить 1 пробел и все сломается. Надо привязываться к id, классам или data-атрибутам. Также, я думаю не стоит использовать один обработчик для разных кнопок и делать диспетчеризацию руками. Гораздо проще сделать например так, через вспомогательную функцию:
- addOnClick('button-10x10', function () { ... });
- > if (e.target.tagName != 'BUTTON') return;
- Это тоже очень ненадежно. Внутри button могут быть другие теги (например выделенный жирным текст в теге strong) и target может указывать на них. У тебя этих тегов нет, но мы должны учиться писать максимально надежный код, устойчивый к правкам верстки. Чтобы это учесть, приходится сначала искать ближайший BUTTON по цепочке родителей.
- > document.getElementById('drawCustomField').onclick
- Это лучше разбивать на 2 строки, получение элемента и навешивание обработчика. Вместо onclick (и в других местах тоже) стоит использовать addEventListener, так как onclick может быть переопределен где-то в другом месте кода и твой обработчик отвалится.
- > var width = parseInt(document.getElementById('width').value);
- > document.getElementById('table-container').appendChild(table);
- Получение элемента лучше вынести отдельно. Ты вообще мог бы в начале программы получить все нужные элементы и сохранить в переменных — код будет гораздо аккуратнее в итоге.
- Также, не стоит писать большие куски кода в анонимных функциях. В данном случае лучше было сделать функцию drawCustomField().
- > if (document.querySelector('table')) document.querySelector('table').remove();
- Копипаста, плохо. И селектор выбран неудачно — если добавить на страницу еще одну таблицу, он будет искать не то.
- > var tr = document.createElement('tr');
- Интересно, что у table есть метод insertRow (но ты конечно не обязан его использовать тут): https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement/insertRow
- > for (var i = 0; i < tds.length; i++) {
- > tds[i].setAttribute('data-id', i + 1);
- Это было логичнее сделать в цикле создания таблицы.
- > table.onkeyup = function() {
- > return false;
- Можешь объяснить смысл? keyup это отпускание клавиши клавиатуры и события клавиатуры посылается только элементу у которого фокус (то есть в котором мигает курсор). Таблица не может получить фокус, и внутри нее нет ни кнопок ни инпутов и она никогда не получит событие keyup.
- > table.oncontextmenu = function(e) {
- Вот тут у тебя непонимание что это за событие. oncontextmenu это событие срабатывающее перед попыткой открыть контекстное меню. Это не событие нажатия на правую кнопку мыши — например меню можно открыть с клавиатуры кнопкой справа от пробела. Ты должен использовать mousedown c проверкой свойств события.
- Я тебе рекомендую почитать про события, их виды, а также addEventListener, preventDefault(), например в learn.javascript.ru есть глава про это.
- > e.target.innerHTML = '⛳';
- Я бы поместил штуку справа в константу с понятными именем так как трудно понять что это за число.
- > if (e.which == 1) {
- Просто хочу тебя предупредить что это очень проблемное свойство, в старых браузерах оно значило разные вещи. В новых браузерах сначала добавили свойство плохо спроектированное button (оно не позволяло зажимать больше одной клавиши мыши):
- https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
- А затем спохватились и сделали нормальное свойство buttons:
- https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
- Но увы, оно работает только в самых новых браузерах и с оговорками.
- > target.style.background = 'red';
- > el.style.background = '#FF4500';
- Это правильнее делать добавлением класса. Стили должны быть в CSS файле, а не в JS.
- > } else if (document.body.getElementsByClassName('selected').length +
- Это ужасно длинное условие, получение элементов надо вынести в отдельную строку. Также, класс надо искать только внутри таблицы а не везде. Также, лучше и удобнее сделать переменные-счетчики и отдельную функцию для получения числа раскрытых клеток.
- > function selectTd(e) {
- Тут длинная простыня кода. Вынеси часть кода в отдельные небольшие функции.
- > if (flagsCountered == target.innerHTML) {
- Не надо пытаться читать и анализировать innerHTML, это очень хрупко. Цифру лучше хранить например в data-атрибуте.
- > if (document.body.getElementsByClassName('selected').length +
- > document.body.getElementsByClassName('minen').length ==
- > document.body.getElementsByTagName('td').length) {
- Тут скопипащен огромный кусок кода. Это абсолютно недопустимо и надо убрать.
- > siblings.forEach(function(el) {
- > if (!el.classList.contains('flagged')) {
- > el.classList.add('selected');
- Этот код выглядит странно, ты открываешь клеточку не проверяя есть ли в ней мина.
- > table.className = '';
- > selectedTds[i].className = '';
- Сбрасывать надо не все классы, а только те что ты поставил, иначе будет очень хрупкий код.
- > function openEmptyCells(cell) {
- > if (checkSiblings(table, y, x - 1, false, 'minen', 'selected'))
- > if (checkSiblings(table, y, x + 1, false, 'minen', 'selected'))
- Такая копипаста — источник ошибок. Надо заменить ее на цикл/циклы.
- > function fillMines(color) {
- Нельзя ли сделать раскрытие поля без обхода ячеек, просто добавить класс на таблицу? Конечно же можно.
- > newg = alert('You win this game!');
- alert ничего не возвращает
- > table.onclick = function() {
- > return false;
- Ставить/удалять обработчики - плохая идея, лучше сделать переменную для блокировки кликов.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement