Reputation: 19
I'm trying to make a memory game, and I have board as a multidimensional array holding picture sources. I want it so that on the div click, the photo is added. The code below does not work.
I've tried testing out to see if anything happens when the div is clicked with a console.log, but nothing comes up. The function is never run. However, running the function in the console makes it work.
function click(n, n1) {
console.log("S")
if(current == "") {
console.log(board);
console.log(board[n][n1]);
current = board[n][n1].toString();
var cols = document.getElementsByClassName('column');
for(var i = 0; i < cols.length; i++) {
if(cols[i].id == n.toString() + n1.toString()) {
console.log('yss')
cols[i].style.backgroundColor = "white";
currentImg = document.createElement("img");
currentImg.style.width = "50%";
currentImg.style.height = "auto";
currentImg.style.display = "block";
currentImg.style.margin = "0 auto";
currentImg.style.verticalAlign = "middle";
currentImg.src = board[n][n1];
cols[i].appendChild(currentImg);
}
}
}
}
<div class="row">
<div class="column" onclick="click(0,0);" id="00"></div>
<div class="column" onclick="click(0,1);" id="01"></div>
<div class="column" onclick="click(0,2);" id="02"></div>
<div class="column" onclick="click(0,3);" id="03"></div>
</div>
<div class="row">
<div class="column" onclick="click(1,0)" id="10"></div>
<div class="column" onclick="click(1,1);" id="11"></div>
<div class="column" onclick="click(1,2);" id="12"></div>
<div class="column" onclick="click(1,3);" id="13"></div>
</div>
<div class="row">
<div class="column" onclick="click(2,0);" id="20"></div>
<div class="column" onclick="click(2,1);" id="21"></div>
<div class="column" onclick="click(2,2);" id="22"></div>
<div class="column" onclick="click(2,3);" id="23"></div>
</div>
<div class="row">
<div class="column" onclick="click(3,0);" id="30"></div>
<div class="column" onclick="click(3,1);" id="31"></div>
<div class="column" onclick="click(3,2);" id="32"></div>
<div class="column" onclick="click(3,3);" id="33"></div>
</div>
Upvotes: 0
Views: 43
Reputation: 65873
Your function name, click
is conflicting with the event name click
. Changing the function name solves the problem.
function clicked(n, n1) {
console.log("S")
if(current == "") {
console.log(board);
console.log(board[n][n1]);
current = board[n][n1].toString();
var cols = document.getElementsByClassName('column');
for(var i = 0; i < cols.length; i++) {
if(cols[i].id == n.toString() + n1.toString()) {
console.log('yss')
cols[i].style.backgroundColor = "white";
currentImg = document.createElement("img");
currentImg.style.width = "50%";
currentImg.style.height = "auto";
currentImg.style.display = "block";
currentImg.style.margin = "0 auto";
currentImg.style.verticalAlign = "middle";
currentImg.src = board[n][n1];
cols[i].appendChild(currentImg);
}
}
}
}
.column { width:20px; height:20px; border:1px solid grey; display:inline-block; }
<div class="row">
<div class="column" onclick="clicked(0,0);" id="00"></div>
<div class="column" onclick="clicked(0,1);" id="01"></div>
<div class="column" onclick="clicked(0,2);" id="02"></div>
<div class="column" onclick="clicked(0,3);" id="03"></div>
</div>
<div class="row">
<div class="column" onclick="clicked(1,0)" id="10"></div>
<div class="column" onclick="clicked(1,1);" id="11"></div>
<div class="column" onclick="clicked(1,2);" id="12"></div>
<div class="column" onclick="clicked(1,3);" id="13"></div>
</div>
<div class="row">
<div class="column" onclick="clicked(2,0);" id="20"></div>
<div class="column" onclick="clicked(2,1);" id="21"></div>
<div class="column" onclick="clicked(2,2);" id="22"></div>
<div class="column" onclick="clicked(2,3);" id="23"></div>
</div>
<div class="row">
<div class="column" onclick="clicked(3,0);" id="30"></div>
<div class="column" onclick="clicked(3,1);" id="31"></div>
<div class="column" onclick="clicked(3,2);" id="32"></div>
<div class="column" onclick="clicked(3,3);" id="33"></div>
</div>
Having that out of the way, don't use inline HTML event attributes such as onclick
in the first place. This is a 25+ year old technique that was used before we had modern standards and best practices and there are many good reasons not to use this syntax anymore. In fact, we can simplify your code quite a bit by setting up just one click
event handler on a container of all these elements and leverage event bubbling to handle all the clicks there. Additionally, we can get rid of all the id
attributes (which make for a brittle solution) and use data-*
attributes so that each element can store its position in the matrix.
Note how much cleaner the HTML is now:
document.querySelector(".wrapper").addEventListener("click", function(event){
// Check to see if the event originated at an element with a class of "column"
if(event.target.classList.contains("column")){
let cell = event.target.dataset.id; // Get the data-id value of the clicked element
console.log(cell);
}
});
.column { width:20px; height:20px; border:1px solid grey; display:inline-block; }
<div class="wrapper">
<div class="row">
<div class="column" data-id="0,0"></div>
<div class="column" data-id="0,1"></div>
<div class="column" data-id="0,2"></div>
<div class="column" data-id="0,3"></div>
</div>
<div class="row">
<div class="column" data-id="1,0"></div>
<div class="column" data-id="1,1"></div>
<div class="column" data-id="1,2"></div>
<div class="column" data-id="1,3"></div>
</div>
<div class="row">
<div class="column" data-id="2,0"></div>
<div class="column" data-id="2,1"></div>
<div class="column" data-id="2,2"></div>
<div class="column" data-id="2,3"></div>
</div>
<div class="row">
<div class="column" data-id="3,0"></div>
<div class="column" data-id="3,1"></div>
<div class="column" data-id="3,2"></div>
<div class="column" data-id="3,3"></div>
</div>
</div>
Upvotes: 3