【问题标题】:Getting error "Uncaught TypeError: Cannot set property 'color' of undefined" [duplicate]出现错误“未捕获的类型错误:无法设置未定义的属性‘颜色’”[重复]
【发布时间】:2021-01-14 04:11:56
【问题描述】:

每当我单击按钮时,我都会尝试将按钮文本的颜色更改为“白色”。但是单击按钮后,我收到错误“Uncaught TypeError: Cannot set property 'color' of undefined”。我尝试使用 console.log(this) 提取对象,但它没有返回我单击的按钮对象,而是返回“窗口”类型的对象。我不明白为什么我无法访问按钮并选择其中的文本并更改颜色。我正在粘贴我的 html 和 js 代码。请让我知道哪里出错了.

for (var i = 0; i < (document.querySelectorAll('.drum').length); i++) {
  document.querySelectorAll(".drum")[i].addEventListener("click", () => {

    this.style.color = "white";

  });
}
body {
  text-align: center;
  background-color: #283149;
}

h1 {
  font-size: 5rem;
  color: #DBEDF3;
  font-family: "Arvo", cursive;
  text-shadow: 3px 0 #DA0463;
}

footer {
  color: #DBEDF3;
  font-family: sans-serif;
}

.w {
  background-image: url(./images/tom1.png);
}

.a {
  background-image: url(./images/tom2.png);
}

.s {
  background-image: url(./images/tom3.png);
}

.d {
  background-image: url(./images/tom4.png);
}

.j {
  background-image: url(./images/snare.png);
}

.k {
  background-image: url(./images/crash.png);
}

.l {
  background-image: url(./images/kick.png);
}

.set {
  margin: 10% auto;
}

.game-over {
  background-color: red;
  opacity: 0.8;
}

.pressed {
  box-shadow: 0 3px 4px 0 #DBEDF3;
  opacity: 0.5;
}

.red {
  color: red;
}

.drum {
  outline: none;
  border: 10px solid #404B69;
  font-size: 5rem;
  font-family: 'Arvo', cursive;
  line-height: 2;
  font-weight: 900;
  color: #DA0463;
  text-shadow: 3px 0 #DBEDF3;
  border-radius: 15px;
  display: inline-block;
  width: 150px;
  height: 150px;
  text-align: center;
  margin: 10px;
  background-color: white;
}
<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title>Drum Kit</title>
  <link rel="stylesheet" href="styles.css">
  <link href="https://fonts.googleapis.com/css?family=Arvo" rel="stylesheet">
</head>

<body>

  <h1 id="title">Drum ???? Kit</h1>
  <div class="set">
    <button class="w drum">w</button>
    <button class="a drum">a</button>
    <button class="s drum">s</button>
    <button class="d drum">d</button>
    <button class="j drum">j</button>
    <button class="k drum">k</button>
    <button class="l drum">l</button>
  </div>


  <script src="index.js"></script>

</body>

</html>

【问题讨论】:

  • 没有显示尝试设置color 属性的代码,因此该代码不是一个好的minimal reproducible example。请显示在运行时重现您所询问的错误的代码。请注意,最好将对 document.querySelectorAll(".drum") 的响应缓存在一个变量中,然后对其进行迭代。
  • @HereticMonkey 尝试运行 sn-p ..它可以工作,问题将被重现
  • 我运行了 sn-p 并没有看到错误“Uncaught TypeError: Cannot set property 'color' of undefined”。
  • @HereticMonkey 哦,是的!我看到我没有保存我所做的更改,所以它只是显示未定义..请现在看它显示错误!
  • .color.style 应该是.style.color

标签: javascript html css


【解决方案1】:

你得到undefined的原因是因为你使用了箭头函数,而this指的是window。解决方案是使用event.target 代替this

您可以使用匿名函数代替箭头函数,并在其中使用this

var all = document.querySelectorAll(".drum");

for (var i = 0; i < all.length; i++) {
  all[i].addEventListener("click", (event) => {
    console.log(event.target.innerHTML);
    event.target.style.color = "#fff";
  });
}
body {
  text-align: center;
  background-color: #283149;
}

h1 {
  font-size: 5rem;
  color: #DBEDF3;
  font-family: "Arvo", cursive;
  text-shadow: 3px 0 #DA0463;
}

footer {
  color: #DBEDF3;
  font-family: sans-serif;
}

.w {
  background-image: url(./images/tom1.png);
}

.a {
  background-image: url(./images/tom2.png);
}

.s {
  background-image: url(./images/tom3.png);
}

.d {
  background-image: url(./images/tom4.png);
}

.j {
  background-image: url(./images/snare.png);
}

.k {
  background-image: url(./images/crash.png);
}

.l {
  background-image: url(./images/kick.png);
}

.set {
  margin: 10% auto;
}

.game-over {
  background-color: red;
  opacity: 0.8;
}

.pressed {
  box-shadow: 0 3px 4px 0 #DBEDF3;
  opacity: 0.5;
}

.red {
  color: red;
}

.drum {
  outline: none;
  border: 10px solid #404B69;
  font-size: 5rem;
  font-family: 'Arvo', cursive;
  line-height: 2;
  font-weight: 900;
  color: #DA0463;
  text-shadow: 3px 0 #DBEDF3;
  border-radius: 15px;
  display: inline-block;
  width: 150px;
  height: 150px;
  text-align: center;
  margin: 10px;
  background-color: white;
}
<link href="https://fonts.googleapis.com/css?family=Arvo" rel="stylesheet">

<h1 id="title">Drum ? Kit</h1>
<div class="set">
  <button class="w drum">w</button>
  <button class="a drum">a</button>
  <button class="s drum">s</button>
  <button class="d drum">d</button>
  <button class="j drum">j</button>
  <button class="k drum">k</button>
  <button class="l drum">l</button>
</div>

【讨论】:

  • 请至少添加几行解释。仅代码的答案并不是很有用。
  • @johannchopin 我正在编辑答案以进行解释。
  • 现在更好的是我删除了downvote ;) 请在下次发布之前先完成一点你的答案:)
  • 会记住这一点 :)
【解决方案2】:

这是因为您使用了不绑定this 的箭头函数,请参阅w3c

对于箭头函数,this 关键字始终表示定义箭头函数的对象。

如果要绑定this,只需使用常用的function() {}

for (var i = 0; i < (document.querySelectorAll('.drum').length); i++) {
  document.querySelectorAll(".drum")[i].addEventListener("click", function() {

    console.log(this.innerHTML);

  });
}
body {
  text-align: center;
  background-color: #283149;
}

h1 {
  font-size: 5rem;
  color: #DBEDF3;
  font-family: "Arvo", cursive;
  text-shadow: 3px 0 #DA0463;
}

footer {
  color: #DBEDF3;
  font-family: sans-serif;
}

.w {
  background-image: url(./images/tom1.png);
}

.a {
  background-image: url(./images/tom2.png);
}

.s {
  background-image: url(./images/tom3.png);
}

.d {
  background-image: url(./images/tom4.png);
}

.j {
  background-image: url(./images/snare.png);
}

.k {
  background-image: url(./images/crash.png);
}

.l {
  background-image: url(./images/kick.png);
}

.set {
  margin: 10% auto;
}

.game-over {
  background-color: red;
  opacity: 0.8;
}

.pressed {
  box-shadow: 0 3px 4px 0 #DBEDF3;
  opacity: 0.5;
}

.red {
  color: red;
}

.drum {
  outline: none;
  border: 10px solid #404B69;
  font-size: 5rem;
  font-family: 'Arvo', cursive;
  line-height: 2;
  font-weight: 900;
  color: #DA0463;
  text-shadow: 3px 0 #DBEDF3;
  border-radius: 15px;
  display: inline-block;
  width: 150px;
  height: 150px;
  text-align: center;
  margin: 10px;
  background-color: white;
}
<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title>Drum Kit</title>
  <link rel="stylesheet" href="styles.css">
  <link href="https://fonts.googleapis.com/css?family=Arvo" rel="stylesheet">
</head>

<body>

  <h1 id="title">Drum ? Kit</h1>
  <div class="set">
    <button class="w drum">w</button>
    <button class="a drum">a</button>
    <button class="s drum">s</button>
    <button class="d drum">d</button>
    <button class="j drum">j</button>
    <button class="k drum">k</button>
    <button class="l drum">l</button>
  </div>


  <script src="index.js"></script>

</body>

</html>

【讨论】:

  • 这是一个常见错误;之前已经回答过很多次的...
  • 谢谢,请记住这一点!!
猜你喜欢
  • 2019-01-05
  • 2015-07-25
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2017-10-01
相关资源
最近更新 更多