Я не знаком с 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.
РЕДАКТИРОВАТЬ
Теперь решено (разными способами), см. Решения ниже!
только ячейка <td> </td>
Если на ваш вопрос был дан ответ, примите лучший из них



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


Вы можете использовать свойство 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, если выбрано "пройти", фон будет установлен на соответствующий зеленый цвет (и наоборот в случае сбоя, нет и т. д.)?
@NathanOrmond Я добавил эту часть. Извините, что прочитал это в первый раз
Я бы рекомендовал изменить 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>Спасибо, это действительно хорошее решение, и я согласен, что оно определенно упрощает понимание и поддержку / изменение в будущем.
Спасибо! Не стесняйтесь сообщать мне, если у вас есть какие-либо вопросы по реализации, или пометьте ее как решение, если вы чувствуете, что она ответила на ваш вопрос.
Вы хотите изменить цвет фона
cell, содержащегоselect, или цвет фона всегоrow?