HTML-якорная ссылка без прокрутки или перехода

У меня есть различные ссылки, которые имеют уникальные идентификаторы, которые являются "псевдо-якорями". Я хочу, чтобы они влияли на значение хеша URL, и магия кликов обрабатывается некоторым кодом mootools. Однако, когда я нажимаю на ссылки, они прокручиваются к себе (или к вершине в одном случае). Я не хочу никуда прокручиваться, но мне также нужен мой javascript для выполнения и получения значения хеша в обновлении URL.

Пример смоделированного кода:

<a href="#button1" id="button1">button 1</a>
<a href="#button2" id="button2">button 2</a>
<a href="#" id="reset">Home</a>

Так что, если вы нажмете ссылку "кнопка 1", URL-адрес может быть http://example.com/foo.php

У кого-нибудь есть идеи по этому поводу? Просто наличие некоторого возврата javascript void убивает прокрутку, но также убивает мой javascript (хотя я мог бы, вероятно, обойти это с помощью onclick), но, что более важно, предотвращает изменение значения хеша в URL.

9 ответов

Решение

Я, наверное, что-то упускаю, но почему бы просто не дать им разные идентификаторы?

<a href="#button1" id="button-1">button 1</a>
<a href="#button2" id="button-2">button 2</a>
<a href="#" id="reset">Home</a>

Или какое-нибудь соглашение вы бы предпочли.

Суть якорной ссылки заключается в том, чтобы прокрутить страницу до определенной точки. Так что, если вы не хотите, чтобы это произошло, вам нужно приложить onclick обработчик и вернуть ложь. Даже простое добавление его в качестве атрибута должно работать:

<a href="#button1" id="button1" onclick="return false">button 1</a>

Побочным эффектом вышеизложенного является то, что сам URL не изменится, так как возвращение false приведет к отмене события. Таким образом, так как вы хотите, чтобы URL действительно изменился, вы можете установить window.location.hash переменная к значению, которое вы хотите (это единственное свойство URL, которое вы можете изменить без принудительной перезагрузки браузера). Вы можете прикрепить обработчик события и вызвать что-то вроде window.location.hash = this.id хотя я не уверен, как mootools обрабатывает события.

(Также вам нужно, чтобы все идентификаторы были уникальными)

Вы можете использовать код ниже, чтобы избежать прокрутки:

<a href="javascript:void(0);">linktxt</a>

Также, preventDefault

    $(your-selector).click(function (event) {
        event.preventDefault();
        //rest of your code here
    }

Я нашел решение. Здесь я спасаю старое место от вызова href и восстанавливаю его после прокрутки

<script language="JavaScript" type="text/javascript">
<!--
function keepLocation(oldOffset) {
  if (window.pageYOffset!= null){
    st=oldOffset;
  }
  if (document.body.scrollWidth!= null){
    st=oldOffset;
  }
  setTimeout('window.scrollTo(0,st)',10);
}
//-->
</script>

и в теле страницы

<a href="#tab1" onclick="keepLocation(window.pageYOffset);" >Item</a> 

Благодаря sitepoint

Возможно, более простым способом было бы добавить его как GET. То есть, http://example.com/foo.php?q=#button1 вместо http://example.com/foo.php#button1

Это не повлияет на способ отображения страницы (если вы этого не хотите), и в большинстве языков сценариев уже есть инструменты для простого (и безопасного) чтения данных.

Ну вот, через 7 лет после того, как этот ответ был опубликован, я нашел другой способ заставить его работать: просто укажите window.location.hash на несуществующий якорь! Это не работает для <a>с, но прекрасно работает в <div>s.

<div onclick="window.location.hash = '#NonExistentAnchor';">button 1</div>

Хорошо работал в Chrome 56, Firefox 52 и Edge (IE?) 38. Еще одним хорошим моментом является то, что это не приводит к ошибкам или предупреждениям консоли.

Надеюсь, это поможет кому-то, кроме меня.

Есть решение вообще без JavaScript:

      <a href="#!">I will not jump to the top</a>

Использовать

      <a href="#button1" id="button1" onclick="setHash(this.id)">button 1</a>

где

      function setHash(hash) {
            event.preventDefault();        
            history.pushState(null, null, "#"+hash);
}

event.preventDefault()останавливает браузер от того, что он обычно делает при нажатии, и history.pushStateдобавляет в стек истории сессий.

Для дальнейшего обсуждения см. здесь и здесь

Другие вопросы по тегам