Ok, here a simple code, which changes td class when you click on them:
JavaScript
x
71
71
1
const btn = document.getElementsByTagName("input")[0];
2
btn.addEventListener("click", function(event){
3
4
let cells = document.getElementsByTagName("td");
5
6
for (let i=0; i<cells.length; i++) {
7
cells[i].classList = ""
8
};
9
10
CounterCells();
11
})
12
13
14
15
16
17
const tabl = document.getElementsByTagName("table")[0];
18
tabl.addEventListener("click", function(event){
19
20
if (event.target.classList == ""){
21
event.target.classList.add("green");
22
console.log("Nothing to green");
23
24
} else if (event.target.classList.contains("white")){
25
event.target.classList.replace("white", "green");
26
console.log("White to green");
27
28
} else if (event.target.classList.contains("green")){
29
event.target.classList.replace("green", "red");
30
console.log("Green to red");
31
32
} else if (event.target.classList.contains("red")) {
33
event.target.classList.replace("red", "white");
34
console.log("Red to white");
35
}
36
37
CounterCells();
38
39
})
40
41
42
43
44
45
46
47
function CounterCells() {
48
let cells = document.getElementsByTagName("td");
49
50
let countWhites = 0;
51
let countGreens = 0;
52
let countReds = 0;
53
54
for (let i=0; i<cells.length; i++) {
55
if (cells[i].classList == "") {
56
countWhites++
57
}
58
if (cells[i].classList.contains("white")) {
59
countWhites++
60
}
61
if (cells[i].classList.contains("green")) {
62
countGreens++
63
}
64
if (cells[i].classList.contains("red")) {
65
countReds++
66
}
67
}
68
69
const p = document.getElementById("demo");
70
p.innerHTML = "Whites: "+countWhites+"<br> Greens: "+countGreens+"<br> Reds: "+countReds;
71
}
JavaScript
1
24
24
1
table {
2
border-collapse: collapse;
3
}
4
5
td {
6
border: 1px solid grey;
7
width: 2rem;
8
height: 2rem;
9
text-align: center;
10
cursor: pointer;
11
user-select: none;
12
}
13
14
.green {
15
background-color: green;
16
}
17
18
.red {
19
background-color: red;
20
}
21
22
.white {
23
background-color: white;
24
}
JavaScript
1
24
24
1
<input type="button" value="Reset">
2
3
<br>
4
<br>
5
6
<table>
7
<tr>
8
<td>1</td>
9
<td>2</td>
10
<td>3</td>
11
</tr>
12
<tr>
13
<td>4</td>
14
<td>5</td>
15
<td>6</td>
16
</tr>
17
<tr>
18
<td>7</td>
19
<td>8</td>
20
<td>9</td>
21
</tr>
22
</table>
23
24
<p id="demo"></p>
If you click it — anything works fine, but now try to click on cell number one and drag mouse over cell number three and then release mouse button — class will be assigned to tr not to last td number 3.
Why is that?
https://jsfiddle.net/foxnadir/Ls6p7j1z/3/
Advertisement
Answer
The problem in your code was that you were attaching the click
event to the table element, when only one td can be clicked at a time.
I also changed the event from click
to mousedown
so that when the user drags from 1 to 3, 1 changes color, but if this behavior is not what you wanted, you can change it back.
Here is the working code:
JavaScript
1
63
63
1
const btn = document.getElementsByTagName("input")[0];
2
btn.addEventListener("click", function(event) {
3
4
let cells = document.getElementsByTagName("td");
5
6
for (let i = 0; i < cells.length; i++) {
7
cells[i].classList = ""
8
};
9
10
CounterCells();
11
})
12
13
let cells = document.getElementsByTagName("td");
14
15
for (i = 0; i < cells.length; i++) {
16
cells[i].addEventListener("mousedown", function(event) {
17
18
if (event.target.classList == "") {
19
event.target.classList.add("green");
20
console.log("Nothing to green");
21
22
} else if (event.target.classList.contains("white")) {
23
event.target.classList.replace("white", "green");
24
console.log("White to green");
25
26
} else if (event.target.classList.contains("green")) {
27
event.target.classList.replace("green", "red");
28
console.log("Green to red");
29
30
} else if (event.target.classList.contains("red")) {
31
event.target.classList.replace("red", "white");
32
console.log("Red to white");
33
}
34
35
CounterCells();
36
37
})
38
}
39
40
function CounterCells() {
41
42
let countWhites = 0;
43
let countGreens = 0;
44
let countReds = 0;
45
46
for (let i = 0; i < cells.length; i++) {
47
if (cells[i].classList == "") {
48
countWhites++
49
}
50
if (cells[i].classList.contains("white")) {
51
countWhites++
52
}
53
if (cells[i].classList.contains("green")) {
54
countGreens++
55
}
56
if (cells[i].classList.contains("red")) {
57
countReds++
58
}
59
}
60
61
const p = document.getElementById("demo");
62
p.innerHTML = "Whites: " + countWhites + "<br> Greens: " + countGreens + "<br> Reds: " + countReds;
63
}
JavaScript
1
42
42
1
table {
2
border-collapse: collapse;
3
}
4
5
td {
6
border: 1px solid grey;
7
width: 2rem;
8
height: 2rem;
9
text-align: center;
10
cursor: pointer;
11
user-select: none;
12
}
13
14
tr {
15
-webkit-touch-callout: none;
16
-webkit-user-select: none;
17
-khtml-user-select: none;
18
-moz-user-select: none;
19
-ms-user-select: none;
20
user-select: none;
21
}
22
23
td {
24
-webkit-touch-callout: none;
25
-webkit-user-select: none;
26
-khtml-user-select: none;
27
-moz-user-select: none;
28
-ms-user-select: none;
29
user-select: none;
30
}
31
32
.green {
33
background-color: green;
34
}
35
36
.red {
37
background-color: red;
38
}
39
40
.white {
41
background-color: white;
42
}
JavaScript
1
24
24
1
<input type="button" value="Reset">
2
3
<br>
4
<br>
5
6
<table>
7
<tr>
8
<td>1</td>
9
<td>2</td>
10
<td>3</td>
11
</tr>
12
<tr>
13
<td>4</td>
14
<td>5</td>
15
<td>6</td>
16
</tr>
17
<tr>
18
<td>7</td>
19
<td>8</td>
20
<td>9</td>
21
</tr>
22
</table>
23
24
<p id="demo"></p>