Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Открывать таб по ссылке на нужной вкладке (https://javascript.ru/forum/dom-window/75361-otkryvat-tab-po-ssylke-na-nuzhnojj-vkladke.html)

Igorsrt 28.09.2018 13:39

Открывать таб по ссылке на нужной вкладке
 
Здравствуйте! Есть сайт, сделанный на каком-то хитроумном конструкторе (Webflow) с огромным файлом скриптов. Разбираться со всеми этими скриптами нет ни желания, ни, тем более, умения - все работает, ну и ладно...
Суть проблемы в следующем:
На одной из страниц, есть таб, который переключается путем добавления класса "w--current" в заголовки табов. Выглядит это примерно так:
<div class="tabs w-tabs">
	<div class="tabs-menu w-tab-menu">
		<a id="tab1" data-w-tab="Tab 1" class="tab_link w--current">Заголовок 1</a>
		<a id="tab2" data-w-tab="Tab 2" class="tab_link">Заголовок 2</a>
		<a id="tab3" data-w-tab="Tab 3" class="tab_link">Заголовок 3</a>
	</div>
	<div class="tabs-content w-tab-content">
		<div data-w-tab="Tab 1" class="w-tab-pane w--tab-active">
			<div class="tab_wrap">
				Вкладка 1				
			</div>
		</div>	
		<div data-w-tab="Tab 2" class="w-tab-pane">
			<div class="tab_wrap">
				Вкладка 2
			</div>
		</div>
		<div data-w-tab="Tab 3" class="w-tab-pane">
			<div class="tab_wrap">
				Вкладка 2
			</div>
		</div>
	</div>
</div>

Мне нужно на другой странице сделать ссылки на эту страницу с табами, таким образом, что бы открывался нужный таб, т.е. получается как-то через ссылку передавать какому блоку присваивать класс "w--current"... Воможно ли это?

SuperZen 28.09.2018 13:55

<a href="topagewithtabs.html#tab1">tab1link</a>
<a href="topagewithtabs.html#tab2">tab2link</a>
<a href="topagewithtabs.html#tab3">tab3link</a>

потом, при открытии страницы с табами

<script>
    var hash = location.hash.substr(1);
    hash && document.getElementById(hash).classList.add('w-current')
</script>

Igorsrt 28.09.2018 14:24

Цитата:

Сообщение от SuperZen (Сообщение 495528)
<a href="topagewithtabs.html#tab1">tab1link</a>
<a href="topagewithtabs.html#tab2">tab2link</a>
<a href="topagewithtabs.html#tab3">tab3link</a>

потом, при открытии страницы с табами

<script>
    var hash = location.hash.substr(1);
    hash && document.getElementById(hash).classList.add('w-current')
</script>

да, спасибо, вроде бы срабатывает :)
А можно сделать, что бы якорь (#tab2) не отображался в конце url в адресной строке?

SuperZen 28.09.2018 14:49

сменить location без перезагрузки страницы
https://stackoverflow.com/questions/...ading-the-page

Igorsrt 28.09.2018 14:59

Цитата:

Сообщение от SuperZen (Сообщение 495531)
сменить location без перезагрузки страницы
https://stackoverflow.com/questions/...ading-the-page

ну это сложновато для моего понимания (

рони 28.09.2018 15:02

SuperZen,
а если так?
<script>
    var hash = location.hash;
    hash && document.querySelector(hash).classList.add('w-current')
</script>

SuperZen 28.09.2018 15:24

document.addEventListener('DOMContentLoaded', function () {
      var hash = location.hash.substr(1);
      hash && document.getElementById(hash).classList.add('w-current')
      history.replaceState(null, null, window.location.href.replace(/#.*$/, ''));//replace state
    })


это будет работать только если перейти с другой страницы, и если браузер поддерживает HTML5

рони 28.09.2018 15:27

hash remove
 
Цитата:

Сообщение от Igorsrt
сложновато

:(
<script>
    var hash = location.hash;
    if(hash){
      document.querySelector(hash).classList.add('w-current');
      history.replaceState({}, document.title, location.href.replace(hash, ''));
    }
</script>

SuperZen 28.09.2018 15:31

юзай пример рони )

Igorsrt 28.09.2018 15:37

Цитата:

Сообщение от рони (Сообщение 495535)
:(
<script>
    var hash = location.hash;
    if(hash){
      document.querySelector(hash).classList.add('w-current')
      history.replaceState({}, document.title, location.href.replace(hash, ''));
    }
</script>

нет, вот так не работает у меня... (якорь в ссылке пропадает, но и таб не переключается) :(

Igorsrt 28.09.2018 15:41

Цитата:

Сообщение от рони (Сообщение 495533)
SuperZen,
а если так?
<script>
    var hash = location.hash;
    hash && document.querySelector(hash).classList.add('w-current')
</script>

а в чем разница с прошлым примером? вроде все тоже самое: табы переключаются, якорь в адресной строке продолжает отображаться... ;)

рони 28.09.2018 15:41

Igorsrt,
скрипт вниз страницы

SuperZen 28.09.2018 15:42

перед if(hash) посмотри что в hash? если там нет первым символом #, тогда замени на document.querySelector('#' + hash)....

SuperZen 28.09.2018 15:44

не тот сниппет скопировал походу, тут три строки
history.replaceState... еще добавилось
document.addEventListener('DOMContentLoaded', function () {
      var hash = location.hash.substr(1);
      hash && document.getElementById(hash).classList.add('w-current')
      history.replaceState(null, null, window.location.href.replace(/#.*$/, ''));//replace state
    })

Igorsrt 28.09.2018 15:47

Цитата:

Сообщение от рони (Сообщение 495539)
Igorsrt,
скрипт вниз страницы

так он внизу, на той странице где табы... правда jQuery ассинхронно подгружается - это может влиять?

рони 28.09.2018 16:00

Igorsrt,
пост №14 SuperZen, проверьте, и что консоль то писала?

Igorsrt 28.09.2018 16:00

Цитата:

Сообщение от SuperZen (Сообщение 495542)
не тот сниппет скопировал походу, тут три строки
history.replaceState... еще добавилось
document.addEventListener('DOMContentLoaded', function () {
      var hash = location.hash.substr(1);
      hash && document.getElementById(hash).classList.add('w-current')
      history.replaceState(null, null, window.location.href.replace(/#.*$/, ''));//replace state
    })

вот так заработало, спасибо еще раз... якорь на секунду отображается в адресной строке, потом пропадает...
Интересно, а в чем заключался вариант Рони - у него всегда классные решения (жалко что у меня сейчас не сработало)

SuperZen 28.09.2018 16:08

отличается тем, что var hash = location.hash возвращает hash без символа #, и потом запускается поиск элемента, но поскольку не указали что ищем элемент по id (в querySelector, как и jQ - надо явно указывать, что id это #, class это .), то поиск не находил элемент с id, например, tab1

рони 28.09.2018 16:11

Цитата:

Сообщение от Igorsrt
вот так заработало

тогда вот так и в самый верх
var hash = location.hash.substr(1);
history.replaceState(null, null, window.location.href.replace(/#.*$/, ''));
document.addEventListener('DOMContentLoaded', function () {
       hash && document.getElementById(hash).classList.add('w-current')
         })

рони 28.09.2018 16:13

Цитата:

Сообщение от SuperZen
отличается тем, что var hash = location.hash возвращает hash без символа #,

почему без #?

рони 28.09.2018 16:20

Цитата:

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

Цитата:

Сообщение от Igorsrt
нет, вот так не работает у меня... (якорь в ссылке пропадает, но и таб не переключается)

одно с другим не совпадает, может скопировали неудачно.

SuperZen 28.09.2018 16:25

я сам сверху писал )
var hash = location.hash.substr(1);


Цитата:

Сообщение от рони (Сообщение 495549)
почему без #?

) действительно, что это я

ладно, вроде бы забороли )

Igorsrt 29.09.2018 08:10

блин, тут еще один момент:
изначально класс "w--current" стоял на первом заголовке в самом html, после наших (ваших :) ) доработок я его убрал (т.к. скрипт по другому не работал)... теперь если просто зайти на страницу с табами (не по ссылке), то активный заголовок никак не выделяется визуально(т.к. нет у него css класса).
Получается нужно этот класс вернуть по умолчанию в разметку html и добавить в скрипт, что бы он его удалял при срабатывании
<script type="text/javascript">
    document.addEventListener('DOMContentLoaded', function () {
      var hash = location.hash.substr(1);
      hash && document.getElementById(hash).classList.add('w--current')
      history.replaceState(null, null, window.location.href.replace(/#.*$/, ''));//replace state
    })

</script>

думал, сам смогу, вставив в скрипт "$('#one').removeClass('w--current');" - но так он этот класс всегда удаляет (даже при переходе по обычной ссылке из меню)... нужно какое-то условие прописать

Igorsrt 29.09.2018 08:37

вот так вот сделал
<script type="text/javascript">
    document.addEventListener('DOMContentLoaded', function () {

      var hash = location.hash.substr(1);
	  if(hash){ $('#one').removeClass('w--current');}
      hash && document.getElementById(hash).classList.add('w--current')
      history.replaceState(null, null, window.location.href.replace(/#.*$/, ''));//replace state
    })

</script>

но, не уверен что это правильно )


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