У меня есть 2 квадрата в <table>, и я хочу, чтобы при нажатии на один он становился черным, а другой - нет.
Мой текущий код работает, но я дал им ту же функцию и id, поэтому, когда я нажимаю первый, он работает хорошо, но когда я нажимаю второй, изменяется первый.
Я знаю, что не так, но не знаю, как исправить это, не создавая функцию для каждого id.
Скажем, мне нужно 100 квадратов, я не буду писать по одной функции для каждого, что мне делать?
function myFunc() {
var element = document.getElementById("cc");
element.classList.toggle("th");
}table,
th,
td {
border: solid black 1px;
width: 100px;
height: 100px;
}
.th {
background-color: black;
}<table>
<tr>
<th onclick = "myFunc(this)" id = "cc"></th>
<th onclick = "myFunc(this)" id = "cc"></th>
</tr>
</table>Вероятно, вам нужно передать ссылку на объект, по которому щелкают - onclick = "myFunc(this)"
добавление "этого" ничего не меняет: / не могли бы вы дать подробности, пожалуйста
@SamuelFyckes Ну, просто добавление this мало что даст. Что вы сделали с this унция, которую передали в вашу функцию?
У вас есть два элемента с одинаковым идентификатором cc. JavaScript ожидает, что идентификаторы будут уникальными, поэтому document.getElementById('cc') выберет первый из них всегда.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша функция сохраняет первый квадрат в переменной с идентификатором cc.
Вместо этого вы должны передать ссылку на выбранный элемент и сохранить этот элемент в переменной. Таким образом, нажатый элемент будет переключен.
function myFunc(ref) {
var element = document.getElementById(ref.id).innerHTML;
element.classList.toggle("th");
}
Обратите внимание, что также необходимо добавить this к вызову функции.
Прежде всего, что более важно: id должен быть уникальным, поэтому он называется id (идентификатором).
Сказал, что я покажу вам два варианта решения вашего вопроса:
1. Лучший вариант:
Не добавляйте встроенный (прямо в HTML) слушатель onclick. Добавить
общий класс для всех <th>, затем в Javascript добавьте одного слушателя
к каждому элементу, имеющему класс, и используйте this внутри функции, поскольку область действия this будет элементом, по которому щелкнули мышью.
Пример:
let allTh = document.querySelectorAll(".clickableTh").forEach(x => x.onclick = myFunc)
function myFunc() {
this.classList.toggle("th");
}table, th, td {
border:solid black 1px;
width:100px;
height:100px;
}
.th {
background-color:black;
}<table>
<tr>
<th class = "clickableTh"></th>
<th class = "clickableTh"></th>
<th class = "clickableTh"></th>
<th class = "clickableTh"></th>
<th class = "clickableTh"></th>
<th id = "cc" class = "notClickableTh"></th>
</tr>
</table>2. Сохранение вашей нынешней структуры:
Как сказано в комментариях, вы передаете this в качестве параметра (onclick = "myFunc(this)"), тогда внутри myFunc вам не нужно искать элемент, он у вас уже есть в качестве параметра.
Нажмите ниже, чтобы увидеть фрагмент кода примера
function myFunc(elem) {
elem.classList.toggle("th");
}table, th, td {
border:solid black 1px;
width:100px;
height:100px;
}
.th {
background-color:black;
}<table>
<tr>
<th onclick = "myFunc(this)"></th>
<th onclick = "myFunc(this)"></th>
<th onclick = "myFunc(this)"></th>
<th onclick = "myFunc(this)"></th>
<th onclick = "myFunc(this)"></th>
<th id = "cc"></th>
</tr>
</table>Для уменьшения разметки вы можете привязать событие щелчка ко всем th.
var th = document.getElementsByTagName("th");
for (var i = 0; i < th.length; i++) {
th[i].addEventListener("click", function() {
this.classList.toggle("th");
});
}th,
td {
border: solid black 1px;
width: 100px;
height: 100px;
}
.th {
background-color: black;
}<table>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</table>
Разместите код, который у вас есть, в вопросе