Изменить фон элемента при нажатии на другой элемент

Я пытаюсь написать код на HTML-странице, на которой есть таблица значений. Я хочу, чтобы щелчок по любой строке таблицы менял цвет фона другого элемента, по сути, просто поля, чтобы выделить его среди других полей. Я относительно новичок в JS, HTML, CSS, поэтому еще не совсем освоил их.

Хорошо, я получил щелчок по строке, чтобы изменить цвет поля, но с парой проблем. Работает только первая строка таблицы, и она не возвращается к исходной после того, как я ее «откликаю».

Кто-нибудь может помочь? Заранее спасибо.

код, который у меня есть на данный момент, таков:

<style> 
  #row{
    position:relative;
  }
  
  #sensor{
  width:30px;
  height:22px;
  margin: 0 0 -15px 0;
  background-size:100%;
  background: white;  
  background-repeat:no-repeat;
  overflow:hidden;

    border: 1px solid black;
  position:absolute;
  left: 70px; top: 100px;
  z-index: 1;
  }  
  #sensor.clicked {background: greenyellow}
</style> 
<div>
    <table> 
        <tbody>
            <tr id = "row">
                <td> various table rows </td>
            </tr>
        </tbody>
    </table>
</div> 
 $('#row').on('click', function () {
     $("#sensor").addClass('clicked');

  });
<div>
                  
 <div id = "sensor">CON</div>
                  
</div>  

Где находится элемент с идентификатором sensor? (И если вы хотите, чтобы он переключался, а не просто добавлялся, вам понадобится: api.jquery.com/toggleclass )

DBS 26.09.2023 16:03

«Работает только первая строка таблицы», у вас есть несколько строк с одинаковым идентификатором? Идентификаторы должны быть уникальными в HTML. Используйте классы, если вам нужно повторно использовать селектор.

DBS 26.09.2023 16:05

Я только что обновил его, идентификатор датчика — это просто поле, в котором я хочу изменить фон.

springsissor 26.09.2023 16:25
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы учитесь программировать и манипулировать DOM, постарайтесь не полагаться на jQuery. Вот схема решения на чистом JavaScript, которое будет работать во всех современных веб-браузерах.

Метод document.getElementById получает ссылку на элемент таблицы HTML, используя его уникальный идентификатор.

Метод addEventListener используется для присоединения функции-обработчика для обработки click событий в таблице.

В функции-обработчике есть защита, проверяющая, имеет ли щелчок элемента класс sensor, прежде чем переключать класс clicked на элементе.

const tableHandle = document.getElementById("table-id");

tableHandle.addEventListener("click", function(event){
  if (event.target.classList.contains("sensor")) { 
    event.target.classList.toggle("clicked");
  }
});
.row {
  position: relative;
}
  
.sensor {
  width: 30px;
  height: 22px;
  margin: 0 0 -15px 0;
  background-size: 100%;
  background-color: blue; 
  background-repeat: no-repeat;
  overflow: hidden;
  border: 1px solid black;
  left: 70px;
  top: 100px;
  z-index: 1;
}

.sensor.clicked {
  background: greenyellow;
}
<div>
  <table id = "table-id"> 
    <tbody>
      <tr class = "row">
        <td class = "sensor"> various table rows </td>
        <td class = "sensor"> various table rows </td>
        <td class = "sensor"> various table rows </td>
      </tr>
      <tr class = "row">
        <td class = "sensor"> various table rows </td>
        <td class = "sensor"> various table rows </td>
        <td class = "sensor"> various table rows </td>
      </tr>
      <tr class = "row">
        <td class = "sensor"> various table rows </td>
        <td class = "sensor"> various table rows </td>
        <td class = "sensor"> various table rows </td>
      </tr>
    </tbody>
  </table>
</div> 

Если вы настаиваете на использовании jQuery, следующий фрагмент будет работать вместо кода JavaScript.

$(".sensor").on("click", function () {
  $(this).toggleClass("clicked");
});
Ответ принят как подходящий

В следующем примере используется прослушиватель делегированных событий, привязанный к родительской таблице ( id='womble' ), для перехвата click событий, которые происходят внутри нее и ее дочерних элементов.

Из-за распространения событий вы можете проверить event, чтобы найти элемент, для которого изначально было вызвано событие, и сделать вывод, является ли это строкой таблицы или ячейкой таблицы и т. д. Отсюда вы можете легко переключить желаемое изменение класса для элемента с идентификатором sensor

Если в таблице более одной строки, вам нужно будет использовать атрибут class='row' вместо идентификатора или, альтернативно, использовать атрибут dataset, например data-id='row', который является допустимым.

Обратите внимание, что двойной щелчок по одной и той же ячейке приведет к переключению как класса датчика, так и самой ячейки, тогда как щелчок по отдельным ячейкам переключит только класс датчика.

const tbl = document.getElementById('womble');
const div = document.getElementById('sensor');

tbl.addEventListener('click', e => {
  const item = e.target;

  if (item instanceof HTMLTableRowElement || item instanceof HTMLTableCellElement) {
    div.classList.toggle('clicked');
    item.classList.toggle('active');
  }
});
table,
td {
  border: 1px solid grey;
  border-collapse: all;
}

td {
  padding: 0.25rem;
  cursor: pointer;
  border: 1px dashed grey;
  background: white;
  transition: ease-in-out all 250ms;
}

#sensor {
  width: 30px;
  height: 22px;
  margin: 0 0 -15px 0;
  background-size: 100%;
  background: white;
  background-repeat: no-repeat;
  overflow: hidden;
  border: 1px solid black;
  position: absolute;
  left: 70px;
  top: 100px;
  z-index: 1;
  transition: ease-in-out all 250ms;
}

#sensor.clicked {
  background: greenyellow
}
td.active {
  background: rgba(0, 255, 0, 0.1)
}
<table id='womble'><!-- name / id chosen at random -->
  <tbody>
    <tr class = "row">
      <td> various table rows </td>
      <td> more table data </td>
    </tr>
    <tr class = "row">
      <td> various table rows </td>
      <td> and some more data </td>
    </tr>
  </tbody>
</table>

<div id='sensor'></div>

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