使用JavaScript DOM更改特定元素的颜色?

时间:2018-05-13 07:56:10

标签: javascript html css

我目前正在尝试在我的像素艺术程序中实现一个绘画功能,但我遇到的问题是当我将一个eventListener添加到我要绘制的元素时,没有任何反应。我在控制台中检查了测试并更改了CSS中的元素颜色并成功更改了颜色。我在JavaScript代码的页面下方显示了我的代码问题:

的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);
  }
}
  

这是我的问题我发现我的代码没有任何问题,我不知道为什么这不会为每个元素分配用户选择的颜色。变量&#39;颜色&#39;是一个字符串,我将其连接到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 个答案:

答案 0 :(得分:4)

有几个问题,但最相关的是表格单元格(td)是空的,因此无法点击分别进行绘制。

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>

希望这会对你有所帮助。