#javascript #html #select #css-selectors
#javascript #HTML #выберите #css-селекторы
Вопрос:
Итак, у меня есть форма с вводом и выбором. Что мне нужно сделать, так это добавить другой цвет в требуемые поля, и я пытаюсь не изменять html, который у меня уже есть, поэтому я выполняю функцию на JS. Для ввода это просто, потому что я выполняю следующую функцию, и она изменяет цвет ввода, потому что во входных данных указан «data-val-required».
$('input').each(function () {
var req = $(this).attr('data-val-required');
if (undefined != req) {
$(this).css("background-color", 'rgb(250, 255, 189)');
$(this).attr('title', 'Este campo é obrigatório!');
}
});
Но для выбора я не могу сделать то же самое, потому что «data-val-required» находится в промежутке после <select>
. что я хочу сделать, так это прочитать <span>
, а затем раскрасить <select>
перед ним.
HTML выглядит примерно так (class=»col-md-9″ одинаков для каждого элемента формы в представлении)
<div class="col-md-9">
<select class="form-control">
<option selected="selected" value="1">TEXTO 1</option>
<option value="2">TEXTO 2</option>
<option value="3">TEXTO 3</option>
</select>
<span class="field-validation-error" data-val-required="true">Campo obrigatório</span>
</div>
Я пробовал это, но это окрашивает все <select>
лагеря, которые у меня есть в моем коде, а не только те, которые требуются.
$('span').each(function () {
var rep = $(this).attr('data-val-required');
if (undefined != rep) {
$('select').css("background-color", 'rgb(250, 255, 189)');
$('select').attr('title', 'Este campo é obrigatório!');
}
});
Можно ли в любом случае без изменения HTML заставить функцию считывать диапазон и изменять только выбор перед этим диапазоном?
Я ищу дочерние узлы, но, похоже, я не могу сделать это с помощью class вместо id.
Спасибо!
Ответ №1:
Вы должны были выбрать на прямом дочернем '~'
типе от SPAN из ВЫБОРА с помощью класса form-control. Для поиска в SELECT найдите родственного пользователя из вашего SPAN с желаемым классом и типом SELECT.
$('select.form-control ~ span').each(function () {
var rep = $(this).attr('data-val-required');
if (undefined != rep) {
let select = $(this).siblings('select.form-control');
select.css("background-color", 'rgb(250, 255, 189)');
select.attr('title', 'Este campo é obrigatório!');
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="col-md-9">
<select class="form-control">
<option selected="selected" value="1">TEXTO 1</option>
<option value="2">TEXTO 2</option>
<option value="3">TEXTO 3</option>
</select>
<span class="field-validation-error" data-val-required="true">Campo obrigatório</span>
</div>
<div class="col-md-9">
<select class="form-control">
<option selected="selected" value="1">TEXTO 1</option>
<option value="2">TEXTO 2</option>
<option value="3">TEXTO 3</option>
</select>
<span>Campo obrigatório2</span>
</div>
Комментарии:
1. Это сработало! Большое вам спасибо! Эти узлы меня убивают, спасибо!
2. Просто обратите внимание, что вы максимально ограничиваете свои селекторы с помощью тегов, имен классов и идентификаторов. Если у вас есть прямое дочернее использование > и для родственного ~.
3. Хорошо, большое вам спасибо. Я буду использовать его, чтобы попытаться перейти на другой уровень. Вместо того, чтобы раскрашивать (я сделал это, потому что так было проще), я попытаюсь перейти к надписи раньше и добавить * .
Ответ №2:
Попробуйте это.
$('span').each(function() {
var rep = $(this).attr('data-val-required');
if (undefined != rep) {
$(this).siblings('select').css("background-color", 'rgb(250, 255, 189)');
$(this).siblings('select').find('select').attr('title', 'Este campo é obrigatório!');
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<div class="col-md-9">
<select class="form-control">
<option selected="selected" value="1">TEXTO 1</option>
<option value="2">TEXTO 2</option>
<option value="3">TEXTO 3</option>
</select>
<span class="field-validation-error" data-val-required="true">Campo obrigatório</span>
</div>
<div class="col-md-9">
<select class="form-control">
<option selected="selected" value="1">TEXTO 1</option>
<option value="2">TEXTO 2</option>
<option value="3">TEXTO 3</option>
</select>
<span>Campo obrigatório2</span>
</div>
Комментарии:
1. Лучше использовать sibling вместо parent и find, потому что это быстрее, а select может быть намного глубже в вашей DOM-структуре.
2. Конечно, спасибо @Sascha. Но вы скопировали презентацию by answer . 🙂