Трудная задачка
Доброй ночи, уважаемые пользователи форума. Столкнулся с задачкой, трудной для выполнения мне. Надеюсь она заинтересует тебя, и ты сможешь помочь мне решить её.
Есть список радио кнопок, каждая находится в своем li, при нажатии на другой инпут или лабел класс меняется на активный у li. Если работать с одним списком <ul><li../><li.../></ul> То все отлично, а как быть если их больше? Подскажите пожалуйста, я сам не смогу додумать. Сам код:
$(document).ready(function(){
$('.variants input[type="radio"]').click(function() {
console.log('li[for="' + $(this).attr('id') + '"');
$('li').removeClass('radioOn').addClass('radioOff');
$('li[for="' + $(this).attr('id') + '"]').removeClass('radioOff').addClass('radioOn'
)
});
$('.variants input[type="radio"]:checked').click();
});
(отлично работает если на странице один список(ul), с множеством вариантов (li) ). Примерный html: <article> <ul> <li for="id_1"><input type="radio" ... /><label .. /></li> <li for="id_2"><input type="radio" ... /><label .. /></li> </ul> </article> <article> <ul> <li for="id_53"><input type="radio" ... /><label .. /></li> <li for="id_54"><input type="radio" ... /><label .. /></li> </ul> </article> <article> <ul> <li for="id_86"><input type="radio" ... /><label .. /></li> <li for="id_87"><input type="radio" ... /><label .. /></li> </ul> </article> p.s. для каждого article может использовать еще свой уникальный индификатор? |
взять родительский элемент article и выполнять действия относительно него? :)
var parent = $(this).closest('article'); $('li',parent).removeClass... |
Цитата:
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
.on {
color: red;
background-color: yellow;
}
</style>
<script type="text/javascript">
$(document).ready(function (){
$(':radio').click(function (){
var o=$(this);
$(this).parents('ul').find('.on').removeClass('on');
$(this.parentNode).addClass('on');
});
});
</script>
</head>
<body>
<article>
<ul>
<li for="id_1"><input type="radio" name='grp1' /><label> .. </label></li>
<li for="id_2"><input type="radio" name='grp1' /><label> .. </label></li>
</ul>
</article>
<article>
<ul>
<li for="id_53"><input type="radio" name='grp2' /><label> .. </label></li>
<li for="id_54"><input type="radio" name='grp2' /><label> .. </label></li>
</ul>
</article>
<article>
<ul>
<li for="id_86"><input type="radio" name='grp3' /><label> .. </label></li>
<li for="id_87"><input type="radio" name='grp3' /><label> .. </label></li>
</ul>
</article>
</body>
</html>
|
ksa, да только как заставить первым элементам в каждом списке быть активными с самого начала, ну типа они уже выбраны (checked)
|
Пробовал дописать, что в начале класс добавляемся инпутам с checked, но как то безрезультатно
|
Цитата:
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
.on {
color: red;
background-color: yellow;
}
</style>
<script type="text/javascript">
$(document).ready(function (){
$(':radio').click(function (){
var o=$(this);
$(this).parents('ul').find('.on').removeClass('on');
$(this.parentNode).addClass('on');
});
});
</script>
</head>
<body>
<article>
<ul>
<li for="id_1" class='on'><input type="radio" name='grp1' checked /><label> .. </label></li>
<li for="id_2"><input type="radio" name='grp1' /><label> .. </label></li>
</ul>
</article>
<article>
<ul>
<li for="id_53" class='on'><input type="radio" name='grp2' checked /><label> .. </label></li>
<li for="id_54"><input type="radio" name='grp2' /><label> .. </label></li>
</ul>
</article>
<article>
<ul>
<li for="id_86" class='on'><input type="radio" name='grp3' checked /><label> .. </label></li>
<li for="id_87"><input type="radio" name='grp3' /><label> .. </label></li>
</ul>
</article>
</body>
</html>
|
Вау... спасибо вам большое, а можете прокомментировать этот вариант?
$('input[type="radio"]').change(function() {
$(this).closest('ul').find('li').removeClass('radioOn');
$(this).parent().addClass('radioOn');
});
|
Цитата:
http://jquery-docs.ru/traversing/closest/ find http://jquery-docs.ru/traversing/find/ removeClass http://jquery-docs.ru/attributes/removeclass/ parent http://jquery-docs.ru/traversing/parent/ addClass http://jquery-docs.ru/attributes/addclass/ Т.ч. все из букваря... |
Я имею в виду, как вам этот вариант реализации задачи?
|
Цитата:
|
А как задать class='on' первому элементу не через html, а js?
|
Первому списку понятно как, а вот что бы каждому не понятно =\ Посмотрел документацию, что вы скинули.
|
Цитата:
http://jquery-docs.ru/Selectors/firstChild/ |
Я его и использовал, но работает почему то только к первому дочернему элементу ( т.е. li) относительно первого родителя (ul) к остальным не присваивается.
Вот как пробовал:
// 1
$(this).closest('ul li:first').addClass('radioOn');
// 2
$("li:first").addClass("radioOn");
// 3
$(e.target).closest('ul').find('li').addClass('radioOn');
// 4
$('ul li:first').addClass('radioOn');
// Способ по изощрение обходим все таблицы и собираем с каждой по первой строке
var res = $("ul").map(function(){
// this - таблица
return $("li:first", this);
}).get();
// res - array
// превращаем в коллекцию
res = $(res);
// и работаем с ней
res.addClass('radioOn');
// или
res.css('radioOn');
И вот так еще:
$(document).ready(function(){
$("ul li:first-child") {
$(this).addClass("radioOn"); };
});
ВО вот так, работает, использую перед вашим скриптом
$('ul li:first-child').addClass('on');
|
Подскажите еще пожалуйста)))
А как взять дочерний дочернего элемента? Ради валидности инпут заворачиваю в <p>, т.е. получается вот так: <ul> <li><p><input /></p></li> <li><p><input /></p></li> </ul> Поэтому класс добавляется к p, а не к li. Но это так для саморазвития если не трудно. Мне и такой вариант уже чудо и подстрою под себя. |
А вообще это не столь важно.
Использую html 5 поэтому инпут без слеша / в конце и можно не использовать параграф. Большое вам спасибо. Вы очень мне помогли. |
Цитата:
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
.on {
color: red;
background-color: yellow;
}
</style>
<script type="text/javascript">
$(document).ready(function (){
$('ul > li:first-child > p').addClass('on');
});
</script>
</head>
<body>
<ul>
<li><p><input />item 1</p></li>
<li><p><input />item 2</p></li>
</ul>
<ul>
<li><p><input />item 1</p></li>
<li><p><input />item 2</p></li>
</ul>
</body>
</html>
|
| Часовой пояс GMT +3, время: 16:56. |