如果您使用 JavaScript 进行导航,我建议您在其中添加检查。但我从你的问题猜测你不是,而是使用带有锚点的普通链接(例如,<a href='#target1'>,<a href='#target2'>,...)。
几个选项:
使用计时器
在这种情况下,基本上你想做的事情归结为在锚点改变时接收一个事件。据我所知,就在一月份回答this other question on StackOverflow 的人所知,你只能用计时器来做到这一点。 (编辑:但请参阅下面 ide 的评论,有一个新的 hashchange 事件我们很快就能使用!) 例如:
(function() {
var lastHash = window.location.hash;
setTimeout(function() {
var newHash = window.location.hash;
if (newHash !== lastHash) {
lastHash = newHash;
// Trigger your target change stuff
}
}, 250);
})();
每季度检查一次更改。这对你来说可能还不够,你可以降低250,但要小心运行过多并减慢其他一切。
但正如你在下面所说的那样,这是低效的。
挂钩链接的click 事件
由于您已经在页面上使用 JavaScript,我建议您改为在链接上使用处理程序。如果你给他们添加一个类名或其他东西(我打赌他们已经有一个;我会在下面给我们“导航链接”),这很容易设置:
var links, index, link;
links = document.getElementsByTagName('a');
for (index = 0; index < links.length; ++index) {
link = links.item(index);
if ((" " + link.className + " ").indexOf(" navlink ") >= 0) {
hookEvent(link, 'click', clickHandler);
}
}
function clickHandler() {
// `this` will reference the element that was clicked
}
// The 'hook' function:
var hookEvent = (function() {
var elm = document.createElement('a');
function hookEventViaAttach(element, event, handler) {
element.attachEvent("on" + event, handler);
}
function hookEventViaAddListener(element, event, handler) {
element.addEventListener(event, handler, false);
}
function hookEventDOM0(element, event, handler) {
element["on" + event.toLowerCase()] = handler;
}
if (elm.attachEvent) {
return hookEventViaAttach;
}
if (elm.addEventListener) {
return hookEventViaAddListener;
}
// I usually throw a failure here saying not supported, but if you want,
// you can use the DOM0-style stuff.
return hookEventDOM0;
})();
如果您使用像 jQuery、Prototype、YUI、Closure 或 any of several others 这样的库,上述问题的很多复杂性都会消失。
例如,jQuery 版本:
$("a.navlink").click(clickHandler);
function clickHandler() {
// `this` will reference the element that was clicked
}
原型版本:
$$("a.navlink").invoke('observe', 'click', clickHandler);
function clickHandler() {
// `this` will reference the element that was clicked
}