【问题标题】:More efficient way to write this Javascript (waypoints)?编写此 Javascript(航点)的更有效方法?
【发布时间】:2013-06-10 04:59:41
【问题描述】:

请原谅 JS 菜鸟问题,但是(当我的代码按预期工作时)我确信必须有更好/更有效的方法来编写它。非常感谢您的建议。

以下是正在发生的事情: 我有一页垂直滚动主题(自定义)上有一个 Wordpress 菜单。当页面向上、向下滚动或单击导航项时,我正在使用 waypoints.js 突出显示当前可见部分的相应导航按钮。

我已将主页导航项设置为页面加载时的“活动”类,并通过在每个航点添加/删除“活动”类手动突出显示每个部分。为了稍微自动化一下,我尝试使用 $this 而不是 div id,但还不能正确处理。

提前感谢您的帮助。 这是有问题的代码:

http://jsfiddle.net/vCP4K/

我目前笨拙的解决方案:

// 在页面加载时激活主页按钮

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

// 在 DOWN 或单击时,当 div 击中航路点时更改类

$('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}); 

// 更改类,因为 div 在向上或单击时击中航路点

$('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}); 

});

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。您可能会发现,由于这只是关于改进工作 代码段,因此Code Review 更适合您的问题。不过话虽如此,我还是喜欢你发帖的方式——继续加油!
  • 糟糕!对于那个很抱歉。不要以为我曾经意识到存在这种选择。我把问题转移到那里。谢谢鼓励!

标签: navigation highlight jquery-waypoints


【解决方案1】:
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');
}

【讨论】:

  • 你好林哥。非常感谢您的回复。出于某种原因,这对我不起作用。但我想我明白你的建议。我喜欢数组的想法,虽然我希望我能以一种更加自动化的方式来完成这个(因为它是一个 Wordpress 菜单,可能会随着添加的页面等而改变)感谢您的帮助!
  • 如果您将 html 和 js 发布到 jsfiddle 或 pastebin,我可以帮助您解决问题。您看到的错误是什么?您绝对可以更多地自动化代码。而不是第一行,你可以只做“var section = $('section')”
  • 上面有语法错误。对于那个很抱歉。 $.each 块在花括号后缺少右括号。我已经编辑了上面的答案。让我知道这是否更适合您。我还将编辑“var 部分”,使其更加自动化。
  • 哇...酷!我只需要在向下过渡的不同(+1)方向上偏移,它就可以工作。好样的,林哥!你摇滚!我什至认为我理解它。我也会调整为类名而不是 id。关于可能的附加部分,这是一个很好的观点。 JS Fiddle 如果您想看到它的实际效果,请在上面的问题中使用。我已经添加了你的代码。谢谢!
  • 顺便说一句,此代码将包含在我的个人工作组合中,因此我很高兴在代码中注明您并链接到您的个人资料(除非您不希望我这样做)。
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
相关资源
最近更新 更多