#javascript #jquery #html
#javascript #jquery #HTML
Вопрос:
Я пытаюсь работать над чем-то, где, если вы нажмете на определенный элемент, он обновит выпадающий список, чтобы соответствовать атрибуту данных div.
По большей части, это то, что у меня есть:
HTML:
<div class="selector">
<select class="js-example-basic-single">
<option value="#sedans-10" data-select="sedan" selected>Sedans</option>
<option value="#suvs-10" data-select="suv">SUVs</option>
</select>
</div>
<div class="list__vehicles">
<div class="item--vehicle active" data-vehicle="sedan">
<h2>Sedan #1</h2>
<a class="link--select" href="#">Select This</a>
</div>
<div class="item--vehicle" data-vehicle="sedan">
<h2>Sedan #2</h2>
<a class="link--select" href="#">Select This</a>
</div>
<div class="item--vehicle" data-vehicle="suv">
<h2>SUV #1</h2>
<a class="link--select" href="#">Select This</a>
</div>
<div class="item--vehicle" data-vehicle="suv">
<h2>SUV #2</h2>
<a class="link--select" href="#">Select This</a>
</div>
</div>
JS:
var link = $('.link--select');
link.on('click', function(e){
$(this).parent().addClass('active').siblings().removeClass('active');
if ($('.active').data('vehicle') = $('.js-example-basic-single option').data('select')) {
$('.js-example-basic-single option').val('selected');
}
e.preventDefault();
});
Ссылка на демонстрацию (CodePen):
https://codepen.io/ultraloveninja/pen/JVWQeb
В целом, я пытаюсь сопоставить атрибуты данных между элементами и селектором, если item--vehicle
есть класс active
, и если есть совпадение, добавьте selected
к значению параметра атрибут данных соответствия.
Я знаю, что у меня неверно, но я пытался логически вывести это из того, что я пытался выбросить из головы.
Комментарии:
1. Я не совсем понимаю, что вы имеете в виду: «В целом, я пытаюсь сопоставить атрибуты данных между элементами и селектором, если у элемента-транспортного средства есть класс active, и если есть совпадение, добавьте selected к значению параметра с атрибутом match data». Не могли бы вы привести пример, если я нажму на него (не обязательно это должен быть пример кода)?
2. @Aaron3219 В принципе, если вы нажмете на один из элементов, он проверит
data-vehicle
атрибут, и если он соответствуетdata-vehicle
, то он либо останется прежним, либо переключит выпадающий список на этот конкретный параметр. (например, если щелкнуть SUV # 1 или SUV # 2, то SUV будет отображаться выбранным, но если щелкнуть Седан # 1 или Седан # 2, то в раскрывающемся списке будет выбран седан).3. @Aaron3219 Я забыл включить демонстрацию … сообщение обновлено.
Ответ №1:
Селектор можно установить с помощью jQuery, установив значение объекта select равным значению параметра, на который вы пытаетесь его установить, т.е. $('.js-example-basic-single').val('#sedans-10')
.
В вашем случае вам нужно будет либо сопоставить значения атрибутов данных со значениями параметров в вашем select
т.е. data-vehicle="#sedan-10"
или option value="sedan"
а затем установите значение select
‘s на значение данных, вызвав:
$('.js-example-basic-single').val($('.active').data('vehicle'));
или сверьте с атрибутом данных каждого option
:
$('.js-example-basic-single option').each(function() { //foreach option in select
if($('.active').data('vehicle') == $(this).data('select')) { //if data in div matches data in option
$('.js-example-basic-single').val($(this).val()); //then set select to the value of that option
return false; //and stop the iteration
}
});
Комментарии:
1. Хорошо, круто. Да, я еще немного подумал об этом прошлой ночью и еще немного почитал, и я понял, что, вероятно, я мог бы просто основывать его на значении, но проверка каждого атрибута данных также работает. Спасибо!
Ответ №2:
В основном то, что связывает список с выбором в этой демонстрации:
-
Определите позицию индекса выбранной ссылки:
var idx = $active.index();
-
Затем найдите соответствующий параметр:
var $select = $('option').eq(idx);
-
Найдите выбранный атрибут значения параметра. Это упрощается путем присвоения
data-*
атрибута, который имеет то же значение, что и атрибут value .<option data-select='sedan-2' value='sedan-2' disabled> ... var val = $select.data('select');
-
Хотя значение выбранного параметра известно, выбор параметра программно выполняется с помощью
<select>
$('.selector').val(val);
$('.link').on('click', linkOption);
function linkOption(e) {
var $active = $(this).parent('.item');
var idx = $active.index();
var $select = $('option').eq(idx);
var val = $select.data('select');
$('.item').removeClass('active');
$active.addClass('active');
$('option').removeClass('select').prop('disabled', true).prop('selected', false);
$select.addClass('select').prop('disabled', false).prop('selected', true);
$('.selector').val(val);
}
:root {
font: 500 small-caps 16px/1.3 Verdana
}
fieldset {
padding: 10px 25px;
width: fit-content;
}
select,
option {
font: inherit;
font-size: 7.75vh;
font-weight: 400;
height: 28px;
line-height: 28px;
}
[enabled] {
font-size: 7.75vh;
font-weight: 700;
}
.item,
.link,
optgroup {
font-size: 7.75vh;
color: black;
}
.item {
border-bottom: 1.5px solid transparent;
padding-bottom: 3px;
}
.item:hover {
border-bottom: 1.5px solid #1329F2;
padding-bottom: 3px;
color: #1329F2;
}
.selector,
.list {
display: inline-block;
}
select {
transform: translateY(-320%);
width: 10ch;
outline: none;
color: #1329F2;
}
a {
display: block;
text-decoration: none;
color: black;
width: 100%;
height: 100%;
}
a:hover,
a:active,
[selected],
.select,
.active,
.active .link {
color: #1329F2;
}
<fieldset>
<select class="selector">
<optgroup label="Vehicle"></optgroup>
<optgroup label="Sedan">
<option data-select='sedan-1' value='sedan-1' disabled>
Sedan #1
</option>
<option data-select='sedan-2' value='sedan-2' disabled>
Sedan #2
</option>
</optgroup>
<optgroup label="SUV">
<option data-select='suv-1' value='suv-1' disabled>
SUV #1
</option>
<option data-select='suv-2' value='suv-2' disabled>
SUV #2
</option>
</optgroup>
</select>
<ol class="list">
<li class="item">
<a class="link" data-vehicle="sedan-1" href="#/">
Sedan #1</a></li>
<li class="item">
<a class="link" data-vehicle="sedan-2" href="#/">
Sedan #2</a></li>
<li class="item">
<a class="link" data-vehicle="suv-1" href="#/">
SUV #1</a></li>
<li class="item">
<a class="link" data-vehicle="suv-2" href="#/">
SUV #2</a></li>
</ol>
</fieldset>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>