Предотвратить поведение по умолчанию для события 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;
        }
    });
}

Это не самое красивое решение. Я не уверен, почему это работает (я предполагаю, что это потому, что секции не имеют позиции в объекте окна, и, следовательно, не могут быть прокручены), но это работает на данный момент.

Другие вопросы по тегам