Javascript 通过点击段落随机设置背景色。我的代码给出了一个错误

Javascript 通过点击段落随机设置背景色。我的代码给出了一个错误,javascript,html,events,dom,addeventlistener,Javascript,Html,Events,Dom,Addeventlistener,我正在做一个家庭作业练习,通过点击我的段落来随机地给背景上色。问题是,当我尝试我的代码时,我收到一个未捕获的错误“无法读取未定义的属性'style'。我试图打破我的头脑,但我真的不明白我做错了什么。你能帮我吗 提前谢谢 同样的道理,这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子 这是一个不同时期的交通秩序。这是一个自由的变化。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的生活 卡皮瓦利

我正在做一个家庭作业练习,通过点击我的段落来随机地给背景上色。问题是,当我尝试我的代码时,我收到一个未捕获的错误“无法读取未定义的属性'style'。我试图打破我的头脑,但我真的不明白我做错了什么。你能帮我吗

提前谢谢


同样的道理,这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子

这是一个不同时期的交通秩序。这是一个自由的变化。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的生活

卡皮瓦利斯之家、卡贝萨之家、卡伊尔之家、多米尔之家、科奇拉之家、法泽多之家。有趣的是,博利斯之家、博利斯之家、欧盟之家、康帕迪之家、国际之家、国际之家 (功能(){ “严格使用” var$ps=document.querySelectorAll('p');
对于(var i=0;i,单击侦听器函数中的元素可以通过“this”访问

否则,将不会调用颜色函数,因为您忘记了“()”并在函数中返回结果。 你要写的那篇文章,这就是你要写的吗


同样的道理,这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子

这是一个不同时期的交通秩序。这是一个自由的变化。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的生活

卡皮瓦利斯之家、卡贝萨之家、卡伊尔之家、多米尔之家、科奇拉之家、法泽多之家。有趣的是,博利斯之家、博利斯之家、欧盟之家、康帕迪之家、国际之家、国际之家 (功能(){ “严格使用” var$ps=document.querySelectorAll('p');
对于(var i=0;i这是一个如何在循环中处理
var
的问题-也就是说,每次调用“click”侦听器时,都会再次检查
i
变量-由于循环已经完成,它正好是HTML元素数组的长度。您可以通过更改事件侦听器的内部来检查它到simple
console.log(i)
。它将每次打印3。 如何修复?例如,您可以从传递给函数的事件中获取单击元素的信息:

var $ps = document.querySelectorAll('p');

function changeBackgroundColor(e){
  e.target.style.backgroundColor = colors();
}

for(var i = 0; i<$ps.length;i++){

  $ps[i].addEventListener('click', changeBackgroundColor);
}

function colors(){
  var r = Math.floor((Math.random() * 256));
  var g = Math.floor((Math.random() * 256));
  var b = Math.floor((Math.random() * 256)); 
  return 'rgb'+'('+r+','+g+','+b+')';
}
var$ps=document.querySelectorAll('p');
功能更改背景颜色(e){
e、 target.style.backgroundColor=colors();
}
对于(var i=0;i一些事情:

我不知道为什么要使用函数闭包来执行此操作,但这并不是一个真正的问题

不调用函数创建函数
colors
不会设置内部的
var color
,这意味着您无法使用它,因此我添加了一个返回值,以便在每次调用函数时获得新的颜色

最后一个问题是
$ps[i].style
的问题:因为您使用了
var i
,所以在事件侦听器中使用的
ps$[i]
即使从中调用,也不会相同,请改为更改事件目标的样式


同样的道理,这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子。这是一个很好的例子

这是一个不同时期的交通秩序。这是一个自由的变化。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的交通工具。这是一个非暴力性的生活

卡皮瓦利斯之家、卡贝萨之家、卡伊尔之家、多米尔之家、科奇拉之家、法泽多之家。有趣的是,博利斯之家、博利斯之家、欧盟之家、康帕迪之家、国际之家、国际之家 “严格使用” var$ps=document.querySelectorAll('p');
对于(var i=0;i您在事件侦听器函数中使用了
$ps[i]
。但是
i
的值在循环的每次迭代后都会更新。在循环结束时,
i
的值等于段落总数的值。段落的索引从0开始。因此(段落总数-1)段落。这就是为什么当它试图访问
$ps[i]
时会导致错误

您可以通过在事件侦听器函数中使用
this
关键字而不是
$ps[i]
来解决此问题。此处
this
关键字指示插入事件侦听器的元素

您只是在事件侦听器中使用了
color
for(var i = 0; i<$ps.length;i++){     
    $ps[i].addEventListener('click', function(){
        this.style.backgroundColor = colors();
    });
}


function colors(){
    var r = Math.floor((Math.random() * 256));
    var g = Math.floor((Math.random() * 256));
    var b = Math.floor((Math.random() * 256)); 
    var color = 'rgb'+'('+r+','+g+','+b+')';
    return color;
}  
<!DOCTYPE>
<html>
    <head>
       <meta charset=utf-8/>
    </head>
    <body> 
        <section>
            <p>Mussum Ipsum, cacilds vidis litro abertis. Cevadis im ampola pa arma uma pindureta. Per aumento de cachacis, eu reclamis. Quem manda na minha terra sou euzis! Sapien in monti palavris qui num significa nadis i pareci latim.</p>
            <p>A ordem dos tratores não altera o pão duris. Posuere libero varius. Nullam a nisl ut ante blandit hendrerit. Aenean sit amet nisi. Praesent malesuada urna nisi, quis volutpat erat hendrerit non. Nam vulputate dapibus. Vehicula non. Ut sed ex eros. Vivamus sit amet nibh non tellus tristique interdum.</p>
            <p>Leite de capivaris, leite de mula manquis sem cabeça. Em pé sem cair, deitado sem dormir, sentado sem cochilar e fazendo pose. Interessantiss quisso pudia ce receita de bolis, mais bolis eu num gostis. Não sou faixa preta cumpadi, sou preto inteiris, inteiris.</p>  
        </section>
        <script>
        document.addEventListener('click', ({target}) => {
          if( target.tagName !== 'P' ) return;
          const rand = () => Math.floor(Math.random() * 256);
          target.style.background = "rgb(R,G,B)".replace(/R|G|B/g, rand);
        });
        </script>
    </body>
</html>