У меня есть скользящая панель на моем сайте.
Когда он закончил анимацию, я установил хеш так
function() {
window.location.hash = id;
}
(это обратный вызов, и id
он назначается ранее).
Это хорошо работает, чтобы позволить пользователю добавить закладку на панель, а также для работы без версии JavaScript.
Однако, когда я обновляю хеш, браузер переходит на место. Я предполагаю, что это ожидаемое поведение.
Мой вопрос: как я могу предотвратить это? Т.е. как я могу изменить хеш окна, но не прокручивать браузер до элемента, если хеш существует? Что-то в этом event.preventDefault()
роде?
Я использую jQuery 1.4 и плагин scrollTo .
Большое спасибо!
Обновить
Вот код, который меняет панель.
$('#something a').click(function(event) {
event.preventDefault();
var link = $(this);
var id = link[0].hash;
$('#slider').scrollTo(id, 800, {
onAfter: function() {
link.parents('li').siblings().removeClass('active');
link.parent().addClass('active');
window.location.hash = id;
}
});
});
javascript
jquery
hash
scrollto
Алекс
источник
источник
event.preventDefault()
:)Ответы:
Существует обходной путь с использованием API истории в современных браузерах с резервным вариантом на старых:
Кредит идет к Леа Веру
источник
history.replaceState
(что для изменений хеша может иметь больше смысла), чтобы избежать необходимости вpopstate
прослушивателе событий.hashchange
событие. Это было то, что я должен был обойти.hashchange
событиеПроблема в том, что вы устанавливаете window.location.hash для атрибута ID элемента. Предполагается, что браузер будет переходить к этому элементу независимо от того, используете ли вы «protectDefault ()» или нет.
Одним из способов обойти это является добавление к хешу произвольного значения, например:
Затем все, что вам нужно сделать, это проверить хэш с префиксом при загрузке страницы. В качестве дополнительного бонуса вы можете даже плавно прокрутить его, так как теперь вы контролируете значение хэша ...
Если вам нужно, чтобы это работало постоянно (а не только при начальной загрузке страницы), вы можете использовать функцию для отслеживания изменений в значении хеш-кода и быстрого перехода к нужному элементу:
источник
Дешевое и неприятное решение .. Используйте # уродливый! стиль.
Чтобы установить это:
Чтобы прочитать это:
Так как он не совпадает с привязкой или идентификатором на странице, он не будет прыгать.
источник
window.location.hash = '#/' + id;
и затем заменив его на:window.location.hash.replace(/^#\//, '#');
немного прертируем URL ->projects/#/tab1
Почему бы вам не получить текущую позицию прокрутки, поместить ее в переменную, затем назначить хэш и вернуть прокрутку страницы туда, где она была:
это должно работать
источник
Я использовал комбинацию решения Attila Fulop (Lea Verou) для современных браузеров и решения Gavin Brock для старых браузеров следующим образом:
Как заметил Гэвин Брок, для получения идентификатора вам нужно будет обработать строку (которая в этом случае может иметь или не иметь «!») Следующим образом:
До этого я пробовал решение, подобное предложенному пользователем 706270, но оно не работало с Internet Explorer: поскольку его движок Javascript не очень быстрый, вы можете заметить увеличение и уменьшение прокрутки, что приводит к неприятному визуальному эффекту.
источник
Это решение сработало для меня.
Проблема с настройкой
location.hash
заключается в том, что страница перейдет к этому идентификатору, если он найден на странице.Проблема в
window.history.pushState
том, что он добавляет запись в историю для каждой вкладки, которую нажимает пользователь. Затем, когда пользователь нажимаетback
кнопку, они переходят на предыдущую вкладку. (это может или не может быть то, что вы хотите. это было не то, что я хотел).Для меня
replaceState
лучшим вариантом было то, что он заменяет только текущую историю, поэтому, когда пользователь нажимаетback
кнопку, он переходит на предыдущую страницу.Ознакомьтесь с документацией по истории API на MDN.
источник
Я не уверен, что вы можете изменить исходный элемент, но как насчет переключения с использования идентификатора attr на что-то другое, например data-id? Затем просто прочитайте значение data-id для вашего хеш-значения, и оно не будет прыгать.
источник
Это решение сработало для меня
И мой полный код JS
источник
При использовании фреймворка laravel у меня были некоторые проблемы с использованием функции route-> back (), так как она стерла мой хэш. Чтобы сохранить мой хэш, я создал простую функцию:
и я установил это в моей другой функции JS следующим образом:
Вы можете назвать ваши значения локального хранилища так, как вам нравится; шахта им
hash
.Поэтому, если хэш установлен на PAGE1, а затем вы переходите к PAGE2; хеш будет воссоздан на PAGE1, когда вы нажмете Back на PAGE2.
источник