Для плавный прокрутки использую данный код:
$(document).ready(function() {
$(".navbar-default ul li a[href^='#']").on('click', function(e) {
// prevent default anchor click behavior
e.preventDefault();
// animate
$('html, body').animate({
scrollTop: $(this.hash).offset().top
}, 400, function() {
// when done, add hash to url
// (default click behaviour)
window.location.hash = this.hash;
});
});
При клике на ссылку в адресной строке добавляется #undefined вместо значения hash этой ссылки.
Верстка
this внутри функции, вызываемой при завершении анимации, указывает на элемент, для которого была вызвана анимация. В данном случае, сначала на html, затем на body.
Имеет смысл сохранить a в отдельную переменную перед вызовом анимации. Например, так: var that = this;, после чего использовать window.location.hash = that.hash;
Итоговый код (я убрал html из html, body, чтобы функция вызывалась лишь один раз):
$(document).ready(function()
{
$(".navbar-default ul li a[href^='#']").on('click', function(e)
{
e.preventDefault();
var that = this;
$('body').animate({
scrollTop: $(this.hash).offset().top
}, 400, function() {
window.location.hash = that.hash;
});
});
});
Пример в fiddle.
В том, что вы пытаетесь взять значение там, где его нет:
window.location.hash = this.hash;
^^^^^^^^^
this в данном контексте - просто HTML-элемент, у него нет свойства hash. Вы можете получить адрес (href) ссылки, по которой кликнули, следующим образом:
window.location.hash = $(this).attr('href');
Это создаст jQuery-обертку над текущим элементом, а затем получит атрибут href. не забудьте также заменить и более ранние вхождения.
Продвижение своими сайтами как стратегия роста и независимости