为什么使用以下代码会出现未捕获的类型错误?
Why am I getting an uncaught type error with the following code?
此代码的目的是让 3 divs 在单击时改变颜色,当左侧 divs 中的两种颜色组成用户收到的右侧颜色时控制台或 DOM 上的正面消息。我以为我已经完全弄明白了,但现在每当我单击 div 时,我都会收到一个未捕获的类型错误,显示 Uncaught TypeError: Cannot read property 'backgroundColor' of undefined
in Chrome.
var squares1 = document.getElementsByClassName('square1');
var squares2 = document.getElementsByClassName('square2');
var squares3 = document.getElementsByClassName('square3');
//change squares1 to either red,green, or blue
for(var i = 0; i < squares1.length; i++) {
squares1[i].addEventListener("click", changeColor);
}
//change squares2 to either red, green, or blue
for(var i = 0; i < squares2.length; i++) {
squares2[i].addEventListener("click", changeColor);
}
//changes squares3 to either red, green, blue, magenta, cyan, etc
for(var i = 0; i < squares3.length; i++) {
squares3[i].addEventListener("click", changeColors);
}
function changeColor(event){
if(event.target.style.backgroundColor == 'rgb(255, 0, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 0, 255)';
checkColors();
}
else
{
event.target.style.backgroundColor = 'rgb(255, 0, 0)';
checkColors();
}
}
function changeColors(event){
if(event.target.style.backgroundColor == 'rgb(255, 0, 0)')
{
event.target.style.backgroundColor = 'rgb(255, 0, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 0, 255)')
{
event.target.style.backgroundColor = 'rgb(255, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 0, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 0, 255)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 255, 255)')
{
event.target.style.backgroundColor = 'rgb(255, 0, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 0, 255)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(255, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 255)';
checkColors();
}
else
{
event.target.style.backgroundColor = 'rgb(255, 0, 0)';
checkColors();
}
}
function checkColors(){
if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else{youMissed;}
}
function gotIt(){
console.log("You got it!")
}
function youMissed(){
console.log("Try Again!")
}
您正在使用 getElementsByClassName
获取与您的 class 名称匹配的元素数组。
绑定事件时,您正确使用该数组的 [0]
索引来获取其中的第一项:
squares1[i].addEventListener("click", changeColor);
然而,在 checkColors()
函数中你试图获取整个数组的 backgroundColor
:
squares1.style.backgroundColor
数组没有背景颜色,使用 squares1[0]
就像您在事件侦听器中所做的那样获取第一个元素的属性。
因为这段代码:
function checkColors(){
if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else{youMissed;}
}
检查 squares1
等。就好像它是单个元素,而实际上它是一个 nodeList(所以你需要检查每个 squares1[i]
等等)。可能同样的问题可能在代码的其他地方,没有检查所有。
通过 class 名称获取元素 returns 元素数组。您需要指定是哪一个。尝试 squares1[0] 等
此代码的目的是让 3 divs 在单击时改变颜色,当左侧 divs 中的两种颜色组成用户收到的右侧颜色时控制台或 DOM 上的正面消息。我以为我已经完全弄明白了,但现在每当我单击 div 时,我都会收到一个未捕获的类型错误,显示 Uncaught TypeError: Cannot read property 'backgroundColor' of undefined
in Chrome.
var squares1 = document.getElementsByClassName('square1');
var squares2 = document.getElementsByClassName('square2');
var squares3 = document.getElementsByClassName('square3');
//change squares1 to either red,green, or blue
for(var i = 0; i < squares1.length; i++) {
squares1[i].addEventListener("click", changeColor);
}
//change squares2 to either red, green, or blue
for(var i = 0; i < squares2.length; i++) {
squares2[i].addEventListener("click", changeColor);
}
//changes squares3 to either red, green, blue, magenta, cyan, etc
for(var i = 0; i < squares3.length; i++) {
squares3[i].addEventListener("click", changeColors);
}
function changeColor(event){
if(event.target.style.backgroundColor == 'rgb(255, 0, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 0, 255)';
checkColors();
}
else
{
event.target.style.backgroundColor = 'rgb(255, 0, 0)';
checkColors();
}
}
function changeColors(event){
if(event.target.style.backgroundColor == 'rgb(255, 0, 0)')
{
event.target.style.backgroundColor = 'rgb(255, 0, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 0, 255)')
{
event.target.style.backgroundColor = 'rgb(255, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 0, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 0, 255)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 255, 255)')
{
event.target.style.backgroundColor = 'rgb(255, 0, 255)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 0, 255)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(0, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(255, 255, 0)';
checkColors();
}
else if (event.target.style.backgroundColor == 'rgb(255, 255, 0)')
{
event.target.style.backgroundColor = 'rgb(0, 255, 255)';
checkColors();
}
else
{
event.target.style.backgroundColor = 'rgb(255, 0, 0)';
checkColors();
}
}
function checkColors(){
if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else{youMissed;}
}
function gotIt(){
console.log("You got it!")
}
function youMissed(){
console.log("Try Again!")
}
您正在使用 getElementsByClassName
获取与您的 class 名称匹配的元素数组。
绑定事件时,您正确使用该数组的 [0]
索引来获取其中的第一项:
squares1[i].addEventListener("click", changeColor);
然而,在 checkColors()
函数中你试图获取整个数组的 backgroundColor
:
squares1.style.backgroundColor
数组没有背景颜色,使用 squares1[0]
就像您在事件侦听器中所做的那样获取第一个元素的属性。
因为这段代码:
function checkColors(){
if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(255, 0, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 0, 255)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 0, 255)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 255, 0)'){
squares3.style.backgroundColor='rgb(0, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(255, 0, 0)'){
squares3.style.backgroundColor='rgb(255, 255, 0)';
gotIt;
}
else if (squares1.style.backgroundColor=='rgb(0, 255, 0)' && squares2.style.backgroundColor=='rgb(0, 0, 255)'){
squares3.style.backgroundColor='rgb(0, 255, 255)';
gotIt;
}
else{youMissed;}
}
检查 squares1
等。就好像它是单个元素,而实际上它是一个 nodeList(所以你需要检查每个 squares1[i]
等等)。可能同样的问题可能在代码的其他地方,没有检查所有。
通过 class 名称获取元素 returns 元素数组。您需要指定是哪一个。尝试 squares1[0] 等