JavaScript: установите цвет фона <td> в таблице, содержащей <select>, в зависимости от того, какой <option> выбран

Я не знаком с JavaScript, но программное обеспечение, которое я пишу, генерирует большую таблицу в файле html, поэтому я пытаюсь использовать JavaScript для некоторых стилей и поведения внутри.

Файл html содержит большую таблицу данных. Одна из строк таблицы содержит раскрывающийся список с тремя (-ми) коррелированными цветами:

проход: зеленый | сбой: красный | нет: синий

В качестве наглядного пособия для пользователя я пытаюсь установить цвет фона содержимого для сопоставления с цветом выбранного элемента. Когда программа запускается, некоторые из выпадающих списков будут настроены на успешное или неудачное (или отсутствие), поэтому JavaScript должен установить сопоставление цвета фона td в поле выбора:

  • когда документ впервые отображается в браузере.
  • При изменении выбранного значения в поле выбора

На данный момент я добрался до:

<td align = "center" id = "dropdownTableData">
    <select id = "select" onchange = "setColor()">
        <option value = "green">pass</option>
        <option value = "red">fail</option>
        <option value = "blue" selected = "selected">none</option>
    </select>
</td>

с помощью JavaScript:

setColor = function() {
    var e = document.getElementById("select");
    e.style.backgroundColor = e.options[e.selectedIndex].value;
}

Приносим извинения, если это довольно просто, но я все еще пытаюсь осмыслить JavaScript.

РЕДАКТИРОВАТЬ

Теперь решено (разными способами), см. Решения ниже!

Вы хотите изменить цвет фона cell, содержащего select, или цвет фона всего row?

StaticBeagle 09.08.2018 17:00

только ячейка <td> </td>

Nathan Ormond 09.08.2018 17:32

Если на ваш вопрос был дан ответ, примите лучший из них

full-stack 09.08.2018 18:38
Поведение ключевого слова "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) для оценки ваших знаний,...
3
3
644
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать свойство parentNode:

setColor = function() {
         var e = document.getElementById("select");
         e.parentNode.style.backgroundColor = e.options[e.selectedIndex].value;
      }
Ответ принят как подходящий

Вы можете немного изменить свой HTML, чтобы он стал динамическим:

<td align = "center" id = "dropdownTableData">
    <select id = "select" onchange = "setColor(this)">
        <option value = "green">pass</option>
        <option value = "red">fail</option>
        <option value = "blue" selected = "selected">none</option>
    </select>
</td>

JS:

setColor = function(element) {
    element.parentNode.style.backgroundColor = element.options[element.selectedIndex].value;
}

Вызвать при запуске:

var selectElements = document.getElementById('tableID').getElementsByTagName('select')
for (var i = 0; i < selectElements.length; i++) {
    setColor(selectElements[i]);
}

Небольшое примечание:

Хотя мой ответ устраняет проблемы, указанные в вопросе, я считаю, что ответ, который дал Чейз Ингебритсон, более элегантен и его легче поддерживать в будущем.

Спасибо за быстрый ответ. Это отлично работает на изменениях, именно то, что я там ищу. Как мне затем вызвать метод setColor (this) для каждого <td id = "dropdownTableData">, когда HTML-файл готов в браузере. IE, если выбрано "пройти", фон будет установлен на соответствующий зеленый цвет (и наоборот в случае сбоя, нет и т. д.)?

Nathan Ormond 09.08.2018 17:31

@NathanOrmond Я добавил эту часть. Извините, что прочитал это в первый раз

Douwe de Haan 09.08.2018 17:44

Я бы рекомендовал изменить classList из parentNode в зависимости от значения вашего элемента.

Чтобы отслеживать изменения в вашем <select>, может быть немного проще добавить прослушиватель событий к каждому из них. Как только ваш выбор изменится, просто вызовите функцию, которая получает родительский элемент, получает значение и изменяет класс вашего родительского элемента в зависимости от значения вашего элемента.

var data = document.querySelectorAll('#data-table tr td select');

data.forEach(function(item) {
  setColor(item);

  item.addEventListener('change', function() {
    setColor(this);
  });
});

function setColor(element) {
  var container = element.parentElement;
  container.classList.remove('none', 'pass', 'fail');

  var value = element.options[element.selectedIndex].value;
  container.classList.add(value);
}
table tr td {
  border: 1px solid black;
  padding: 5px;
}

table tr td.none {
  background-color: blue;
}

table tr td.pass {
  background-color: green;
}

table tr td.fail {
  background-color: red;
}
<table id = "data-table">
  <tr>
    <td>
      <select>
        <option value = "none" default selected>None</option>
        <option value = "pass">Pass</option>
        <option value = "fail">Fail</option>
      </select>
    </td>
    <td>
      <select>
        <option value = "none" default>None</option>
        <option value = "pass" selected>Pass</option>
        <option value = "fail">Fail</option>
      </select>
    </td>
    <td>
      <select>
        <option value = "none" default>None</option>
        <option value = "pass">Pass</option>
        <option value = "fail" selected>Fail</option>
      </select>
    </td>
  </tr>
</table>

Спасибо, это действительно хорошее решение, и я согласен, что оно определенно упрощает понимание и поддержку / изменение в будущем.

Nathan Ormond 09.08.2018 17:56

Спасибо! Не стесняйтесь сообщать мне, если у вас есть какие-либо вопросы по реализации, или пометьте ее как решение, если вы чувствуете, что она ответила на ваш вопрос.

Chase Ingebritson 09.08.2018 18:42

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