@choupa
Архитектор (обычный, который строит)

Как подавить переход к #якорю, указанному в URL?

На странице есть якоря <a name=...>. Они используются как при навигации внутри страницы, так и для внешний переходах сразу к нужному месту.

Проблема: При переходе на URL с указанным якорем, страница сразу (onready) отматывается до якоря. Однако вёрстка самой страницы производится скриптом: вычисляются и растаскиваются высоты, ширины, положения элементов. Поэтому когда всё устаканивается, якорь оказывается совсем не там, куда нас вначале перебросил браузер.

Сам я вижу такие варианты решения:

1. Как-то подавить переход на якорь изначально. А потом, когда страница полностью сформировалась, самому (скриптом, разумеется) проскроллить до нужного места, прочитав #имя из URL. Со второй часть проблем нет, но как подавить переход?

2. Заменить якоря на свои нестандартные. Например вместо <a name=...> изначально грузить HTML с тэгом вида <a my_anchor_name=...>. Когда вёрстка устаканивается подменять их на нормальные <a name=...> и как в п. 1 скроллить к ним самому.

Но мне кажется, это должна быть стандартная ситуация, с которой многие сталкивались. Решается ли она как-то просто без моих "велосипедов"?
  • Вопрос задан
  • 614 просмотров
Пригласить эксперта
Ответы на вопрос 3
Eridani
@Eridani
Мимо проходил
Представить, что у Вас творится в проекте, мне не удалось, но вероятнее всего Вам стоит смотреть в сторону e.preventDefault();
Ответ написан
Krasnodar_etc
@Krasnodar_etc
avito front
Не строить вёрстку скриптом))

Только костыльные решения. Например, заменить тэг a на <div data-href="id_name"> ... . Естественно, скролл делать скриптом.
Подменять урл через history api . (это самая некрасивая часть)

При загрузке страницы парсить урл и скроллить куда надо
Ответ написан
@choupa Автор вопроса
Архитектор (обычный, который строит)
Вот так сделал, получилось довольно несложно:

В HTML загружаются такие якоря

<a anchor="tag"/>

$(document).on('load', function()	{

	// Заменить якоря с условных на нормальные
	$('a[anchor]').each( function()	{
		var tag = $(this).attr('anchor');
		$(this).attr('name', tag).removeAttr('anchor');
	});

	// Проскроллить до якоря
	var tag = document.location.href.split('#')[1];
	var pos = $('a[name='+tag+']').offset().top;

})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы