Как предотвратить переход ссылки «#» на верх страницы?


213

В настоящее время я использую <a>теги с jQuery для запуска таких вещей, как события щелчка и т. Д.

Пример <a href="#" class="someclass">Text</a>

Но я ненавижу, как "#" заставляет страницу переходить наверх страницы. Что я могу сделать вместо этого?



2
Я здесь с Дэвидом Дорвардом и Гаргантауном по двойному вопросу. Если у вас есть ссылки на вашем сайте, они должны функционировать как обычные ссылки. Если JavaScript перехватывает их и делает что-то другое, все хорошо, но вам нужна реальная ссылка, которая ведет к реальной странице. Это необходимо по разным причинам, не в последнюю очередь это SEO и доступность.
Даниэль Приден

«Глупый, как глупый» Мы все были там раньше :)
беру

Ответы:


242

В jQuery, когда вы обрабатываете событие click, верните false, чтобы ссылка не отвечала обычным образомпредотвратить действие по умолчанию, которое заключается в посещении hrefатрибута (согласно комментарию PoweRoy и ответу Эрика ):

$('a.someclass').click(function(e)
{
    // Special stuff to do when this link is clicked...

    // Cancel the default action
    e.preventDefault();
});

1
@pranay: OP указал, что он использует jQuery для работы с этими ссылками.
BoltClock

8
Вместо возврата false выполните event.preventDefault (). Это более понятно для людей, которые будут читать ваш код.
RvdK

@PoweRoy: понял. Я сделал правку и узнал что-то новое :)
BoltClock

5
@BoltClock OP должен использовать кнопки для обработки событий щелчка вместо якорей. Ваш ответ довольно полезен, но в том случае, когда href указывает куда-то, и вам не нужен редирект в данный момент . Предотвращение поведения по умолчанию, которое вообще не требуется, является своего рода советом: возьмите нож, схватите лезвие и забейте гвозди ручкой :) Выберите подходящий инструмент для работы!
принимает

1
Если JQuery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin

298

Так что это старо, но ... на тот случай, если кто-то найдет это в поиске.

Просто используйте "#/"вместо, "#"и страница не будет прыгать.


2
Именно то, что мне нужно! Даже через год после вашего комментария это было полезно для меня, так что спасибо Крис
Зак

49
это работает, потому что он перемещается к названной привязке /, а не потому, что #/имеет какое-либо значение. Вы можете сделать то же самое, #whateveryouwantи это предотвратит скачок к вершине
сленг

3
Это должен быть лучший ответ. Спасибо тебе.
Гилберто Санчес

1
@slang, хотя вы правы, и это просто придирки, но я бы предпочел использовать «# /» вместо «#whateveryouwant», потому что «# /» используется довольно часто и, таким образом, выявляет намерения (чистый код). Это все еще может быть дополнением к ответу.
Jobbert

22
Осторожно - это создает запись в истории браузера, поэтому нажатие назад не будет делать то, что, по его мнению, будет делать пользователь после нажатия ссылки #/или чего-либо еще, например #whatever.
Даррен Суини

62

Вы даже можете написать это так:

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

я не уверен, что это лучший способ, но это способ :)


Этот метод был хорош для pre-HTML 4, но сегодня это очень плохая практика, поскольку он нарушает слишком много навигационных действий, таких как «открыть ссылку в новой вкладке».
Steve-o

7
Вы, возможно, правы, но .. в этом случае это не имеет значения, потому что он дает событие onclick, поэтому открытая ссылка в новой вкладке все равно не будет работать ...
парень Шаллер

Ярлык, href='javascript:;'но будьте осторожны, он вызывает событие window.beforeUnload в IE
Михир

Это может нарушить его собственную функцию? Потому что, если я сделаю это, моя функция рендеринга слайдов больше не будет срабатывать.
user3806549 13.09.16

29

Решение № 1: (простой)

<a href="#!" class="someclass">Text</a>

Решение № 2: (необходимо javascript)

<a href="javascript:void(0);" class="someclass">Text</a>

Решение № 3: (необходимо jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>

3
Первое решение идеально. Коротко, чисто и просто. Это должен быть принятый ответ. Спасибо!
Почти Пит

Номер 1 является отличным решением. Спасибо!
Брентон Скотт


11

Просто используйте <input type="button" />вместо <a>и используйте CSS для стилизации, чтобы он выглядел как ссылка, если хотите.

Кнопки сделаны специально для нажатия, и им не нужны никакие атрибуты href.

Наилучшим способом является использование действия onload для создания кнопки и добавления ее в нужное место через javascript, поэтому при отключенном javascript они вообще не будут отображаться и не будут вводить пользователя в заблуждение.

При использовании href="#"вы получаете множество различных ссылок, указывающих на одно и то же местоположение, что не будет работать, если агент не поддерживает JavaScript.


1
@kingjeffrey Но делать ничего не лучше, чем переходить к #.
Роберт

8

Если вы хотите использовать привязку, вы можете использовать http://api.jquery.com/event.preventDefault/, как и в других предложенных ответах.

Вы также можете использовать любой другой элемент, например, span, и прикрепить к нему событие click.

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});

7

Вы можете использовать #0как href, так 0как не разрешено в качестве идентификатора, страница не будет прыгать.

<a href="#0" class="someclass">Text</a>

5
$('a[href="#"]').click(function(e) {e.preventDefault(); });

3
Не могли бы вы добавить краткое объяснение?
Дж. Ф. Мейер

Мне кажется, что он добавляет обработчик кликов на любой якорь, с которым связана ссылка "#". Таким образом, вам не придется искать все обработчики кликов, которые у вас уже есть, и добавлять в них e.preventDefault ().
Mani5556

4

Просто используйте

<a href="javascript:;" class="someclass">Text</a>

Jquery

$('.someclass').click(function(e) { alert("action here"); }

4

Если элемент не имеет значащего значения href, то это на самом деле не ссылка, так почему бы вместо этого не использовать какой-то другой элемент?

Как предполагает Neothor, интервал такой же подходящий, и, если он правильно оформлен, он будет явно виден как элемент, по которому можно щелкнуть. Вы можете даже прикрепить событие hover, чтобы элемент «загорался», когда мышь пользователя перемещается над ним.

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


4

Ссылки с href = "#" почти всегда должны заменяться элементом кнопки:

<button class="someclass">Text</button>

Использование ссылок с href = "#" также является проблемой доступности, так как эти ссылки будут видны программам чтения с экрана, которые будут читать "Ссылка-текст", но если пользователь щелкнет, он никуда не денется.


3

Вы можете просто передать тег привязки без свойства href и использовать jQuery для выполнения требуемого действия:

<a class="foo">bar</a>


Как правило, я не рекомендую такой подход, так как нет никакого запасного действия, если у пользователя отключен js. Но, учитывая, что у вас уже есть href #, я предположил, что это вас не беспокоит, и поэтому предложил это решение, так как это, вероятно, самый простой способ удовлетворить ваши потребности.
Кингжеффри

1
a:linkСелекторы CSS не будут нацелены на этот тег привязки.
BoltClock

BoltClock, это правда. Но st4ck0v3rfl0w не указывал на такую ​​необходимость.
Кингжеффри

Можно также использовать <div> тогда. Я считаю, что смысл в поддержании <a> заключается в том, чтобы сохранить его стиль, который уже определен обычными <a>. Без href он не будет обнаружен и стилизован как другие <a>.
MarsAndBack


3

#/Трюк работает, но добавляет событие истории в браузере. Таким образом, нажатие назад не работает, поскольку пользователь может захотеть / ожидать этого.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); Это мой путь, так как он работает для уже существующего контента и любых элементов, добавляемых в DOM после загрузки.

В частности, мне нужно было сделать это в раскрывающемся меню начальной загрузки внутри .btn-group(ссылка) , поэтому я сделал:

$('body').click('.dropdown-menu li a[href="#"]', function(e) {e.preventDefault() });

Таким образом, это было нацелено, и больше ничего не влияло на страницу.


3

Я всегда использовал:

<a href="#?">Some text</a>

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


3

Существует 4 аналогичных способа предотвратить переход страницы наверх без использования JavaScript:

Опция 1:

<a href="#0">Link</a>

Вариант 2:

<a href="#!">Link</a>

Вариант 3:

<a href="#/">Link</a>

Вариант 4 ( не рекомендуется ):

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

Но лучше использовать, event.preventDefault()если вы передаете событие click в jQuery.


3
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
А. Сулиман

2

Вы также можете вернуть false после обработки вашего jquery.

Например.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);

1
Этот метод и метод live устарели и больше не должны использоваться.
Квентин,


2

Чтобы страница не перепрыгнула, вам нужно позвонить e.stopPropagation();после звонка e.preventDefault();:

stopPropagationпрепятствует тому, чтобы событие поднялось по дереву DOM. Более подробная информация здесь: https://api.jquery.com/event.stoppropagation/


Не могли бы вы предоставить полный код, который я мог вставить в мой HTML? Я использую Zurb Foundation 5.5.3.
Джули С.

2

Если вы хотите перейти в раздел «Якорь» на той же странице без перехода по страницам вверх, используйте:

Просто используйте "# /" вместо "#", например

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..

1

Добавление чего-либо после #устанавливает фокус страницы на элемент с этим идентификатором. Простейшее решение - использовать, #/даже если вы используете jQuery. Однако, если вы обрабатываете событие в jQuery, event.preventDefault()это путь.


0

<a href="#!">Link</a>И <a href="#/">Link</a>не работает , если один должен нажать на тот же вход более чем один раз .. она принимает только в 1 клик событий для каждого на несколько входов.

до сих пор лучший способ пойти с <a href="#">Link</a>

затем,

event.preventDefault();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.