Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перехват перехода по якорю (https://javascript.ru/forum/jquery/16328-perekhvat-perekhoda-po-yakoryu.html)

InviS 04.04.2011 09:40

Перехват перехода по якорю
 
Подскажите, пожалуйста, можно ли как-то перехватить переход по якорю? К примеру, если у меня есть ссылка:
index.php#part1, то по нажатию на ней мы сразу опустимся к id='part1'. Можно ли как-то перехватить и отменить переход по якорю или же сделать какие-то действия, а уже потом переходить к якорю на странице..?

walik 04.04.2011 10:09

<a href="#part1" onclick="myFunc();">Click</a>

Так будет выполнена функция myFunc и потом будет переход по якорю.

<a href="#part1" onclick="myFunc(); return false;">Click</a>

Так будет выполнена функция myFunc, а перехода по якорю не будет.

InviS 04.04.2011 14:16

Внутри страницы у меня и так все прекрасно работало... Я имел в виду перехват перехода по якорю на вновь загруженной странице. К примеру, если я перейду по ссылке:
index.php#part1 из документа help.php к примеру... т.е. я загрузил документ и браузер меня поставил на нужное место сразу же.. а я хочу сделать переход плавным.. как мне отменить стандартный браузеровский эффект перебрасывания?

Skipp 04.04.2011 14:34

я думаю вам придётся копать от события scroll.

Matre 04.04.2011 14:42

(function ($) {
	$.fn.preventJump = function (time) {
		return this.click(function (event) {
			$("body").animate({
				scrollTop : $("#" + this.href.split("#")[1]).offset().top
			}, time || 500);
			event.preventDefault();
		});
	};
})(jQuery);

$("a.test").preventJump(300);


<a href='#test' class='test'>
	Тест
</a>

...

<div id='test'>
	Сюда
</div>

Skipp 04.04.2011 14:47

Matre,
Это по моему не то, что просили:)
и это "#" + this.href.split("#")[1] , по моему можно переписать так: location.hash

InviS 04.04.2011 15:11

Matre,
Все это я уже реализовал.. меня интересует именно перехват при переходе на новую страницу. Возможно ли вообще перехватить это событие?!
Skipp,
Попробую поискать на англ. форумах относительнос scroll.. но сомневаюсь, что получится найти =) Хотя, может возможностями чистого js можно как-то отменить переход по якорю

Serg_pnz 04.04.2011 15:23

Я делал не скролл к якорю, а скролл к элементу с id
пример http://yphp.jcase.ru/#scrollto=newsz

Magneto 04.04.2011 19:19

А ларчик то просто открывается.

if (window.location.hash) {alert("Событие")}


Ссылка без я коря
Ссылка с якорем

InviS 05.04.2011 22:01

Serg_pnz,
У вас было что-то похожее на то, что мне нужно... Подмена hash? или как это вообще сделано? там мутулз и непонятно в каком файле искать ответ...
Magneto,
Ничего не понял... Вывести алерт по признаку хэша - не сложно. Как отменить действие браузера - перекидывание в эту точку - вот, что мне интересно....

dmitriymar 05.04.2011 22:28

InviS,
интересно аж не могу....
если тебя не профи посылали за подобные мысли-это я о контакте,
то ты решил что для профи всё возможно?
повторю здесь то что говорил тебе не один раз там-учи основы-хоть одну книжку прочти!!!

InviS 05.04.2011 23:36

Спасибо, разобрался! Нужно было просто очищать window.location.hash

dmitriymar, не Вам меня учить, как жить, понятно?! Я учу то, что считаю нужным. Если вы такой умный, то чего не можете новичку помочь разобраться со всем? Если не хотите помогать - не пишите вообще! Зачем пытаться кого-то чему-то научить. Может я вообще php разработчик и этот javascript мне до одного места, откуда вам знать.

dmitriymar 05.04.2011 23:51

InviS,
Цитата:

Сообщение от InviS
и этот javascript мне до одного места,

судя по твоим постам в контакте и в рнр ты такойже дуб как и в скрипте

Serg_pnz 06.04.2011 10:22

base.js - этот файл плюс событие в html:

Смотрим на hash, а потом его сбрасываем.

шаг 1. готовим информацию
var query = window.location.hash.substring(1);  
var vars = query.split('#');
var arrforget = new Array(); 
for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split('=');
       arrforget[pair[0]] = pair[1];
  }


шаг 2. скролим, если есть hash и объект с id
function FOnLoad() {
// = = = = подготовка скрола
		var scroll2 = new Fx.Scroll(this, {
			wait: false,
			duration: 1500,
			transition: Fx.Transitions.Quad.easeInOut
		});
if ($defined(arrforget['scrollto']))
{
	if ($defined($(arrforget['scrollto'])))
		{
			scroll2.toElement(arrforget['scrollto']);
			location.hash = ''
		}
}


Ну и собственно сам вызов
<body id="bodyg" onLoad="FOnLoad();">

x-yuri 07.04.2011 06:39

Цитата:

Сообщение от InviS
Может я вообще php разработчик и этот javascript мне до одного места, откуда вам знать.

тогда обратись к специалисту и оплати его работу

самое печальное, что смысла во всех этих отменах скорее всего нету. Только пользователям мешать будет

Proxytel 31.07.2011 21:07

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

milov 27.10.2013 14:59

просто очистить window.location.hash работает во всех браузерах. кроме firefox. странно конечно, может и его можно победить?

Deff 27.10.2013 15:20

milov,
window.location.replace(document.URL.split('#')[0])

maxSLON 18.01.2014 11:49

Все это мелочи жизни. Тему можно закрыть:)
P.S. "Изучайте основы алгоритмизации и математику. Язык это мелочи жизни."

Finesse 04.03.2014 12:39

Перехват клика по ссыке сделать не проблема. А как сделать перехват перехода при открытии страницы, то есть если на страницу перешли сразу по ссылке с якорем (index.html#label)?

danik.js 04.03.2014 12:45

Finesse, проверяй location.hash - это же элементарно.

Finesse 04.03.2014 12:56

Цитата:

Сообщение от Deff (Сообщение 278311)
milov,
window.location.replace(document.URL.split('#')[0])

Происходит переход на эту же страницу, но без якоря. Решения для Firefox пока нет.

Finesse 04.03.2014 12:58

Цитата:

Сообщение от danik.js (Сообщение 300883)
Finesse, проверяй location.hash - это же элементарно.

Я имел ввиду как отменить переход по якорю. Я уже нашёл, что надо написать
location.hash = "";
, но это не работает в Firefox.

danik.js 04.03.2014 13:11

Цитата:

Сообщение от Finesse
как отменить переход по якорю

Переход уже произошел. Поздно его отменять. Ты же сам пишешь:
Цитата:

Сообщение от Finesse
то есть если на страницу перешли сразу по ссылке с якорем (index.html#label)


CrazyPHP 02.07.2014 17:00

Мня тоже заинтересовала эта тема, как я и подозревал ответ удалось найти на зарубежных ресурсах, на них почему-то всегда отвечают по делу и без издёвок типо: "иди книжки почитай, червь".

Можно перехватить scroll событие сразу же после загрузки страницы но его нельзя отменить, однако можно сразу после загрузки выполнить новый scroll с любыми эффектами и в нужное место, в том числе и scroll к 0, т.е. как бы отменить скроллинг.

setTimeout(function() {
            if (window.location.hash) {               
                var hash = window.location.hash.substr(1);   
                var scrollPos = $('a[name="'+hash+'"]').offset().top; 
                $("html, body").animate({ scrollTop: scrollPos }, 1000);    
            }
        }, 1);

milov 11.07.2014 00:02

CrazyPHP,
спасибо.


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