В вашем Javascript есть несколько ошибок, которые я могу обнаружить.
Прежде всего потому, что вам нужно знать, что в .each()
, this
относится к объекту элемента DOM, поэтому для вызова любых методов jQueryна нем вам нужно передать this
в функцию jQuery: $(this)
.
Так что попробуйте следующее:
$(document).ready ( function(){
var path = window.location.pathname;
$('#nav li a').each(function() {
if( path === "/"+this.id ){ // EDIT: This was the problem with the if
$(this).addClass('active'); // "this" is a DOM element, not a jQuery object
} else {
$('#home').addClass('active'); // you missed the $
}
}); // always get in the habit of being explicit with your semicolons
});
РЕДАКТИРОВАТЬ: проблема с if
былачто вы использовали оператор присваивания =
вместо оператора сравнения ==
(равенство с преобразованием типов) / ===
(равенство с теми же типами).Я отредактировал приведенный выше код для решения этой проблемы.
РЕДАКТИРОВАТЬ 2: Хорошо, давайте попробуем новый подход, который использует функцию filter()
jQuery, чтобы использовать атрибут href
в элементах <a>
для поискасовпадение:
$(document).ready ( function(){
var path = window.location.pathname;
var $navLinks = $('#nav li a');
$navLinks.removeClass('active'); // start with a blank slate
$navLinks.filter(function() {
return path.indexOf(this.href) === 0; // test if the pathname starts with the current link's href attribute
}).addClass('active'); // find a matching link to add the class to where the href attribute starts with the pathname
if ($navLinks.filter('.active').length === 0) { // if nothing matches
$('#home').addClass('active'); // make the home link active as a default
}
});
В качестве академического примечания обратите внимание, что вы можете использовать мощный синтаксис сцепления jQuery и некоторые знания JS, чтобы сжать это еще больше, если хотите, чтобы оно могло стать таким маленьким, как:
$(document).ready ( function(){
if (!$('#nav li a').removeClass('active').filter(function() {
return window.location.pathname.indexOf(this.href) === 0;
}).addClass('active').end().filter('.active').length) {
$('#home').addClass('active'); // make the home link active as a default
}
});
Как это для короткого, но трудного для понимания бита кода (который также не проверен, кстати)?