Управление поведением браузера после изменения фрагмента URL

0

Я застрял на этом несколько часов и не могу найти проблему. У меня также есть проблемы с описанием проблемы, так как я не совсем уверен, где проблема на самом деле. Я искал весь стек stackoverflow и другие сайты, чтобы найти решение, но до сих пор я этого не делал..

Я пытаюсь создать скроллер на одну страницу, используя jQuery. Моя проблема в основном сводится к этому. Всякий раз, когда я просматриваю свою страницу и манипулирую фрагментом URL, введя адресную строку в идентификатор другого элемента на моей странице, он переходит к элементу с идентификатором. Но поскольку я использую фиксированную навигационную панель поверх моей страницы, она отображает часть элемента под фиксированным элементом.

Есть ли способ поймать события keydown/keyup из-за манипуляции с адресным баром, чтобы я мог убедиться, что сегмент отображается с правильным смещением? Есть ли способ создать смещение по умолчанию после изменения фрагмента URL-адреса? Я пробовал событие hashchange в объекте window, но это также срабатывает, когда я обновляю значение location.href.hash в зависимости от того, какой сегмент просматривает пользователь. У меня есть верхнее смещение по умолчанию для моего элемента body, чтобы начальная загрузка работала с фиксированным элементом.

Похоже, что многие другие страницы-страницы игнорируют фрагмент URL-адреса и вообще не обновляют URL-адрес, если навигационная система не находится в верхней части веб-сайта. Таким образом, вы не сможете напрямую ссылаться на определенную часть веб-сайта, если навигация не находится слева или справа.

Часть моего кода:

$(window).load(function(){

var segment = window.location.hash;
if(segment != ""){
    if($(segment) != []){
        var originOfSegment = $(segment).offset().top - 64;
        $("body, html").animate({"scrollTop": originOfSegment + "px"}, 0);
    }
}

$("a[href*='#']").on("click", function(e){

    if(e.preventDefault){
        e.preventDefault();
    }
    else{
        e.returnValue = false;
    }

    var segment = this.hash;

    //navigateTo(segment, 500);

    window.location.hash = segment;

});

$(window).on("scroll", function(){
    var idOfSegment = $(currentSegment).attr("id");
    window.location.hash = idOfSegment;
});

});

Я, вероятно, не первый из них с этой проблемой, но я не могу найти ответ на эту конкретную проблему.

Он легко воспроизводится даже без использования JavaScript для первоначального вычисления и установки смещения для элемента, на который ссылается фрагмент URL.

С точки зрения пользователей:

  • Пользователь: Я перехожу на сайт, используя URL-адрес и фрагмент URL-адреса.
  • Userrequest: http://example.com/index.html#contact
  • Сценарий: скрипт получает запрос, видит фрагмент URL-адреса и вычисляет его, а затем определяет смещение. Сукчес!
  • Пользователь: С помощью этой ссылки я открыл форму контакта и отправлю некоторую информацию.
  • Пользователь: Следующая вещь, которую я хочу сделать, - вернуться к обзору продукта и использовать адресную панель для этого.
  • Userrequest: http://example.com/index.html#products
  • Сценарий: событие hashchange запускается, но никакое событие keyup на "enter" не может быть обнаружено, что приводит к неизвестному источнику, из которого произошло событие. Хеш также можно изменить с помощью прокрутки от сегмента к сегменту. Это приводит к элементу, расположенному ниже фиксированной навигационной панели. Поскольку веб-сайт не обновляется, а загружается из кеша, нет никакого загрузочного или готового события, которое я могу использовать для расчета и настройки смещения.
  • 0
    Что я нашел полезным в такой ситуации, так это добавление некоторого отступа над целями, чтобы при переходе страницы к этому идентификатору с помощью щелчка цели она имела достаточно места под панелью навигации.
  • 0
    Я понимаю логику этого, потому что это всегда будет создавать достаточно места сверху элемента. Но если я хочу, чтобы мои пробелы соответствовали остальной части сайта, это означало бы высоту панели навигации + нормальное заполнение, что могло бы привести к большим промежуткам между страницами / сегментами, которые отличаются от обычного использования. пробелов.
Показать ещё 1 комментарий
Теги:
browser
events

1 ответ

1

Вы можете использовать JavaScript window.scrollTo() или jQuery .scrollTop() для .scrollTop() к определенной позиции. Общая логика:

  1. найдите местоположение желаемого идентификатора с помощью .offset().top
  2. вычесть высоту вашего фиксированного заголовка, рассчитанную с использованием .outerHeight()
  3. используйте $(body).scrollTop() для мгновенной прокрутки в нужную позицию или .animate() чтобы прокручивать их за долю секунды.
  • 0
    Вот пример, который я использовал на другом сайте не так давно.
  • 0
    Привет Blazemonger, дело в том, что это работает только изначально после загрузки страницы. Если вы измените фрагмент URL-адреса во второй раз, смещение не будет работать, поскольку страница загружается из кэша и, по-видимому, не вызывает событие загрузки или готовности. Как вам удалось это преодолеть?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню