У меня проблема, когда мой раскрывающийся список переключает весь набор элементов li
. Мне просто было интересно, как я могу изменить свой jQuery для таргетинга на первый дочерний ul родительского элемента, в данном случае на элемент span
, на который я нажал.
Есть ли простой способ решить эту проблему? Я прикрепил JSFiddle ниже, также не совсем уверен, почему у списка гигантское левое поле, но это кажется тривиальным.
HTML
<dl id="sample" class="dropdown">
<dt><a href="#"><span>COUNTRIES</span></a></dt>
<dd>
<ul>
<li><a href="#">Brazil<img class="flag" src="br.png" alt="" /><span class="value">BR</span></a></li>
<li><a href="#">France<img class="flag" src="fr.png" alt="" /><span class="value">FR</span></a></li>
<li><a href="#">Germany<img class="flag" src="de.png" alt="" /><span class="value">DE</span></a></li>
<li><a href="#">India<img class="flag" src="in.png" alt="" /><span class="value">IN</span></a></li>
</ul>
</dd>
<dt><a href="#"><span>PLANETS</span></a></dt>
<dd>
<ul>
<li><a href="#">EARTH<img class="flag" src="br.png" alt="" /><span class="value">BR</span></a></li>
<li><a href="#">SATURN<img class="flag" src="fr.png" alt="" /><span class="value">FR</span></a></li>
<li><a href="#">MARS<img class="flag" src="de.png" alt="" /><span class="value">MR</span></a></li>
<li><a href="#">PLUTO(JK)<img class="flag" src="in.png" alt="" /><span class="value">PL</span></a></li>
</ul>
</dd>
</dl>
<span id="result"></span>
jQuery
$(document).ready(function() {
$(".dropdown img.flag").addClass("flagvisibility");
$(".dropdown dt a").click(function() {
$(".dropdown dd ul").toggle();
});
$(".dropdown dd ul li a").click(function() {
var text = $(this).html();
$(".dropdown dt a span").html(text);
$(".dropdown dd ul").hide();
$("#result").html("Selected value is: " + getSelectedValue("sample"));
});
function getSelectedValue(id) {
return $("#" + id).find("dt a span.value").html();
}
$(document).bind('click', function(e) {
var $clicked = $(e.target);
if (! $clicked.parents().hasClass("dropdown"))
$(".dropdown dd ul").hide();
});
$("#flagSwitcher").click(function() {
$(".dropdown img.flag").toggleClass("flagvisibility");
});
});
1 ответ
В ваших обработчиках click
вы не можете просто использовать спецификаторы класса - вот почему ваши действия влияют на каждый соответствующий элемент.
Вам нужно будет пройти по дереву DOM (т. Е. .parent()
, .child()
и т. Д.), Чтобы найти связанные элементы, которые вы хотите изменить.
Например, в этом обработчике:
$(".dropdown dt a").click(function() {
$(".dropdown dd ul").toggle();
});
Предположительно вы хотите показать элемент dd > ul
, следующий за <dt>
, который содержит нажатый <a>
:
$(".dropdown dt a").click(function() {
$(this).parent().next('dd').children('ul').first().toggle();
});
Хотя при этом сказано (в комментариях), если ваша разметка HTML остается такой, как есть, вы можете упростить ее следующим образом, поскольку там только один <ul>
, а <dd>
всегда следует за <dt>
:
$(".dropdown dt a").click(function() {
$(this).parent().next().children().toggle();
});
Похожие вопросы
Новые вопросы
jquery
jQuery — это библиотека JavaScript. Также рассмотрите возможность добавления тега JavaScript. jQuery — это популярная кросс-браузерная библиотека JavaScript, которая упрощает обход объектной модели документа (DOM), обработку событий, анимацию и взаимодействие AJAX, сводя к минимуму расхождения между браузерами. Вопрос с тегом jQuery должен быть связан с jQuery, поэтому jQuery должен использоваться рассматриваемым кодом, и в вопросе должны быть как минимум элементы, связанные с использованием jQuery.