Перехват перехода по якорю
Подскажите, пожалуйста, можно ли как-то перехватить переход по якорю? К примеру, если у меня есть ссылка:
index.php#part1, то по нажатию на ней мы сразу опустимся к id='part1'. Можно ли как-то перехватить и отменить переход по якорю или же сделать какие-то действия, а уже потом переходить к якорю на странице..? |
<a href="#part1" onclick="myFunc();">Click</a> Так будет выполнена функция myFunc и потом будет переход по якорю. <a href="#part1" onclick="myFunc(); return false;">Click</a> Так будет выполнена функция myFunc, а перехода по якорю не будет. |
Внутри страницы у меня и так все прекрасно работало... Я имел в виду перехват перехода по якорю на вновь загруженной странице. К примеру, если я перейду по ссылке:
index.php#part1 из документа help.php к примеру... т.е. я загрузил документ и браузер меня поставил на нужное место сразу же.. а я хочу сделать переход плавным.. как мне отменить стандартный браузеровский эффект перебрасывания? |
я думаю вам придётся копать от события scroll.
|
(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> |
Matre,
Это по моему не то, что просили:) и это "#" + this.href.split("#")[1] , по моему можно переписать так: location.hash |
Matre,
Все это я уже реализовал.. меня интересует именно перехват при переходе на новую страницу. Возможно ли вообще перехватить это событие?! Skipp, Попробую поискать на англ. форумах относительнос scroll.. но сомневаюсь, что получится найти =) Хотя, может возможностями чистого js можно как-то отменить переход по якорю |
Я делал не скролл к якорю, а скролл к элементу с id
пример http://yphp.jcase.ru/#scrollto=newsz |
А ларчик то просто открывается.
if (window.location.hash) {alert("Событие")} Ссылка без я коря Ссылка с якорем |
Serg_pnz,
У вас было что-то похожее на то, что мне нужно... Подмена hash? или как это вообще сделано? там мутулз и непонятно в каком файле искать ответ... Magneto, Ничего не понял... Вывести алерт по признаку хэша - не сложно. Как отменить действие браузера - перекидывание в эту точку - вот, что мне интересно.... |
InviS,
интересно аж не могу.... если тебя не профи посылали за подобные мысли-это я о контакте, то ты решил что для профи всё возможно? повторю здесь то что говорил тебе не один раз там-учи основы-хоть одну книжку прочти!!! |
Спасибо, разобрался! Нужно было просто очищать window.location.hash
dmitriymar, не Вам меня учить, как жить, понятно?! Я учу то, что считаю нужным. Если вы такой умный, то чего не можете новичку помочь разобраться со всем? Если не хотите помогать - не пишите вообще! Зачем пытаться кого-то чему-то научить. Может я вообще php разработчик и этот javascript мне до одного места, откуда вам знать. |
InviS,
Цитата:
|
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();"> |
Цитата:
самое печальное, что смысла во всех этих отменах скорее всего нету. Только пользователям мешать будет |
Было бы круто добавить к такому скрипту переходя по якорю прелоадер страницы, который бы сначала затенял слоем бекграйнд страницы, ждал её полную загрузку и плавно исчезал на момент скролинга. Это улучшает визуализацию, если якорь ведёт на другую страницу, а не на текущую..
|
просто очистить window.location.hash работает во всех браузерах. кроме firefox. странно конечно, может и его можно победить?
|
milov,
window.location.replace(document.URL.split('#')[0]) |
Все это мелочи жизни. Тему можно закрыть:)
P.S. "Изучайте основы алгоритмизации и математику. Язык это мелочи жизни." |
Перехват клика по ссыке сделать не проблема. А как сделать перехват перехода при открытии страницы, то есть если на страницу перешли сразу по ссылке с якорем (index.html#label)?
|
Finesse, проверяй location.hash - это же элементарно.
|
Цитата:
|
Цитата:
location.hash = "";, но это не работает в Firefox. |
Цитата:
Цитата:
|
Мня тоже заинтересовала эта тема, как я и подозревал ответ удалось найти на зарубежных ресурсах, на них почему-то всегда отвечают по делу и без издёвок типо: "иди книжки почитай, червь".
Можно перехватить 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); |
CrazyPHP,
спасибо. |
Часовой пояс GMT +3, время: 21:50. |