Advertisement
Guest User

Untitled

a guest
Oct 1st, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.89 KB | None | 0 0
  1. >>550321
  2.  
  3. Это стоит спросить у техподдержки сервиса.
  4.  
  5. >>550687
  6.  
  7. Я заметил что у тебя нет модели поля (то есть например массива с информацией о состоянии ячеек), а ты хранишь все в DOM. В простых случаях это упрощает код, но в более сложных делает его запутаннее, и сложность этой задачи приближается к тому моменту когда модель становится нужна.
  8.  
  9. Также, стоит вынести все стили в CSS а в JS коде работать только с классами.
  10.  
  11. Также, получение элементов (getElementBy...) стоит вынести из кода отдельно.
  12.  
  13. > table {
  14. А это не помешает если мы на страницу какую-то другую таблицу захотим добавить, например таблицу рекордов? Я думаю, хоть тут и нет других таблиц, лучше приучаться сразу использовать правильные селекторы, то есть добавить таблице класс и к нему уже применять стили.
  15.  
  16. Также стоило наверно поставить для ячеек vertical-align.
  17.  
  18. Баг: если поставить на клетке флажок, а затем нажать на нее, то остается флажок и не появляется цифры.
  19.  
  20. > if (e.target.innerHTML == '10x10')
  21. Не стоит привязываться к тексту кнопки. Ведь достаточно добавить 1 пробел и все сломается. Надо привязываться к id, классам или data-атрибутам. Также, я думаю не стоит использовать один обработчик для разных кнопок и делать диспетчеризацию руками. Гораздо проще сделать например так, через вспомогательную функцию:
  22.  
  23. addOnClick('button-10x10', function () { ... });
  24.  
  25. > if (e.target.tagName != 'BUTTON') return;
  26. Это тоже очень ненадежно. Внутри button могут быть другие теги (например выделенный жирным текст в теге strong) и target может указывать на них. У тебя этих тегов нет, но мы должны учиться писать максимально надежный код, устойчивый к правкам верстки. Чтобы это учесть, приходится сначала искать ближайший BUTTON по цепочке родителей.
  27.  
  28. > document.getElementById('drawCustomField').onclick
  29. Это лучше разбивать на 2 строки, получение элемента и навешивание обработчика. Вместо onclick (и в других местах тоже) стоит использовать addEventListener, так как onclick может быть переопределен где-то в другом месте кода и твой обработчик отвалится.
  30.  
  31. > var width = parseInt(document.getElementById('width').value);
  32. > document.getElementById('table-container').appendChild(table);
  33. Получение элемента лучше вынести отдельно. Ты вообще мог бы в начале программы получить все нужные элементы и сохранить в переменных — код будет гораздо аккуратнее в итоге.
  34.  
  35. Также, не стоит писать большие куски кода в анонимных функциях. В данном случае лучше было сделать функцию drawCustomField().
  36.  
  37. > if (document.querySelector('table')) document.querySelector('table').remove();
  38. Копипаста, плохо. И селектор выбран неудачно — если добавить на страницу еще одну таблицу, он будет искать не то.
  39.  
  40. > var tr = document.createElement('tr');
  41. Интересно, что у table есть метод insertRow (но ты конечно не обязан его использовать тут): https://developer.mozilla.org/en-US/docs/Web/API/HTMLTableElement/insertRow
  42.  
  43. > for (var i = 0; i < tds.length; i++) {
  44. > tds[i].setAttribute('data-id', i + 1);
  45. Это было логичнее сделать в цикле создания таблицы.
  46.  
  47. > table.onkeyup = function() {
  48. > return false;
  49. Можешь объяснить смысл? keyup это отпускание клавиши клавиатуры и события клавиатуры посылается только элементу у которого фокус (то есть в котором мигает курсор). Таблица не может получить фокус, и внутри нее нет ни кнопок ни инпутов и она никогда не получит событие keyup.
  50.  
  51. > table.oncontextmenu = function(e) {
  52. Вот тут у тебя непонимание что это за событие. oncontextmenu это событие срабатывающее перед попыткой открыть контекстное меню. Это не событие нажатия на правую кнопку мыши — например меню можно открыть с клавиатуры кнопкой справа от пробела. Ты должен использовать mousedown c проверкой свойств события.
  53.  
  54. Я тебе рекомендую почитать про события, их виды, а также addEventListener, preventDefault(), например в learn.javascript.ru есть глава про это.
  55.  
  56. > e.target.innerHTML = '&#9971';
  57. Я бы поместил штуку справа в константу с понятными именем так как трудно понять что это за число.
  58.  
  59. > if (e.which == 1) {
  60. Просто хочу тебя предупредить что это очень проблемное свойство, в старых браузерах оно значило разные вещи. В новых браузерах сначала добавили свойство плохо спроектированное button (оно не позволяло зажимать больше одной клавиши мыши):
  61.  
  62. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
  63.  
  64. А затем спохватились и сделали нормальное свойство buttons:
  65.  
  66. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
  67.  
  68. Но увы, оно работает только в самых новых браузерах и с оговорками.
  69.  
  70. > target.style.background = 'red';
  71. > el.style.background = '#FF4500';
  72. Это правильнее делать добавлением класса. Стили должны быть в CSS файле, а не в JS.
  73.  
  74. > } else if (document.body.getElementsByClassName('selected').length +
  75. Это ужасно длинное условие, получение элементов надо вынести в отдельную строку. Также, класс надо искать только внутри таблицы а не везде. Также, лучше и удобнее сделать переменные-счетчики и отдельную функцию для получения числа раскрытых клеток.
  76.  
  77. > function selectTd(e) {
  78. Тут длинная простыня кода. Вынеси часть кода в отдельные небольшие функции.
  79.  
  80. > if (flagsCountered == target.innerHTML) {
  81. Не надо пытаться читать и анализировать innerHTML, это очень хрупко. Цифру лучше хранить например в data-атрибуте.
  82.  
  83. > if (document.body.getElementsByClassName('selected').length +
  84. > document.body.getElementsByClassName('minen').length ==
  85. > document.body.getElementsByTagName('td').length) {
  86. Тут скопипащен огромный кусок кода. Это абсолютно недопустимо и надо убрать.
  87.  
  88. > siblings.forEach(function(el) {
  89. > if (!el.classList.contains('flagged')) {
  90. > el.classList.add('selected');
  91. Этот код выглядит странно, ты открываешь клеточку не проверяя есть ли в ней мина.
  92.  
  93. > table.className = '';
  94. > selectedTds[i].className = '';
  95. Сбрасывать надо не все классы, а только те что ты поставил, иначе будет очень хрупкий код.
  96.  
  97. > function openEmptyCells(cell) {
  98. > if (checkSiblings(table, y, x - 1, false, 'minen', 'selected'))
  99. > if (checkSiblings(table, y, x + 1, false, 'minen', 'selected'))
  100. Такая копипаста — источник ошибок. Надо заменить ее на цикл/циклы.
  101.  
  102. > function fillMines(color) {
  103. Нельзя ли сделать раскрытие поля без обхода ячеек, просто добавить класс на таблицу? Конечно же можно.
  104.  
  105. > newg = alert('You win this game!');
  106. alert ничего не возвращает
  107.  
  108. > table.onclick = function() {
  109. > return false;
  110. Ставить/удалять обработчики - плохая идея, лучше сделать переменную для блокировки кликов.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement