当使用Javascript单击时,如何使方块的颜色发生变化?

时间:2015-04-19 03:57:30

标签: javascript html javascript-events event-handling onclicklistener

我使用事件监听器将其写出来但它不起作用,即使点击它们,方块也保持黑色。我找到了一些我修复过的拼写错误,但我不确定使用getElementsByClassName是否正确。

html:

<!DOCTYPE html>
<html>
<head>
<title></title>
<style>
    .square {
        width: 100px;
        height: 100px;
        background-color: #000000;
        margin: 5px;
     }
   </style>
  </head>
 <body>

 <div id="container">
 <div class="square"></div>
 <div class="square"></div>
 <div class="square"></div>
 <div class="square"></div>
 </div>

<script src="js/main.js"></script>
</body>
</html>

和javascript

var squares = document.getElementsByClassName('square');

for(var i = 0; i < squares.length; i++) {
squares[0].addEventListener("click", changeColor);
}

function changeColor(event) {
event.style.backgroundColor = randomColor();
}


function randomColor() {

var randomRed = Math.floor(Math.random() * 255);
var randomGreen = Math.floor(Math.random() * 255);
var randomBlue = Math.floor(Math.random() * 255);
//create the string that is the ‘random color’
var randomColor = "rgb("+randomRed+","+randomGreen+","+randomBlue+")";

return randomColor;
}

4 个答案:

答案 0 :(得分:2)

两个基本问题:

  1. 你的for循环有一个硬编码squares[0],它应该是squares[i],所以你将处理程序多次绑定到第一个元素而不是其他元素。
  2. event对象没有style属性。使用this.style.backgroundColor - 在处理程序this中将引用单击的元素。或者使用event.target.style.backgroundColor
  3. 所以这样:

    for(var i = 0; i < squares.length; i++) {
      squares[i].addEventListener("click", changeColor);
    }
    
    function changeColor(event) {
      this.style.backgroundColor = randomColor();
    }
    

    演示:http://jsfiddle.net/oueLs5dp/

答案 1 :(得分:1)

答案很简单。我的以下代码变更按预期工作。 :http://codepen.io/anon/pen/MwgEdm

首先,您需要修改for循环,而是引用索引0而不是i:

    for(var i = 0; i < squares.length; i++) {
        squares[i].addEventListener("click", changeColor);
    }

其次,您需要在更改颜色函数中引用'this',并为事件对象传入e:

function changeColor(e) {
    this.style.backgroundColor = randomColor();
}

答案 2 :(得分:-1)

使用.addEventListener()您需要更改:

function changeColor(event) {
event.style.backgroundColor = randomColor();
}

function changeColor(){
  // not using Event Object
  this.style.backgroundColor = randomColor();
}

,但让我们面对它.getElementsByClassName()无法向后兼容。

我建议如下:

var doc = document, bod = doc.body;
function E(e){
  return doc.getElementById(e);
}
function inArray(x, a){
  for(var i=0,l=a.length; i<l; i++){
    if(a[i] === x){
      return true;
    }
  }
  return false;
}
function getElementsByClass(className, element){
  var r = false;
  var el = element ? element : doc;
  if(el.getElementsByClassName){
    r = el.getElementsByClassName(className);
  }
  else{
    var all = el.getElementsByTagName('*'), l = all.length;
    if(l > 0){
      r = [];
      for(var i=0; i<l; i++){
        var s = all[i].className.split(/\s/);
        if(inArray(className, s))r.push(all[i]);
      }
  }
  return r;
}
function randomColor(context){
  context.style.backgroundColor = 'rgb('+Math.floor(Math.rand()*256)+','+Math.floor(Math.rand()*256)+','+Math.floor(Math.rand()*256)+')';
}

现在它就像:

var all = getElementsByClass('square');
for(var i=0,l=all.length; i<l; i++){
  (function(i){ // in case you want to add more array stuff
    all[i].onclick = function(){
      randomColor(this);
      // do more stuff here
    }
  })(i); // end of closure
}

注意:Math.random()会返回介于0和.9之间的数字,重复,永远不会为1.您的当前公式永远不会得到255。

答案 3 :(得分:-1)

你应该使用JQuery来做到这一点,它相对容易。将此链接放在您的头标记之间:<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>然后将此代码放入您的javascript:

$(document).ready(function(){
    $('.square').click(function(){
        $('.square').addClass('green');
    });
});

这是demo