有问题的网站:
http://harrisonfjord.com/folio2/
正如您所看到的,底部有一个菜单,它使用jquery scrollTo来上下移动页面。菜单代码是:
<ul id="menu" style="list-style:none">
<li><a href="#" class="current" onclick="jQuery.scrollTo('#home', 1000 )"><img class="hoverImage" src="img/home_highlight.png"/></a></li>
<li><a href="#" onclick="jQuery.scrollTo('#asics', 1000 )"><img class="hoverImage" src="img/asics.png"/></a></li>
<li><a href="#" onclick="jQuery.scrollTo('#tooheys', 1000 )"><img class="hoverImage" src="img/tooheys.png"/></a></li>
<li><a href="#" onclick="jQuery.scrollTo('#olympics', 1000 )"><img class="hoverImage" src="img/olymp.png"/></a></li>
<li><a href="#" onclick="jQuery.scrollTo('#panadol', 1000 )"><img class="hoverImage" src="img/panadol.png"/></a></li>
<li><a href="#" onclick="jQuery.scrollTo('#plants', 1000 )"><img class="hoverImage" src="img/plantsplus.png"/></a></li>
<li><a href="#" onclick="jQuery.scrollTo('#kia', 1000 )"><img class="hoverImage" src="img/kia.png"/></a></li>
</ul>
这里有两个元素在起作用。首先,单击li.a使用scrollTo在页面上下移动。其次,悬停/点击图像切换“_highlight.png”源更改,如下所示:
// MENU HOVER IMAGE:
$(function () {
$('img.hoverImage').mouseover(function () {
if ($(this).is('.activeImage')) return;
var src = $(this).attr("src").match(/[^\.]+/) + "_highlight.png";
$(this).attr("src", src);
}).mouseout(function () {
if ($(this).is('.activeImage')) return; // Skip mouseout for active image
var src = $(this).attr("src").replace("_highlight", "");
$(this).attr("src", src);
}).click(function () {
// remove previous active state
$('.activeImage').not(this).removeClass('activeImage').trigger('mouseout');
// set new active state
$(this).addClass('activeImage');
});
});
一切正常。但是,当我尝试向页面添加键盘控件时,整个事情就崩溃了。我想使用向上/向下箭头移动到上一个/下一个菜单项,它使用以下代码:
// Add "current" class to #menu links when clicked
$("#menu a").click(function(e) {
$(".current").removeClass("current");
$(this).addClass("current");
});
// CONTROL BOTTOM MENU WITH UP/DOWN ON KEYBOARD
$(document.documentElement).keyup(function (event) {
// handle cursor keys
if (event.keyCode == 38) {
// go up
$("a.current")
.parent() // moves up to the li element
.prev() // moves to the adjacent li element
.find("a") // moves down to the link
.click(); // triggers a click on the previous link
} else if (event.keyCode == 40) {
// go right
// same as above, but just on one line and next instead of prev
$("a.current").parent().next().find('a').click();
}
});
然而(显然)这会触发无法成功切换_highlight.png函数的click事件。更改代码的最佳方法是什么,以便按键事件不仅滚动到正确的div,还突出显示/取消突出显示正确的菜单项?
答案 0 :(得分:1)
简短,几乎需要更多工作,回答:
$(function() {
function highlight(e) {
var _this = $(this),
src = _this.attr("src").replace("_highlight", "").slice(0, -4) + "_highlight.png";
_this.attr("src", src);
}
function refresh() {
$("#menu a img").each(function(e) {
var _this = $(this),
src = _this.attr("src").replace("_highlight", "");
_this.attr("src", src);
});
highlight.call($("#menu a.current img"));
}
function scroll(item) {
jQuery.scrollTo(item, 1000);
// Add "current" class to appropriate link
$("#menu a").removeClass("current");
var link = $("#menu a[href=" + item + "]");
link.addClass("current");
refresh();
}
$("#menu a").click(function(e) {
// Pull the hash URI from the href.
scroll($(this).attr('href'));
}).find("img").hover(highlight, refresh);
});
// CONTROL BOTTOM MENU WITH UP/DOWN ON KEYBOARD
$(document).keyup(function(e) {
var p = $("a.current").parent();
if (e.keyCode === 38) {
p.prev().find("a").click();
} else if (e.keyCode === 40) {
p.next().find('a').click();
}
});
更长的答案:抽象,使用幂等方法,我稍后会回来详细介绍这里使用的策略。