У нас есть несколько страниц, использующих ajax для загрузки контента, и есть несколько случаев, когда нам нужна глубокая ссылка на страницу. Вместо того, чтобы ссылаться на «Пользователи» и предлагать людям нажимать «Настройки», полезно иметь возможность связывать людей с настройками user.aspx #.
Чтобы люди могли предоставить нам правильные ссылки на разделы (для технической поддержки и т. Д.), Я настроил автоматическое изменение хэша в URL-адресе при каждом нажатии кнопки. Конечно, единственная проблема заключается в том, что когда это происходит, он также прокручивает страницу до этого элемента.
Есть ли способ отключить это? Ниже я пока делаю это.
$(function(){
//This emulates a click on the correct button on page load
if(document.location.hash){
$("#buttons li a").removeClass('selected');
s=$(document.location.hash).addClass('selected').attr("href").replace("javascript:","");
eval(s);
}
//Click a button to change the hash
$("#buttons li a").click(function(){
$("#buttons li a").removeClass('selected');
$(this).addClass('selected');
document.location.hash=$(this).attr("id")
//return false;
});
});
Я надеялся, что return false;
это остановит прокрутку страницы - но это просто делает ссылку вообще неработающей. Так что это только что закомментировано, чтобы я мог ориентироваться.
Любые идеи?
Используйте
history.replaceState
илиhistory.pushState
*, чтобы изменить хэш. Это не вызовет переход к связанному элементу.пример
Демо на JSFiddle
* Если вы хотите историю вперед и назад поддержку
История поведения
Если вы используете
history.pushState
и не хотите прокручивать страницу, когда пользователь использует кнопки истории браузера (вперед / назад), проверьте экспериментальныеscrollRestoration
настройки (только Chrome 46+) .Поддержка браузера
источник
replaceState
это, вероятно, лучший способ пойти сюда. Разница заключается в том, чтоpushState
добавляет элемент в вашу историю, аreplaceState
нет.body
что свитки, иногда этоdocumentElement
. Смотрите эту суть Диего ПериниЯ думаю, что, возможно, нашел довольно простое решение. Проблема заключается в том, что хэш в URL-адресе также является элементом страницы, на которую вы переходите. если я просто добавлю некоторый текст к хешу, теперь он больше не ссылается на существующий элемент!
Теперь URL отображается как
page.aspx#btn_elementID
не настоящий идентификатор на странице. Я просто удаляю "btn_" и получаю фактический идентификатор элементаисточник
/
логическим представлением.Фрагмент вашего исходного кода:
Измените это на:
источник
hash
свойства все равно приведет к прокрутке страницы.Недавно я строил карусель, которая
window.location.hash
поддерживает состояние и обнаружил, что браузеры Chrome и webkit будут вынуждены прокручивать (даже невидимую цель) с неловким рывком при запускеwindow.onhashchange
события.Даже пытаясь зарегистрировать обработчик, который останавливает распространение:
Ничего не сделал, чтобы остановить поведение браузера по умолчанию. Решение, которое я нашел, использовало
window.history.pushState
изменение хэша, не вызывая нежелательных побочных эффектов.Затем вы можете прослушивать как обычное событие hashchange, так и
my.hashchange
:источник
my.hashchange
это просто пример имени событияЛадно, это довольно старая тема, но я подумал, что скину, поскольку «правильный» ответ не работает с CSS.
Это решение в основном предотвращает перемещение страницы по событию click, поэтому мы можем сначала получить позицию прокрутки. Затем мы вручную добавляем хэш, и браузер автоматически запускает событие hashchange . Мы фиксируем событие hashchange и возвращаемся к правильной позиции. Обратный вызов отделяет и предотвращает задержку вашего кода, сохраняя хэш-хак в одном месте.
источник
У меня немного грубоватый, но определенно рабочий метод.
Просто сохраните текущую позицию прокрутки во временной переменной, а затем сбросьте ее после изменения хеша. :)
Итак, для оригинального примера:
источник
Я не думаю, что это возможно. Насколько я знаю, единственный раз, когда браузер не прокручивает изменения,
document.location.hash
это если хеш не существует на странице.Эта статья не имеет прямого отношения к вашему вопросу, но в ней обсуждается типичное поведение браузера при изменении
document.location.hash
источник
если вы используете событие hashchange с анализатором хеша, вы можете предотвратить действие по умолчанию для ссылок и изменить местоположение. hash добавив один символ, чтобы иметь различие со свойством id элемента
источник
Добавление этого здесь, потому что все более важные вопросы были отмечены как дубликаты, указывающие здесь ...
Моя ситуация проще:
a[href='#something']
)e.preventDefault()
$("html,body").stop(true,true).animate({ "scrollTop": linkoffset.top }, scrollspeed, "swing" );
window.location = link;
Таким образом, происходит прокрутка, и при обновлении местоположения прыжка не происходит.
источник
Другой способ сделать это - добавить div, который скрыт в верхней части области просмотра. Затем этому div присваивается идентификатор хеша до того, как хеш добавляется в URL .... так что вы не получите прокрутку.
источник
Вот мое решение для вкладок с историей:
И чтобы показать последнюю выбранную вкладку:
Обратите внимание
*=
наfilter
вызов. Это специфичная для jQuery вещь, и без нее ваши вкладки с историей не будут работать.источник
Это решение создает div для фактического scrollTop и удаляет его после изменения хеша:
необязательно, вызывая событие привязки при загрузке страницы:
источник
У меня есть более простой метод, который работает для меня. В основном, помните, что на самом деле хэш в HTML. Это якорная ссылка на тег имени. Вот почему он прокручивает ... браузер пытается прокрутить до ссылки привязки. Итак, дайте это один!
Назовите ваш раздел div с классами вместо идентификаторов.
В коде обработки удалите хэш-метку и замените ее точкой:
Наконец, удалите element.preventDefault или return: false и разрешите навигацию. Окно останется наверху, хеш будет добавлен к URL адресной строки, и откроется правильная панель.
источник
Я думаю, что вам нужно сбросить прокрутку до ее позиции перед заменой.
источник
Если на вашей странице вы используете id как своего рода точку привязки, и у вас есть сценарии, в которых вы хотите, чтобы пользователи добавляли #something в конец URL-адреса и прокручивали страницу до этого раздела #something, используя свой собственный определенный анимированный Функция javascript, слушатель события hashchange не сможет это сделать.
Если вы просто поместите отладчик сразу после события hashchange, например, что-то вроде этого (ну, я использую jquery, но вы поняли):
Вы заметите, что как только вы измените свой URL и нажмете кнопку ввода, страница сразу остановится на соответствующем разделе, только после этого будет запущена ваша собственная определенная функция прокрутки, и она будет прокручиваться в тот раздел, который выглядит очень плохо.
Мое предложение:
не используйте id в качестве точки привязки к разделу, к которому вы хотите перейти.
Если вы должны использовать ID, как я. Вместо этого используйте прослушиватель события «popstate», он не будет автоматически прокручиваться до того самого раздела, который вы добавляете к URL, вместо этого вы можете вызывать свою собственную определенную функцию внутри события popstate.
$(window).on('popstate', function(){myscrollfunction()});
Наконец, вам нужно сделать немного хитрости в вашей собственной определенной функции прокрутки:
удалить идентификатор в вашем теге и сбросить его.
Это должно сделать свое дело.
источник
Добавляйте этот код в jQuery только для документов, готовых
Ссылка: http://css-tricks.com/snippets/jquery/smooth-scrolling/
источник