Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Переход на нужную вкладку таба по href (https://javascript.ru/forum/jquery/81649-perekhod-na-nuzhnuyu-vkladku-taba-po-href.html)

Vaska 04.01.2021 20:35

Переход на нужную вкладку таба по href
 
Приветствую!

На странице есть блок с вкладками. Нужно на этой же странице разместить ссылку, за пределами блока с табами, выше блока с табами, и по клику по этой ссылке, переходить во второй таб.
Можете помочь дописать скртипт, чтобы ссылка работала?
Заранее спасибо откликнувшимся.

Ссылка выше блока с табами:
<a href="#dsGoods2">Ссылка на таб2</a>


Блок с табами:
<div>
		<div>
			<div>
				<ul>
					<li class="current"><a id="tab1" href="#tab1">таб1</a></li>
					<li><a id="tab2" href="#tab2">таб2</a></li>
					<li><a id="tab3" href="#tab3">таб3</a></li>					
				</ul>
			</div>
		</div>
		<div>
			<div class="content bd" id="dsGoods1">
				<div class="dss-goods-info-content">
				Содержание вкладки 1
				</div>
			</div>
		</div>
		<div>
			<div class="dss-goods-title-bar hd" style="display: none">
				<h4><a href="javascript:void(0);">таб2</a></h4>
			</div>
			<div class="dss-goods-info-content bd" id="dsGoods2" style="display: none">
				Содержание вкладки 2
			</div>
		</div>
		<div>
			<div class="dss-goods-title-bar hd" style="display: none">
				<h4><a href="javascript:void(0);">таб3</a></h4>
			</div>
			<div class="dss-goods-info-content bd" id="dsGoods3" style="display: none">
				Содержание вкладки 3
			</div>
		</div>
	</div>


// таб1 - показывает по умолчанию
	$('#tab1').click(function(){
		$('.bd').css('display','none');
		$('#dsGoods1').css('display','');
		$('.hd').css('display','none');
	});
	// Нажмите на таб2, чтобы скрыть другую вкладку и их строку заголовка.
	$('#tab2').click(function(){
		$('.bd').css('display','none');
		$('#dsGoods2').css('display','');
		$('.hd').css('display','none');
	});
	// Нажмите на таб3, чтобы скрыть другую вкладку и их строку заголовка.
	$('#tab3').click(function(){
		$('.bd').css('display','none');
		$('#dsGoods3').css('display','');
		$('.hd').css('display','none');
	});

рони 04.01.2021 22:57

Цитата:

Сообщение от Vaska
чтобы ссылка работала?

$('#tab2, [href="#dsGoods2"]').click...

Vaska 05.01.2021 06:27

Цитата:

Сообщение от рони (Сообщение 532324)
$('#tab2, [href="#dsGoods2"]').click...

Так и подумал, что рони ответит :) . Уже второй раз помогает.
Ссылка работает, по клику перемещает к вкладке #dsGoods2 и открывает содержимое вкладки #dsGoods2.
Однако не переключает на заголовок таба #tab2, а остается в заголовке #tab1.
Можете с этим помочь?

laimas 05.01.2021 07:41

Цитата:

Сообщение от Vaska
Однако не переключает на заголовок таба #tab2

НУ так верстка та еще, все как в басне о щуке, раке, ... Определитесь с контейнерами, которые, и только они, будут скрываться, а уже в них помещайте все что хочется, и которым управлять не надо.

<style>
li {
    list-style: none;
    display: inline-block;
}

.tab-content:not(#tab1) {
    display: none;
} 
</style>

<div>

    <div>
        <ul>
            <li class="current"><a href="#tab1">таб1</a></li>
            <li><a href="#tab2">таб2</a></li>
            <li><a href="#tab3">таб3</a></li>                
        </ul>
    </div>

    <div class="tab-content" id="tab1">
        <h4>таб1</h4>
        Содержание вкладки 1
    </div>

    <div class="tab-content" id="tab2">
        <h4>таб2</h4>
        Содержание вкладки 2
    </div>

    <div class="tab-content" id="tab3">
        <h4>таб3</h4>
        Содержание вкладки 3
    </div>

</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$('ul').on('click', 'a', function(e) {
    e.preventDefault();
    var active = $(this).parent().siblings('.current').removeClass('current').children().attr('href'),
        current = $(this).parent().addClass('current').end().attr('href');
    
    $(active).hide();
    $(current).show()
});
</script>

рони 05.01.2021 08:35

Цитата:

Сообщение от Vaska
Однако не переключает на заголовок таба

где код установки li class="current"?
и смотрите пример от laimas,

Vaska 05.01.2021 12:21

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

Vaska 05.01.2021 12:23

Цитата:

Сообщение от рони (Сообщение 532344)
где код установки li class="current"?
и смотрите пример от laimas,

Да, li class="current" не переключается на заголовок второго таба, если я по внешней ссылке перешел на вторую вкладку. Код laimas что-то не работает с внешней ссылкой. Имеется ввиду, что ссылка на той же странице, что и вкладки, но ссылка за пределами блока с табами.

laimas 05.01.2021 15:27

Цитата:

Сообщение от Vaska
Код laimas что-то не работает с внешней ссылкой.

Это как понимать, если табы, это управление уже имеющимся на странице?

Vaska 05.01.2021 22:51

Цитата:

Сообщение от laimas (Сообщение 532354)
Это как понимать, если табы, это управление уже имеющимся на странице?

После установки вашего кода на страницу, по ссылкам переключаются вкладки, но заголовки табов не переключаются и табы ведут себя иначе, перестают прилипать к верхней части браузера при переключении табов. Я вам в личку написал.

рони 05.01.2021 23:03

Vaska,
$('[href="#dsGoods2"]').click(() => $('#tab2').click());

laimas 05.01.2021 23:57

Цитата:

Сообщение от Vaska
табы ведут себя иначе, перестают прилипать к верхней части браузера при переключении табов.

Ну это не самое лучшее, когда контент скачет вверх. То что я привел, это ведь "скелет", основа того, как работает. Элементы А (а можно их и выбросить) определяют элемент, который нужно показать. Весь остальной контент помещенный в такой элемент автоматически будет показан. Как он размещен, есть ли какой либо свой функционал у них, это чисто верстка и стили. Может какой-то JS выполняющий нечто индивидуальное, но ни как не относящееся к показать/скрыть.

О каких-то внешних адресах в контексте вкладок я не понял. Это нужно видеть html-код, дать пояснение что к чему, иначе какой-то сыр бор получается.

Vaska 06.01.2021 00:02

Цитата:

Сообщение от рони (Сообщение 532358)
Vaska,
$('[href="#dsGoods2"]').click(() => $('#tab2').click());

Да, этот вариант прекрасно работает.
Моё уважение и большое спасибо!
Хотел бы хотя бы 300 руб. на карту скинуть, российскую.

Vaska 06.01.2021 00:04

laimas, спасибо большое, что поучаствовали. Рони предложил удачный вариант.

Vaska 06.01.2021 20:03

Обновлю тему.

Это табы:
<div>
	<div>
		<div>
			<ul>
				<li class="current"><a id="tab1" href="#tab1">таб1</a></li>
				<li><a id="tab2" href="#tab2">таб2</a></li>
				<li><a id="tab3" href="#tab3">таб3</a></li>					
			</ul>
		</div>
	</div>
	<div>
		<div class="content bd" id="dsGoods1">
			<div class="dss-goods-info-content">
				Содержание вкладки 1
			</div>
		</div>
	</div>
	<div>
		<div class="dss-goods-title-bar hd" style="display: none">
			<h4><a href="javascript:void(0);">таб2</a></h4>
		</div>
		<div class="dss-goods-info-content bd" id="dsGoods2" style="display: none">
			Содержание вкладки 2
		</div>
	</div>
	<div>
		<div class="dss-goods-title-bar hd" style="display: none">
			<h4><a href="javascript:void(0);">таб3</a></h4>
		</div>
		<div class="dss-goods-info-content bd" id="dsGoods3" style="display: none">
			Содержание вкладки 3
		</div>
	</div>
</div>

Это скрипт, который переключает тайтлы табов, присваивает для тайтла, тегу li класс current:
$('#categorymenu').on('click', 'li', function() {
	$('#categorymenu li').removeClass('current');
	$(this).addClass('current');
});


На той же странице сделал меню:
<div class="tab-bar">
	<ul id="hiddenmenu" class="tab-lists">
		<li class="active">
			<div>
				<a id="hidGoods1" href="#dsGoods1">title 1</a>
			</div>
		</li>
		<li class="">
			<div>
				<a id="hidGoods2" href="#dsGoods2">title 2</a>
			</div>
		</li>
		<li class="">
			<div>
				<a id="hidGoods3" href="#dsGoods3">title 3</a>
			</div>
		</li>		
	</ul>
</div>

Это скрипт, который по клику в Меню - переключает тайтлы в Табах, хорошо работает:
$('[href="#dsGoods1"]').click(() => $('#tabGoods1').click());
$('[href="#dsGoods2"]').click(() => $('#tabGoods2').click());
$('[href="#dsGoods3"]').click(() => $('#tabGoods3').click());
});


Добавил скрипт, который должен по клику на тайтле меню - переключать тайтл в меню и присваивать тегу li class active, хорошо работает:
$('#hiddenmenu').on('click', 'li', function() {
$('#hiddenmenu li').removeClass('active');
$(this).addClass('active');
});

Теперь нужно сделать скрипт, который будет по клику по тайтлу Таба - переключать тайтл Меню. Нужно же, чтобы и у тайтла меню и у тайтла вкладок были одинаковые тайтлы при переключении тайтла в табе или в меню.
Написал такой скрипт:
$('#categorymenu').on('click', 'li', function() {
$('#hiddenmenu li').removeClass('active');
$(this).addClass('active');
});

Скрипт работает на половину. Кликая по тйтлу таба - удаляется active у тайтла меню, но не присваивается другому тайтлу меню. В то же время, у тайтла таба присваивается current.
Что я делаю не так?

рони 06.01.2021 20:43

Vaska,
... снова не осилил, не смотря на ваши подробные описания.

Vaska 07.01.2021 02:14

Цитата:

Сообщение от рони (Сообщение 532391)
Vaska,
... снова не осилил, не смотря на ваши подробные описания.

На скриншоте показал к чему привязать мои термины. Я и не говорил, что правильно называю элементы на странице html.

рони 07.01.2021 08:42

Vaska,
можно создать одну функцию для всех кнопок
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  li.active{
      background-color: #FFD700;
  }
  .tab{
      display: none;
  }
  .tab.active{
     display: block;
     height: 70px;
     border-radius: 24px;
     border: 4px solid #A9A9A9;
     padding: 4px;
  }
  ul{
      border: 1px solid #8B4513;
      list-style: none;
      height: 300px;
  }

  </style>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script>
$(function() {
var menu = $('.tab-lists');
var tabs = $('.tab');
menu.on('click', 'li', function(event) {
event.preventDefault();
var index = $(this).prevAll('li').length;
showTab(index);
})
function showTab(index)
{
  $('li', menu).removeClass('active').filter(`:nth-child(${index + 1})`).addClass('active');
  var tab = tabs.removeClass('active').eq(index).addClass('active');
  window.setTimeout(function() {
  $('html, body').stop().animate({scrollTop: tab.offset().top - 200}, 1000);
}, 200)

}
});
  </script>
</head>

<body>
<ul class="tab-lists">
		<li class="active">
			<div>
				<h3>title 1</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 2</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 3</h3>
			</div>
		</li>
</ul>



<div class="tab active">
		<div class="content bd" >
			<div class="dss-goods-info-content">
				Содержание вкладки 1
			</div>
		</div>
</div>
<div class="tab">
		<div class="content bd" >
			<div class="dss-goods-info-content">
				Содержание вкладки 2
			</div>
		</div>
</div>
<div class="tab">
		<div class="content bd" >
			<div class="dss-goods-info-content">
				Содержание вкладки 3
			</div>
		</div>
</div>
<ul class="tab-lists">
		<li class="active">
			<div>
				<h3>title 1</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 2</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 3</h3>
			</div>
		</li>
</ul>
<ul class="tab-lists">
		<li class="active">
			<div>
				<h3>title 1</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 2</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 3</h3>
			</div>
		</li>
</ul>
<ul class="tab-lists">
		<li class="active">
			<div>
				<h3>title 1</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 2</h3>
			</div>
		</li>
		<li>
			<div>
				<h3>title 3</h3>
			</div>
		</li>
</ul>

</body>
</html>

Vaska 07.01.2021 12:55

Применил. Всё отлично работает, всё как надо.

Я тут подумал над замечанием laimas, по поводу скачущего контента вверх, и прилипания табов к верхней части браузера, после нажатия на тайтл таба и соглашусь, что лучше сделать отступ от top на 100-200px вниз.
Поискал в интернете, но не нашел, что отвечает за эту функцию в моём коде и как это изменить.
Можете помочь с этим?

рони 07.01.2021 14:11

Цитата:

Сообщение от Vaska
что отвечает за эту функцию в моём коде

ничего, Действия браузера по умолчанию

Цитата:

Сообщение от Vaska
Можете помочь с этим?

на форуме сотни примеров сделать отступ от top на 100-200px вниз

искать scroll к

рони 07.01.2021 14:43

Цитата:

Сообщение от Vaska
сделать отступ от top на 100-200px вниз.

добавлено пост #17, 200 строка 43 изменить на нужное

Vaska 07.01.2021 18:17

Цитата:

Сообщение от рони (Сообщение 532401)
добавлено пост #17, 200 строка 43 изменить на нужное

Добавил, работает.
Однако как-то странно работает.
Первый тайтл таба отличается от ожидаемого результата при нажатии.
Если страницу прокрутить вверх и табы соприкоснутся с верхом браузера и нажать на первый тайтл таба, то от top отступ в 2 раза больше, чем указано в параметре. У других тайтлов таба и меню, реагирует одинаково и соответствует заданному параметру.
Если страница только загрузилась и нажать на первый тайтл таба, то ничего не происходит, а другие реагируют правильно, страница подтягивается вверх с указанным отступом в параметре.
Если страницу прокрутить немного вверх и снова нажать на первый тайтл таба, то страница уходит вниз а не на верх.
Снова нажать на первый тайтл таба - страница снова вниз продвигается. И так каждый раз при нажатии.

рони 07.01.2021 19:31

Vaska,
скопируйте код снова #17, если будут проблемы, строка 44 число 200 -- попробуйте изменить от 50 до 500

Vaska 07.01.2021 20:09

Цитата:

Сообщение от рони (Сообщение 532409)
Vaska,
скопируйте код снова #17, если будут проблемы, строка 44 число 200 -- попробуйте изменить от 50 до 500

Поменял, проблем нет никаких. Всё работает как надо.
Большое спасибо и уважение!

рони 07.01.2021 20:28

Vaska,
:victory:

Vaska 07.01.2021 20:46

Цитата:

Сообщение от рони (Сообщение 532409)
Vaska,
скопируйте код снова #17, если будут проблемы, строка 44 число 200 -- попробуйте изменить от 50 до 500

Одна проблема всё-таки есть.
На панели табов есть тайтл таба, называется: Пожаловаться на товар.
<li class="fr">
  <div class="tab-inner">
    <a href="javascript:login_dialog();" class="inform">Пожаловаться на товар</a>
  </div>
</li>

Эта ссылка вызывает диалоговое всплывающее окно, которое теперь стало открываться и сразу двигаться вверх, прокручивая страницу вниз. Довольно сильно прокручиват страницу вниз и диалоговое окно уходит под верхнюю часть браузера. На сколько оно туда уходит, зависит от параметра, который делает отступ от top. Чем больше отступ, тем дальше уходит всплывающее окно под верх браузера.

laimas 07.01.2021 20:57

Странно однако, так и осталось впечатление, что неудачная верстка заставляет иметь какой-то вычурный js-код. Почему "едет вверх", если есть это?

рони 07.01.2021 21:37

Vaska,
можно только гадать как устроена ваша страница, и что вы хотите сделать. возможно надо, что -то где-то исключить типа ...
menu.on('click', 'li:not(.fr)',

Vaska 07.01.2021 21:48

Цитата:

Сообщение от laimas (Сообщение 532415)
Странно однако, так и осталось впечатление, что неудачная верстка заставляет иметь какой-то вычурный js-код. Почему "едет вверх", если есть это?

Ну я стараюсь. Многого не знаю.
Цитата:

Сообщение от рони (Сообщение 532418)
Vaska,
можно только гадать как устроена ваша страница, и что вы хотите сделать. возможно надо, что -то где-то исключить типа ...
menu.on('click', 'li:not(.fr)',

Применил. Проблема решена. Спасибо!
Постараюсь всё запомнить.

Vaska 06.10.2021 16:39

рони,
можете помочь добавить код, чтобы можно было с другой страницы сайта, по ссылке https://site.com/Goods/index=141#dsGoods2 попасть на страницу того же сайта, на которой расположен таб id="tabGoods2" и его вкладка id="dsGoods2"?

Если я просто иду по ссылке https://site.com/Goods/index=141#dsGoods2, то открывается страница как обычно, на вкладку не переносит.

На странице, на которой есть табы и вкладки, есть ваш код, в том числе:
$('[href="#dsGoods2"]').click(() => $('#tabGoods2').click());

Но это не работает, если приходить по ссылке с другой страницы.

рони 06.10.2021 17:42

Vaska,
как вариант добавить следом
if(window.location.hash == '#dsGoods2') $('#tabGoods2').click();

Vaska 06.10.2021 19:44

Цитата:

Сообщение от рони (Сообщение 540561)
Vaska,
как вариант добавить следом
if(window.location.hash == '#dsGoods2') $('#tabGoods2').click();

Нет, не работает.

рони 06.10.2021 19:56

Vaska,
пока без вариантов ...

Vaska 08.10.2021 14:51

Цитата:

Сообщение от рони (Сообщение 540561)
Vaska,
как вариант добавить следом
if(window.location.hash == '#dsGoods2') $('#tabGoods2').click();

Ваш код замечательно работает, если добавить его после:
// Нажмите на таб2, чтобы скрыть другую вкладку и их строку заголовка.
	$('#tab2').click(function(){
		$('.bd').css('display','none');
		$('#dsGoods2').css('display','');
		$('.hd').css('display','none');
	});
if(window.location.hash == '#dsGoods2') $('#tabGoods2').click();


Большое спасибо!

рони 08.10.2021 15:12

Vaska,
:victory:


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