Событие, когда пользователь нажимает на ссылку с хэшем, направляющим на якорь внутри страницы

#javascript #html

#javascript #HTML

Вопрос:

Как поймать момент, когда пользователь нажимает на ссылку, которая имеет хэш, направляющий внутри той же страницы, которая уже открыта (и никакой навигации между страницами не происходит)? hashchange Событие есть, но оно не сработает, если хэш уже установлен и в нем нет никаких изменений. Браузер будет прокручивать страницу до привязки независимо от того, изменился хэш или нет.

 http://example.org/#my-hash
 

Пример использования, когда мне это нужно: страница имеет небольшой блок «Содержимое» в начале, и пользователь может щелкнуть там элемент, затем вернуться к началу и снова щелкнуть тот же элемент. Я хочу выделить раздел, по которому перемещается пользователь.

Ответ №1:

просто получите элемент с помощью querySelector, затем запустите событие onclick

 window.onload = function() {
var tlink = document.querySelector('a[href="#tlink"]');

tlink.addEventListener('click', function(){
console.log(tlink.getAttribute('href'));
});
} 
 #clink {
position:relative;
display:block;
width:100%;
height:20rem;
background:gray;
}

#tlink {
position:relative;
display:block;
width:100%;
height:20rem;
background:yellow;
} 
 <a href="#tlink">GoTo T-Link</a>
<div id="clink"></div>
<div id="tlink">HERE IS T-LINK</div> 

Ответ №2:

Вы можете сравнить свойство хэша ссылки, на которую нажали, со свойством хэша объекта location

 document.querySelectorAll('a').forEach(el => {
  el.addEventListener('click', (e) => {
    const isSameHash = el.hash === location.hash;    
    console.log(isSameHash ? 'Already selected' : 'New Hash')
  });
}) 
 <a href="#foo">Foo</a><br/><a href="#bar">Bar</a>