2013-07-22 6 views
2

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

Я реализовал прокрутку, которая хорошо работает. Я просто не знаю, как сохранить хеш-адрес как e.preventDefault(), останавливает это из-за происходящего. Если я удалю эту строку, страница начнет мигать перед прокруткой.

$(".navigation a").click(function(e){ 
    $(".navigation a").removeClass("active"); 
    $(this).addClass("active"); 

    if ($(this).attr("href").substring(0,1) == "#"){ 
     e.preventDefault(); 

     $('html, body').animate({ 
      scrollTop: $($(this).attr("href")).offset().top 
     }, 1000); 
    } 
}); 
+0

Проверьте это: http://stackoverflow.com/questions/6478485/jquery-change-the-url-address-without-redirecting –

+0

Как это помощь меня? Изменение «document.location.hash» мгновенно перескакивает на страницу без прокрутки! – Chris

+0

Попробуйте 'return false', а также' preventDefault'. Лучше? –

ответ

2

Я не знаю, насколько хорошо вы должны поддерживать старые браузеры, но в противном случае вы можете использовать pushState functionallity что URL дает документацию о том, как использовать его :)

Поддерживается всеми браузерами и IE10 (так что нет 9 или меньше)


раствор не-PushState бы, чтобы перейти к нужной высоте, а затем изменить URL. Если сделано правильно, страница обыкновение прыгать :)

// you should change class navigation to id navigation, since there probally is only one 
$(".navigation".find("a").click(function(e){ // with id this will speed up a bit 
    //$(".navigation a").removeClass("active"); 
    $(".navigation a.active").removeClass("active"); // with A its faster 
    $(this).addClass("active"); 
    var anchorDestination = this.href; // save for later, select as little times as possible 

    //if ($(this).attr("href").substring(0,1) == "#"){ 
    if (this.href.substring(0,1) == "#"){ // use native JS where possible 
     e.preventDefault(); 
     var anchorDestination = this.href; // save for later 
     var $aElem = $(this); // select it once, save it for later 

     $('html, body').animate({ 
      //scrollTop: $($(this).attr("href")).offset().top 
      scrollTop: $aElem.offset().top 
     }, 1000, function(){ 
      window.location = anchorDestination; 
     }); 
    } 
}); 
+0

Не знаю, почему я об этом не думал, спасибо, это хороший ответ – Chris

+0

Знакомая проблема - это программный мир: P Мы иногда считаем слишком большими. Кроме того, ознакомьтесь с советами, которые я добавил :) – Martijn

+0

Приветствия за советы, когда что-то не используется в цикле for или у меня нет много элементов, которые я предпочитаю читать по прямой эффективности, хотя :) – Chris

Смежные вопросы