Если вы используете JavaScript для навигации, я бы посоветовал добавить проверку к этому.Но я предполагаю, что из вашего вопроса вы не согласны, что вместо этого вы используете простые ссылки только с якорями (например, <a href='#target1'>
, <a href='#target2'>
, ...).
Несколько вариантов:
Использование таймера
В этом случае в основном то, что вы хотите сделать, сводится к получению события при изменении привязки.Насколько я знаю, и насколько люди, отвечавшие на этот другой вопрос о 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 на странице, я бы рекомендовал вместо этого использовать обработчики для ваших ссылок.Если вы добавите имя класса или что-то к ним (держу пари, у них уже есть имя; я буду использовать «navlink» ниже), это легко настроить:
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 , Прототип , YUI , Closure или любой из нескольких других .
Например, версия 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
}