Предотвратить поведение по умолчанию для события hashchange
Я использую jQuery $(window).on('hashchange')
метод, чтобы скрыть нерелевантные разделы, за исключением того, на который указывает хеш URI. Работает красиво, кнопка назад и все. За исключением того факта, что я не могу предотвратить поведение браузеров по умолчанию, то есть прокрутить вниз до раздела с соответствующим id
,
Вот моя функция.
var AddHashNav = function (hashmatch, container) {
$(window).on('hashchange', function (e) {
if ( !window.location.hash ) {
// empty hash, show only the default header
change_preview(container, container + ' > header');
return false;
}
// Don't do anything to hash links who's ids don't match
else if ( window.location.hash.match(hashmatch) ) {
change_preview(container, window.location.hash);
return false;
}
});
}
var changePreview = function (container, preview) {
$(container + ' >').addClass('hidden');
$(preview).removeClass('hidden');
}
А звонящий просто
$(document).ready(function () {
// applay AddHashNav to all sections who's id ends in 'preview'
AddHashNav(/preview?/, '.hash-nav-container');
});
Я пробовал оба e.preventDefault();
а также return false;
и ни один, кажется, не работает.
Обратите внимание, что я пытаюсь предотвратить поведение hashChange
событие, а не click
Событие, здесь это кажется невозможным, но я уверен, что по крайней мере кто-то сумел выяснить, как это сделать.
1 ответ
Я исправил это, запустив change_preview()
по первому зову AddHashNav
конструктор, и, следовательно, скрывая разделы на $(document).load()
вызов.
var AddHashNav = function (hashmatch, container) {
// hide all sections except header on load
change_preview()
$(window).on('hashchange', function (e) {
if ( !window.location.hash ) {
// empty hash, show only the default header
change_preview(container, container + ' > header');
return false;
}
// Don't do anything to hash links who's ids don't match
else if ( window.location.hash.match(hashmatch) ) {
change_preview(container, window.location.hash);
return false;
}
});
}
Это не самое красивое решение. Я не уверен, почему это работает (я предполагаю, что это потому, что секции не имеют позиции в объекте окна, и, следовательно, не могут быть прокручены), но это работает на данный момент.