2010-07-15 3 views
141

настоящее время я использую <a> теги с JQuery, чтобы инициировать такие вещи, как клик событий и т.д.Как предотвратить щелчок по ссылке «#» от перехода к началу страницы?

Пример является <a href="#" class="someclass">Text</a>

Но я ненавижу, как «#» делает страницы Перейти к началу страницы. Что я могу сделать вместо этого?

+11

Не используйте href = "#"! http://icant.co.uk/articles/pragmatic-progressive-enhancement/#build – Quentin

+1

Дубликат http://stackoverflow.com/questions/720970/jquery-hyperlinks-href-value/721021#721021 –

+1

Я с Дэвидом Дорвардом здесь и [gargantaun] (http://stackoverflow.com/questions/720970/jquery-hyperlinks-href-value/721004#721004) по связанному дублированному вопросу. Если у вас есть ссылки на вашем сайте, они должны работать как обычные ссылки. Если JavaScript перехватывает их и делает что-то другое, все хорошо и хорошо, но вам нужно иметь реальную ссылку, что приводит к реальной странице. Это необходимо по любым причинам, не в последнюю очередь по SEO и доступности. –

ответ

167

В JQuery, когда обрабатывать событие щелчка, вернуть ложь, чтобы остановить связь от ответа обычного способа предотвратить действие по умолчанию, который должен посетить атрибут href, принимать место (за комментарий PoweRoy и Erik's answer) :

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

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

ах, дух, спасибо! – st4ck0v3rfl0w

+1

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

+6

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

47

вы можете даже записать его так же, как это:

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

им не уверен, что его лучший путь, но это путь :)

+0

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

+7

вы, возможно, правы, но .. в этом случае это dosnt вопрос, потому что он дает событие onclick, поэтому открытая ссылка в новой вкладке не работает в любом случае ... –

+1

спасибо :) хорошая точка в вашем комментарии тоже –

7

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

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

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

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

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

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

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

+0

Кнопки не работают без javascript. – kingjeffrey

+0

Частично верно;) Кнопки форм работают без javascript. – takeshin

+0

@kingjeffrey Но ничего не делать по-прежнему лучше, чем переходить на '#'. – Robert

3

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

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

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

3

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

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

Jquery

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

Вы можете просто передать якорь тег без HREF собственности, и использовать JQuery, чтобы сделать необходимые действия:

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

+0

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

+0

Селектора CSS a: link' не будут нацелены на этот якорный тег. – BoltClock

+0

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

216

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

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

+3

Это так здорово .. Спасибо – hfarazm

+1

ТОЧНО, что мне нужно! Даже через год после вашего комментария это было полезно для меня, так что спасибо Крис – Zack

+0

Прохладный, я не знал этого трюка! –

1

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

Например.

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

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

1

Я использую что-то вроде этого:

<a href="#null" class="someclass">Text</a> 
1

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

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

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

2

Я использовал:

<a href="javascript://nop/" class="someClass">Text</a> 
1

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

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

+0

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

2

Если вы хотите перейти к Anchor разделу на ту же страницу без страницы вскакивая использование:

Просто использовать «# /» вместо «#» например

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

не знал этого. – nasty

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

Не могли бы вы добавить короткое объяснение? –

+0

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

4

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

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

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

+0

На самом деле я не знаю, что вы имеете в виду. Я не задал вопрос, просто отправил ответ на начальный вопрос, воспользовавшись некоторыми ответами выше ... Приветствия! –

1

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

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

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

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

Таким образом, он был направлен, и не влияет на что-нибудь вещь еще на странице.

6

Решение # 1:

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

Решение # 2:

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

Решение # 3:

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

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

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

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

Смежные вопросы