1

I am currently trying to implement a paint feature in my pixel art program but the issue I am having is when I add an eventListener to the element I want to paint nothing happens. I checked tests in the console and changed the elements color in CSS and it successfully changed color. I show my code issue lower down the page of the JavaScript Code:

JavaScript

document.addEventListener('submit', function(event) {
  const height = document.querySelector('#inputHeight').value;
  const width = document.querySelector('#inputWidth').value;

  // cause the 'submit' to not reset page
  event.preventDefault();

  // When size is submitted by the user, call makeGrid()
  makeGrid(height, width);
});

function makeGrid(wid, hi) {

  // Clear the canvas after every 'submit' event
  let pixelNode = document.querySelector('#pixelCanvas');
  while (pixelNode.firstChild) {
    pixelNode.removeChild(pixelNode.firstChild);
  }

  // Select size input
  let shelfWidth = "";
  for (let i = 0; i < wid; i++) {
    shelfWidth += '<td></td>';
  }

  let row = document.querySelector('#pixelCanvas');
  const HTMLToAdd = '<tr>' + shelfWidth + '</tr>';
  for (let j = 0; j < hi; j++) {
    row.insertAdjacentHTML('afterbegin', HTMLToAdd);
  }
}

Here is my issue I see nothing wrong with my code and I dont know why this wouldn't assign each element with the color the user chooses. The variable 'color' is a string that I am concatenating to the rest of the CSSText.

// Select color input
document.querySelector('td').addEventListener('click', function() {  
   // collect color value from picker to pass into paint funtion
  const color = document.querySelector('#colorPicker').value;  
  document.querySelector('td').style.CSSText = ('background-color: ' + color);
});

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>Lab: Pixel Art Maker</h1>

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

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

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

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

</html>
1
  • Try changing .CSSText to .cssText - JavaScript is case sensitive Commented May 13, 2018 at 8:06

1 Answer 1

4

There were several issues, but the most relevant thing was that the table-cells (td) were empty and therefore could not be clicked respectively be painted.

document.addEventListener('submit', function(event) {
  // cause the 'submit' to not reset page
  event.preventDefault();
  handleSubmitEvent();
});

function handleSubmitEvent(){
  const height = document.querySelector('#inputHeight').value;
  const width = document.querySelector('#inputWidth').value;
  
  // When size is submitted by the user, call makeGrid()
  makeGrid(height, width);
}

function makeGrid(wid, hi) {

  // Clear the canvas after every 'submit' event
  let pixelNode = document.querySelector('#pixelCanvas');
  while (pixelNode.firstChild) {
    pixelNode.removeChild(pixelNode.firstChild);
  }

  // Select size input
  let shelfWidth = "";
  for (let i = 0; i < wid; i++) {
    shelfWidth += '<td>cell</td>';
  }

  let row = document.querySelector('#pixelCanvas');
  const HTMLToAdd = '<tr>' + shelfWidth + '</tr>';
  for (let j = 0; j < hi; j++) {
    row.insertAdjacentHTML('afterbegin', HTMLToAdd);
  }
  
  // assign a click handler to the whole table and check whether a cell was clicked
  row.addEventListener('click', function(event) {  
     // collect color value from picker to pass into paint funtion
    var cell = event.target;
    if(cell.tagName.toLowerCase()=="td"){
      const color = document.querySelector('#colorPicker').value;  
      event.target.style['background-color'] = color;
    }
  });
  
}

// draws 4x4 grid at the beginning so that you to not have to write td hardcoded
handleSubmitEvent();
<!DOCTYPE html>
<html>

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

<body>
    <h1>Lab: Pixel Art Maker</h1>

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

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

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

</body>

Hope this helps you.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.