Как повторно использовать JS-функцию в разных HTML-элементах

У меня есть 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>

Разместите код, который у вас есть, в вопросе

Ason 16.03.2018 20:39

Вероятно, вам нужно передать ссылку на объект, по которому щелкают - onclick = "myFunc(this)"

zgood 16.03.2018 20:41

добавление "этого" ничего не меняет: / не могли бы вы дать подробности, пожалуйста

Samuel Fyckes 16.03.2018 20:47

@SamuelFyckes Ну, просто добавление this мало что даст. Что вы сделали с this унция, которую передали в вашу функцию?

zgood 16.03.2018 20:53

У вас есть два элемента с одинаковым идентификатором cc. JavaScript ожидает, что идентификаторы будут уникальными, поэтому document.getElementById('cc') выберет первый из них всегда.

Blazemonger 16.03.2018 20:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
139
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваша функция сохраняет первый квадрат в переменной с идентификатором 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>

Другие вопросы по теме