Как исправить эту функцию цветового события в Javascript в этом Pixel Art Maker? - PullRequest
1 голос
/ 04 июня 2019

Мне нужно знать, как очистить все при нажатии кнопки «Отправить», чтобы он снова работал без проблем

Я создал проект, и все в порядке, если указать ширину и высоту и щелкнуть «Отправить» (первый раз) созданную таблицу, и все работает, а также вы можете добавить любой цвет, но проблема в щелчке «Отправить» (второй раз) созданной таблицы. но я не могу использовать цвета, но при нажатии кнопки «Отправить» (в третий раз) цвета работают и так. Как я могу очистить все, когда нажимаете кнопку «Отправить» каждый раз? https://codepen.io/mokai2008/pen/OYqzxj

HTML:

<!DOCTYPE html>
<html>
<head>
    <title>Pixel Art Maker!</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Monoton">
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <h1>Pixel Art Maker</h1>

    <h2>Choose Grid Size</h2>
    <form id="sizePicker">
        Grid Height:
        <input type="number" id="inputHeight" name="height" min="1" value="1">
        Grid Width:
        <input type="number" id="inputWidth" name="width" min="1" value="1">
        <input type="submit">
    </form>

    <h2>Pick A Color</h2>
    <input type="color" id="colorPicker">

    <h2>Design Canvas</h2>
    <table id="pixelCanvas"></table>

    <script src="designs.js"></script>
</body>
</html>

Javascript:

const form = document.querySelector('#sizePicker');

form.addEventListener('submit', formSubmit);

function formSubmit() {
  event.preventDefault();

  const width = document.querySelector('#inputWidth').value;
  const height = document.querySelector('#inputHeight').value;

  makeGrid(width, height);


}

function makeGrid(width, height) {


// Select Width , Height and color values

  const table = document.querySelector('#pixelCanvas');

// Create the Canvas
  let grid = '';

  for(let i = 1; i <= width; i++) {
    grid += `<tr>`
    for(let j = 1; j <= height; j++) {
      grid += `<td class='cell'></td>`;
    }
    grid += `</tr>`;
  }

  table.innerHTML = grid;

  //call the color function
addColor();

}
  // Create event listener for the color

function addColor() {
  const color = document.querySelector('#colorPicker').value;

  document.querySelector('table').addEventListener('click', function(e) {
    if(e.target.classList.contains('cell')) {
      const event = e.target;
      console.log('berfore ask', e.target);
      if(event.hasAttribute('style')) {
        console.log('there is style attr to remove', e.target);

        event.removeAttribute('style');

      } else {
        console.log('there is no att so we create it', e.target);

        event.style.backgroundColor = color;
      }
    }
  });
}

1 Ответ

1 голос
/ 04 июня 2019

Проблема в том, что для каждой отправки вы добавляете нового слушателя, не удаляя старого.Так что в первый раз все работает так, как вы хотите.Во второй раз у него есть 2 прослушивателя, и при нажатии он сначала добавляет цвет, а во втором прослушивателе событий он удаляет его.Теперь, если мы продолжим отправку, он всегда будет отменен, когда число слушателей будет четным.Если номер слушателя нечетный, он будет вести себя так, как и должен.

это то, что я бы сделал (с минимальными изменениями в вашем коде)

// Select color input


// Select size input

// When size is submitted by the user, call makeGrid()

const form = document.querySelector('#sizePicker');

form.addEventListener('submit', formSubmit);
document.querySelector('table').addEventListener('click', eventListener);

function formSubmit() {
  event.preventDefault();

  const width = document.querySelector('#inputWidth').value;
  const height = document.querySelector('#inputHeight').value;

  makeGrid(width, height);


}

function makeGrid(width, height) {


// Select Width , Height and color values

  const table = document.querySelector('#pixelCanvas');

// Create the Canvas
  let grid = '';

  for(let i = 1; i <= width; i++) {
    grid += `<tr>`
    for(let j = 1; j <= height; j++) {
      grid += `<td class='cell'></td>`;
    }
    grid += `</tr>`;
  }

  table.innerHTML = grid;
}
  // Create event listener for the color


function eventListener(e) {
  const color = document.querySelector('#colorPicker').value;
    if(e.target.classList.contains('cell')) {
      const event = e.target;
      console.log('berfore ask', e.target);
      if(event.hasAttribute('style')) {
        console.log('there is style attr to remove', e.target);

        event.removeAttribute('style');

      } else {
        console.log('there is no att so we create it', e.target);

        event.style.backgroundColor = color;
      }
    }
  }

Не только это решитВаша проблема, но это позволило бы изменить цвет из средства выбора цвета даже после выполнения onSubmit.

Причина, по которой это работает, заключается в том, что вы изменяете только содержимое элемента таблицы, а не уничтожаете его.Таким образом, слушатель все еще там, даже если содержание изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...