开发者问题收集

Javascript 如何在单击按钮时改变其颜色?

2020-05-27
132

我是 Javascript 新手。我想创建一个 15x15 的表格,里面全是按钮,单击每个按钮时将按钮的颜色更改为红色。表格没问题,但颜色不起作用。

function createTable(){
    var table = document.createElement('table');
    for(var x = 0; x < 15; x++) {
        var row = table.insertRow();
        for(var y = 0; y < 15; y++) {
            var cell = row.insertCell();
            var button = cell.appendChild(document.createElement('button'));
            var buttID = String('butt' + '_' + x + '_' + y);
            button.setAttribute('id', 'buttID');
            button.setAttribute('onclick', 'mark()');
        }
    }
    document.getElementById('puzzle').appendChild(table);
}

function mark(){
    document.getElementById('buttID').style.color = "red";
}

我不确定 button.setAttribute 是否错误。我也尝试了以下方法,但这次整个表格都消失了。对此有什么想法吗?

button.onclick = mark();

也许我为每个单元格创建 id 的方式是错误的?我不确定。

2个回答

此行是错误的,不会起作用:

document.getElementById('buttID').style.color = "red";

这是试图访问 id 等于字符串“buttID”的按钮,但不存在这样的按钮。

但您根本不需要按钮上的 id。相反,您可以像这样设置按钮的 onclick 函数:

button.onclick = mark;

然后,像这样定义您的 mark 函数:

function mark() {
  let button = this; // 'this' is the button that was clicked
  button.style.color = 'red';
}
function createTable() {
  var table = document.createElement('table');
  for (var x = 0; x < 15; x++) {
    var row = table.insertRow();
    for (var y = 0; y < 15; y++) {
      var cell = row.insertCell();
      var button = cell.appendChild(document.createElement('button'));
      button.className = 'btn';
      button.onclick = mark;
    }
  }
  puzzle.innerHTML = '';
  puzzle.appendChild(table);
}

function mark() {
  let button = this;
  button.style.backgroundColor = "red";
}

const puzzle = document.getElementById('puzzle');
.btn {
  border: none;
  margin: 0;
  width: 1em;
  height: 1em;
  background-color: white;
}
body {
  background-color: #eee;
}
<button onclick="createTable();">Create Table</button>
<div id="puzzle"></div>
terrymorse
2020-05-27

将此:

var cell = row.insertCell();
var button = cell.appendChild(document.createElement('button'));
var buttID = String('butt' + '_' + x + '_' + y);
button.setAttribute('id', 'buttID');
button.setAttribute('onclick', 'mark()');

更改为:

var cell = row.insertCell();
// Store the reference to the actual button and not the cell that contains it
var button = document.createElement('button');
// Bind the onclick event of the button to your mark function
// Also remember that you only need the parenthesis if you are calling a function, here we are only passing it
button.onclick = mark;
// Add your button to your table cell
cell.appendChild(button);

您还必须编辑标记函数,使其看起来像这样:

function mark(e){
    e.target.style.background = 'red';
}

这可能看起来令人困惑,您可能会问变量“e”来自哪里。基本上,像“onclick”这样的事件总是会将事件对象传递给它们的处理函数。通过将变量放在处理函数括号中,事件对象将自动放入该变量中。

事件对象包含大量有关事件的信息。您可以在 此处 看到它提供的所有信息。 我们想要的是“目标” - 触发事件的元素,在本例中将是被点击的任何按钮。 目标是一个 HTML 元素,因此我们可以将其 style.background 设置为“red”的值。

The One True Colter
2020-05-27