2013-06-09 3 views
2

Простите вопрос JS noob, но (пока мой код работает так, как ожидалось). Я уверен, что должен быть лучший/более эффективный способ его написать. Предложения приветствуются.Более эффективный способ написать этот Javascript (путевые точки)?

Вот что происходит: У меня есть меню Wordpress в одностраничной вертикальной теме прокрутки (обычай). Я использую waypoints.js, чтобы выделить соответствующую кнопку навигации для текущего видимого раздела, когда страница прокручивается вверх, вниз или при нажатии элемента навигации.

Я установил элемент домашней навигации в класс «активный» на загрузке страницы, и я выделил каждый раздел вручную, добавив/удалив «активный» класс на каждой путевой точке. Ради автоматизации этого немного, я попытался использовать $ this, а не div id, но пока не смог его исправить.

Заранее благодарим за любую помощь. Вот код в вопросе:

http://jsfiddle.net/vCP4K/

Мой текущий неуклюжий решение:

// Сделать домашняя кнопка активна на странице загрузки

$('li.home-btn a').addClass('active'); 

// Изменить классы, так как divs попадают в путевую точку по пути DOWN или по щелчку

$('section#home').waypoint(function(down) { 
$('.nav li a').removeClass('active'); 
$('li.home-btn a').addClass('active'); 
}, {offset: -1}); 

$('section#services').waypoint(function(down) { 
$('.nav li a').removeClass('active'); 
$('li.services-btn a').addClass('active'); 
}, {offset: 1}); 

$('section#work').waypoint(function(down) { 
$('.nav li a').removeClass('active'); 
$('li.work-btn a').addClass('active'); 
}, {offset: 1}); 

$('section#about').waypoint(function(down) { 
$('.nav li a').removeClass('active'); 
$('li.about-btn a').addClass('active'); 
}, {offset: 1}); 

$('section#blog').waypoint(function(down) { 
$('.nav li a').removeClass('active'); 
$('li.blog-btn a').addClass('active'); 
}, {offset: 1}); 

$('section#contact').waypoint(function(down) { 
$('.nav li a').removeClass('active'); 
$('li.contact-btn a').addClass('active'); 
}, {offset: 1}); 

// Изменение классов, как дивы хит точку на пути вверх или по щелчку

$('section#home').waypoint(function(up) { 
$('.nav li a').removeClass('active'); 
$('li.home-btn a').addClass('active'); 
}, {offset: -1}); 

$('section#services').waypoint(function(up) { 
$('.nav li a').removeClass('active'); 
$('li.services-btn a').addClass('active'); 
}, {offset: -1}); 

$('section#work').waypoint(function(up) { 
$('.nav li a').removeClass('active'); 
$('li.work-btn a').addClass('active'); 
}, {offset: -1}); 

$('section#about').waypoint(function(up) { 
$('.nav li a').removeClass('active'); 
$('li.about-btn a').addClass('active'); 
}, {offset: -1}); 

$('section#blog').waypoint(function(up) { 
$('.nav li a').removeClass('active'); 
$('li.blog-btn a').addClass('active'); 
}, {offset: -1}); 

$('section#contact').waypoint(function(up) { 
$('.nav li a').removeClass('active'); 
$('li.contact-btn a').addClass('active'); 
}, {offset: -1}); 

}); 
+1

Привет, добро пожаловать к переполнению стека. Вы можете обнаружить, что, поскольку это просто улучшение кода_working_ кода, это [Code Review] (http://codereview.stackexchange.com) является более подходящим местом для вашего вопроса. Сказав, что, хотя, мне нравится, как вы отправили свой пост - продолжайте! –

+0

Упс! Извини за это. Не думайте, что я когда-либо понимал, что этот вариант существует. Я переведу вопрос. Спасибо за поддержку! – Jenn

ответ

0
var sections = []; 

// It'd be better if you used a classname for the section. 
// Then you can select by classname rather than element name. 
// E.g., if someone were to add a <section> tag elsewhere in the document, 
// they would experience a bad bug. 

$('section').each(function() { 
    sections.push($(this).attr('id')); 
}); 
$.each(sections, function(index) { 
    var sectionDiv = $('#' + sections[index]); 
    sectionDiv.waypoint(function(down) { 
    activateSection(sections[index]); 
    }, {offset: -1}); 
    sectionDiv.waypoint(function(up) { 
    activateSection(sections[index]); 
    }, {offset: -1}); 
}) 
function activateSection(sectionName) { 
    $('.nav li a').removeClass('active'); 
    $('li.' + sectionName + '-btn a').addClass('active'); 
} 
+0

Привет Ринго. Большое спасибо за ответ. По какой-то причине это не работает для меня. Думаю, я получаю то, что вы предлагаете. Мне нравится идея массива, хотя я надеялся, что смогу это сделать так, чтобы это было еще более автоматизировано (поскольку это меню Wordpress, которое может меняться с добавленными страницами и т. Д.). Цените свою помощь, хотя! – Jenn

+0

Если вы разместите html и js на jsfiddle или pastebin, я могу помочь разобраться в проблеме. Какая ошибка вы видите? Вы можете определенно автоматизировать код больше. Вместо этой первой строки вы можете просто «var sections = $ ('section')» – Ringo

+0

Ошибка синтаксиса выше. Извини за это. В блоке $ .each отсутствовали закрывающие parens после фигурной скобки. Я отредактировал ответ выше. Дайте мне знать, если это будет лучше для вас. Я также отредактирую «разделы var», чтобы он стал более автоматизированным. – Ringo

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