使用 Javascript 单击方块时,如何更改方块的颜色?
How would I make the color of squares change when they are clicked using Javascript?
我已经使用事件侦听器将其写出来,但它不起作用,即使单击方块也仍然是黑色。我发现了一些拼写错误,但我不确定我使用 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;
}
使用 .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()
returns 0 到 .9 之间的重复数字,从不重复 1。您当前的公式永远不会得到 255。
你应该使用JQuery来做到这一点,它相对容易。把这个 link 放在你的头标签之间:<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
两个基本问题:
- 你的 for 循环有一个硬编码
squares[0]
而它应该是 squares[i]
,所以你多次将处理程序绑定到第一个元素而不是其他元素。
event
对象没有 style
属性。使用 this.style.backgroundColor
- 在处理程序中 this
将引用被单击的元素。或者使用 event.target.style.backgroundColor
.
像这样:
for(var i = 0; i < squares.length; i++) {
squares[i].addEventListener("click", changeColor);
}
function changeColor(event) {
this.style.backgroundColor = randomColor();
}
答案很简单。我的以下代码更改按预期工作。 : 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();
}
我已经使用事件侦听器将其写出来,但它不起作用,即使单击方块也仍然是黑色。我发现了一些拼写错误,但我不确定我使用 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;
}
使用 .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()
returns 0 到 .9 之间的重复数字,从不重复 1。您当前的公式永远不会得到 255。
你应该使用JQuery来做到这一点,它相对容易。把这个 link 放在你的头标签之间:<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
两个基本问题:
- 你的 for 循环有一个硬编码
squares[0]
而它应该是squares[i]
,所以你多次将处理程序绑定到第一个元素而不是其他元素。 event
对象没有style
属性。使用this.style.backgroundColor
- 在处理程序中this
将引用被单击的元素。或者使用event.target.style.backgroundColor
.
像这样:
for(var i = 0; i < squares.length; i++) {
squares[i].addEventListener("click", changeColor);
}
function changeColor(event) {
this.style.backgroundColor = randomColor();
}
答案很简单。我的以下代码更改按预期工作。 : 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();
}