Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Jquery, найти ближайший соседний элемент с классом (https://javascript.ru/forum/dom-window/65848-jquery-najjti-blizhajjshijj-sosednijj-ehlement-s-klassom.html)

eddin 11.11.2016 02:43

Jquery, найти ближайший соседний элемент с классом
 
Добрый день!
Есть простой код. При клике по любому 123 происходит отображение/скрытие всех блоков под ними. Мне же надо, чтобы отображение скрытие было только ближайшего блока, находящегося под 123, на который кликнули.

Если я заменяю siblings на next, а также удаляю теги BR, то всё работает. Но необходимо, чтобы работало именно с этой вёрсткой. Подскажите, плз.

Вот код
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>

		<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

	</head>
	<body>
		<ul>
			<li><br>

			<span class="moveout_go">123</span><br>
			<div class="moveout_body">456</div>
			<br>


			<span class="moveout_go">123</span><br>
			<div class="moveout_body">456</div>
			<br>


			<span class="moveout_go">123</span><br>
			<div class="moveout_body">456</div>
			</li>
		</ul>
	</body>
</html>

$(function() {
				$(".moveout_go").on('click', function(){
					
					var $this = $(this), $moveout_body = $(this).siblings('.moveout_body');

					if ($moveout_body.is(":hidden")) {
						$moveout_body.slideDown(200);
					} else {
						$moveout_body.slideUp(200);
					}
					return false;
				});
			});

Rise 11.11.2016 03:30

eddin, .next('.moveout_body')
$('.moveout_go').on('click', function () {
	$(this).next('.moveout_body').slideToggle(200);
});

рони 11.11.2016 03:42

Rise,
Цитата:

Сообщение от eddin
удаляю теги BR, то всё работает. Но необходимо, чтобы работало именно с этой вёрсткой.


рони 11.11.2016 03:51

:write:
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$('.moveout_go').on('click', function () {
    //1 вариант    
    //2 вариант 
    //3 вариант 
});
  </script>
</head>

<body>
<ul>
      <li><br>

      <span class="moveout_go">123</span><br>
      <div class="moveout_body">456</div>
      <br>


      <span class="moveout_go">123</span><br>
      <div class="moveout_body">456</div>
      <br>


      <span class="moveout_go">123</span><br>
      <div class="moveout_body">456</div>
      </li>
    </ul>


</body>
</html>

eddin 11.11.2016 09:25

Эх..., неужели нельзя сделать? По сути получается, что при нажатии на "123" надо просто найти ближайший соседний элемент, идущий следующим, с классом moveout_body и сработать на нём. Неужто в Jquery нет такого?

Цитата:

Сообщение от Rise (Сообщение 434725)
пусть span на div заменит и все br удалит они там не нужны)

к сожалению, вёрстка должна оставаться изначальной.

рони, ваш последний вариант. Дело в том, что неизвестно количество пунктов.

eddin 11.11.2016 09:33

Цитата:

Сообщение от Rise (Сообщение 434745)
eddin, ну сделай два некста подряд не тупи...

не грубите. а два некста - это очень негибко. там BR может быть иногда больше одного. Да, я написал, что вёрстка должна быть именно такой, но просто рассчитывал, что будет предложен какой-то более универсальный вариант.

рони 11.11.2016 09:48

Цитата:

Сообщение от eddin
Неужто в Jquery нет такого?

Цитата:

Сообщение от рони
//1 вариант //2 вариант //3 вариант

а может и больше вариантов решения
надо только почитать документацию на css и jquery

рони 11.11.2016 09:52

eddin,
варианты 1,2,3 это чуть-чуть исправленные варианта Rise, :lol: может кто-то ещё предложит своё решение?

eddin 11.11.2016 10:51

Цитата:

Сообщение от рони (Сообщение 434754)
а может и больше вариантов решения
надо только почитать документацию на css и jquery

Ну CSS я знаю очень хорошо, а jquery читал конечно, но что-то не нашел подходящего варика.
Ещё на ум приходит вариант просто пересчитывать moveout_go и moveout_body, ну и раскрывать тот moveout_body, который будет с таким же индексом, что и moveout_go. Но это каким-то извращением попахивает, да и ресурсоёмкая штука мне кажется получится.

ksa 11.11.2016 10:53

Цитата:

Сообщение от рони
может кто-то ещё предложит своё решение?

Мне понравился твой вариант, предложенный в другой теме... :)

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
.moveout_body {
	display: none;
}
</style>
<script type='text/javascript'>
$(function(){
	var go=$('.moveout_go');
	var bd=$('.moveout_body');
	$('.moveout_go').on('click', function () {
		//1 вариант    
		var i=go.index(this);
		bd.eq(i).slideToggle(200);
	});
});
</script>
</head>
<body>
<ul>
	<li><br>
		<span class="moveout_go">123</span><br>
		<div class="moveout_body">456</div>
		<br>
		<span class="moveout_go">123</span><br>
		<div class="moveout_body">456</div>
		<br>
		<span class="moveout_go">123</span><br>
		<div class="moveout_body">456</div>
	</li>
</ul>
</body>
</html>

Но чем провинились нексты у ТСа, я х/з... :D

P.S.
Это не верстка, а черти что! :-/

ksa 11.11.2016 10:57

Или
$(function(){
	$('.moveout_go').on('click', function () {
		//2 вариант    
		$(this).nextAll('.moveout_body').eq(0).slideToggle(200);
	});
});

рони 11.11.2016 11:03

Цитата:

Сообщение от ksa
Мне понравился твой вариант,

вариант 3 - ок!
Цитата:

Сообщение от ksa
//2 вариант

ok

рони 11.11.2016 11:04

:)
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$('.moveout_go').on('click', function () {
    //1 вариант $(this).nextAll('.moveout_body:first').slideToggle(200);
     $(' ~ .moveout_body:first', this).slideToggle(200); //2 вариант
    //3 вариант $('.moveout_body').eq($('.moveout_go').index(this)).slideToggle(200);
});
});
  </script>
</head>

<body>
<ul>
      <li><br>

      <span class="moveout_go">123</span><br>
      <div class="moveout_body">456</div>
      <br>


      <span class="moveout_go">123</span><br>
      <div class="moveout_body">456</div>
      <br>


      <span class="moveout_go">123</span><br>
      <div class="moveout_body">456</div>
      </li>
    </ul>


</body>
</html>

eddin 11.11.2016 11:21

Rise, ksa, рони, спасибо, господа! :)
рони, ваш сарказми и иронию оценил :) Блин, ну нет у меня времени погружаться в jquery.((( Вы не представляете как бы я был рад, если бы у меня было время на изучение JS, но это только мечты...

Остановился на этих вариантах:

<script>
			$(function() {
				$(".moveout_go").on('click', function(){
					
					var $moveout_body = $(this).nextAll('.moveout_body').first();

					if ($moveout_body.is(":hidden")) {
						$moveout_body.slideDown(200);
					} else {
						$moveout_body.slideUp(200);
					}
					return false;
				});
			});
		</script>
		
		<script>
			$(function() {
				$(".moveout_go").on('click', function(){
					
					var moveout_body = $(this).nextAll('.moveout_body').eq(0);

					if ($moveout_body.is(":hidden")) {
						$moveout_body.slideDown(200);
					} else {
						$moveout_body.slideUp(200);
					}
					return false;
				});
			});
		</script>


не знаю какой выбрать, но мне кажется по производительности они на одном уровне, если не так, то помогите с выбором.

ps
Цитата:

Сообщение от ksa (Сообщение 434766)
Но чем провинились нексты у ТСа, я х/з... :D

Ну я писал выше, что может иногда BR быть больше одного.
Цитата:

Сообщение от ksa (Сообщение 434766)
P.S.
Это не верстка, а черти что! :-/

Самому тошно :blink:, но имеем то, что имеем.

pps Rise и рони что-то не даёт сайт карму поднять, пишет что сначала надо кому-то ещё это сделать. Странная система конечно.

рони 11.11.2016 12:15

Цитата:

Сообщение от eddin
Остановился на этих вариантах:

вам показали нормальные варианты ... зачем нужно делать
if ($moveout_body.is(":hidden"))

eddin 11.11.2016 13:49

Цитата:

Сообщение от рони (Сообщение 434784)
вам показали нормальные варианты ... зачем нужно делать
if ($moveout_body.is(":hidden"))

Блин, точно. Спасибо! Голова совсем не варит уже. Вот такой итоговый вариант получился, с выносом во внешний файл JS:

$(function() {
	$(".moveout_go").on('click', function(){
		var $this = $(this), $mb = $this.nextAll('.moveout_body').eq(0);
		$this.toggleClass("top_arr");
		$mb.slideToggle(200);
		return false;
	});
});


А ещё подскажите, плз, имеет ли смысл в данном случае объявлять переменные или лучше всё указать вот так?

$(function() {
	$(".moveout_go").on('click', function(){
		$(this).toggleClass("top_arr");
		$(this).nextAll('.moveout_body').eq(0).slideToggle(200);
		return false;
	});
});

рони 11.11.2016 14:00

Цитата:

Сообщение от eddin
имеет ли смысл в данном случае объявлять переменные

да
Цитата:

Сообщение от eddin
или лучше всё указать вот так?

тогда вот как можно
$(function() {
	$(".moveout_go").on('click', function(){
		$(this).toggleClass("top_arr")
		.nextAll('.moveout_body').eq(0).slideToggle(200);
		return false;
	});
});

eddin 11.11.2016 14:06

рони, спасибо!

ksa 11.11.2016 14:07

Цитата:

Сообщение от eddin
имеет ли смысл в данном случае объявлять переменные

Если что-то повторяется более одного раза - уже имеет. :yes:
Но цепочка методов вполне допустима. ;)
Т.е.

$(function() {
	$(".moveout_go").on('click', function(){
		var obj=$(this);
		obj.toggleClass("top_arr");
		obj.nextAll('.moveout_body').eq(0).slideToggle(200);
		return false;
	});
});
Или
$(function() {
	$(".moveout_go").on('click', function(){
		$(this).toggleClass("top_arr").nextAll('.moveout_body').eq(0).slideToggle(200);
		return false;
	});
});

eddin 11.11.2016 15:09

Цитата:

Сообщение от ksa (Сообщение 434806)
Если что-то повторяется более одного раза - уже имеет. :yes:
Но цепочка методов вполне допустима. ;)
[/JS]

Спасибо, запомню! :)

Abidoblader 21.04.2022 10:18

Хз, вам может уже и не актуально, но может кому пригодится
 
<div class="carBox"></div>
<div class="carBox"></div>
<div class="carBox"></div>
<div class="carBox"></div>
<div class="paramWrap"></div>
<div class="carBox"></div>
<div class="carBox"></div>
<div class="carBox"></div>
<div class="carBox"></div>
<div class="paramWrap"></div>

<script>
	$('.carBox').click(function(){
		var i = 0;
		infobox = $(this).next('div');
		while (i == 0) {
			if (infobox.hasClass('paramWrap') != false) {
				i = 1;
			} else {
				infobox = infobox.next('div');
				if (!infobox.length) {
					i = 1;
				}
			}
		}

		$('.paramWrap').removeClass('open');
		infobox.addClass('open');
	});
</script>


Часовой пояс GMT +3, время: 22:36.