Как сделать так, чтобы тег привязки ссылался ни на что?


159

Я использую jQuery, мне нужно, чтобы некоторые теги привязки не выполняли никаких действий.

Я обычно пишу это так:

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

Однако это относится к верхней части страницы!


потому что jquery будет обрабатывать событие click, поэтому я хочу, чтобы ссылка была похожа на ахорную ссылку, но работала как функция JavaScript
ахмед


1
Как упоминалось в одном из ответов ниже: если вы не хотите, чтобы ссылка указывала на ресурс, не используйте элемент A.
Матиас Биненс

Не используйте hrefатрибут в нем.
vsync

Ответы:


103

Если вы не хотите, чтобы это указывало на что-либо, вам, вероятно, не следует использовать <a>тег (anchor).

Если вы хотите, чтобы что-то было похоже на ссылку, но не действовало как ссылка, лучше использовать соответствующий элемент (например, <span>), а затем стилизовать его с помощью CSS:

<span class="fake-link" id="fake-link-1">Am I a link?</span>

.fake-link {
    color: blue;
    text-decoration: underline;
    cursor: pointer;
}

Кроме того, учитывая, что вы пометили этот вопрос "jQuery", я предполагаю, что вы хотите прикрепить обработчик событий щелчка. Если это так, просто сделайте то же самое, что и выше, а затем используйте что-то вроде следующего JavaScript:

$('#fake-link-1').click(function() {
    /* put your code here */
});

37
У этого есть проблема: это не позволяет навигацию по вкладкам.

6
Обратите внимание, что (как указывает Iraimbilanja) подход span позволяет отключить возможность вызова функции с помощью клавиатуры, что я считаю проблемой юзабилити.
Фредрик Мёрк

3
Также проблема доступности. Вы можете разрешить это, используя элемент кнопки (сгенерированный из JavaScript, чтобы пользователи, не являющиеся JS, не получили сломанный элемент управления).
Квентин

4
Вот быстрое решение для этого: tabindex = "0" для не связанного элемента включит навигацию с клавиатуры в большинстве современных браузеров.
Матиас Биненс

1
Другая «проблема» заключается в том, что у вас нет псевдо-класса CSS: hover, который не будет работать с элементами, которые не являются ссылками в IE6. Но так как вы все равно добавляете эти элементы через JavaScript (по крайней мере, вам следует), вы также можете написать скрипт, который добавляет класс .hover к элементу при наведении.
Матиас Биненс

268

Есть несколько менее совершенных решений:

1. Ссылка на фальшивый якорь

<a href="#">

Проблема: при нажатии на ссылку происходит возврат к началу страницы

2. Использование тега, отличного от «а»

Используйте тег span и используйте jquery для обработки клика

Проблема: ломает навигацию клавиатуры, приходится вручную менять курсор при наведении

3. Ссылка на пустую функцию JavaScript

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

Проблема: ломается при связывании изображений в IE

Решение

Поскольку у них у всех есть свои проблемы, решение, на котором я остановился, состоит в том, чтобы связать с фальшивым якорем, а затем вернуть false из метода onClick:

<a href="#" onClick="return false;">

Не самое лаконичное решение, но оно решает все проблемы с помощью вышеуказанных методов.


2
Я обычно использую JavaScript: void (0); подход, потому что использование # отображает текущий URL в панели Firefox при наведении курсора мыши, что может ввести пользователя в заблуждение.
Lucaferrario

8
breaks when linking images in IEЧто это значит?
Евгений

14
@eugene этому вопросу уже 3 года, но IE раньше заставлял изображения исчезать, когда они окружены ссылкой на функцию void. Не уверен, когда это было исправлено, но он работает в IE10, и это все, что я установил. Я лично сейчас использую<a href="javascript:;">
zaius

1
Я также использовал там комментарии: <a href="javascript:void(0); // Показать свойства palette">. Таким образом, когда пользователь наводит курсор мыши, он видит комментарий, который может дать им подсказку, чего ожидать при нажатии. (Хотя вы также можете использовать всплывающую подсказку.)
Робин Циммерманн

5
Кажется, этого href="javascript:"тоже достаточно и работает в последних крупных браузерах. Точка с запятой не нужна, ведь PhpStorm даже предлагает ее удалить.
17

40

Чтобы заставить его вообще ничего не делать, используйте это:

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

1
или просто <a href="javascript:;">. PS не работает с target=_blankхотя
Алекс

36

Правильный способ справиться с этим - «разорвать» ссылку с помощью jQuery при обработке ссылки.

HTML

<a href="#" id="theLink">My Link</a>

JS

$('#theLink').click(function(ev){
    // do whatever you want here

    ev.preventDefault();
    ev.stopPropagation();
});

Эти последние два вызова не позволяют браузеру интерпретировать щелчок.


5
Хотя это звучит так, как будто это «правильно», потому что останавливает всплытие событий, «return false» гораздо менее многословно и делает то же самое. Единственный раз, когда вы захотите это сделать, - это если у вас уже есть зарегистрированные обработчики событий для кликов по ссылкам через jQuery.
aleemb

25

Есть так много способов сделать это как

Не добавлять и hrefатрибут

<a name="here"> Test <a>

Вы можете добавить событие onclick вместо href как

<a name="here" onclick="YourFunction()"> Test <a>

Или вы можете добавить функцию void, как это было бы лучшим способом

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

Требуется ли указывать имя?
Петрус Терон

@PetrusTheron Не обязательно. ,
Punit Gajjar

Это плагиат уже существующих ответов
aross

1
Не забудьте установить стиль вашего тега привязки, если вы удалите hrefатрибут, так как он больше не будет вести себя как гиперссылка (даже при том, что onclick все еще работает), вам придется сбросить такие вещи, как cursor: pointer;и :hoverселектор.
Partack

@Partack Правильно .. Спасибо за
замечание

24

Что вы подразумеваете под ничем?

<a href='about:blank'>blank page</a>

или

<a href='whatever' onclick='return false;'>won't navigate</a>

1
Согласитесь - просто верните false из вашего метода jQuery и вуаля, это никуда не денется
joshcomley

14

Я думаю, что вы можете попробовать

<a href="JavaScript:void(0)">link</a>

Единственный улов, который я вижу здесь, это высокий уровень безопасности браузера, который может вызвать выполнение javascript.

Хотя это один из более простых способов, чем

<a href="#" onclick="return false;">Link</a>

это следует использовать экономно

Прочитайте эту статью для некоторых указателей https://web.archive.org/web/20090301044015/http://blog.reindel.com/2006/08/11/a-hrefjavascriptvoid0-avoid-the-void


Правильный ответ, позволяет вкладку навигации.
К - Токсичность в СО растет.

14

Этот ответ должен быть обновлен с учетом новых веб-стандартов (HTML5).

Это:

<a tabindex="0">This represents a placeholder hyperlink</a>

... действителен HTML5. Атрибут tabindex делает клавиатуру фокусируемой, как обычные гиперссылки. Вы могли бы также использовать spanэлемент для этого, как упомянуто ранее, но я считаю, что использование aэлемента более элегантно.

См .: https://w3c.github.io/html-reference/a.html
и: https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-href.


1
Это также допустимый HTML4, но он не будет стилизовать якорь как ссылку.
interjay

1
Я не знал, что это был действительный html4, но в спецификации HTML5 явно упоминается сценарий использования. И стили, которые не нацелены на атрибут href, будут работать просто отлично, могут возникнуть проблемы со стилями браузера по умолчанию.
aross

1
Это также не вызывает clickсобытие, когда пользователь фокусирует элемент и нажимает клавишу ввода (протестировано в Firefox 51).
Торвин

@torvin, это просто. Используйте keydownсобытие.
aross

Причудливая причуда, но в окне 10 она добавляет рамку вокруг элемента
1-14x0r

12

Вот три способа, которыми свойство <a>tag hrefтега ни на что не ссылается:

<a href="JavaScript:void(0)"> link </a>

<a href="javascript:;">link</a >

<a href="#" onclick="return false;"> Link </a>

1
Это просто дубликат текущего набравших наибольшее количество голосов ответ , но с меньшим количеством информации
aross

5

Я знаю, что это старый вопрос, но я все равно решил добавить свои два цента:

Это зависит от того, что будет делать ссылка, но обычно я указываю ссылку на URL, который, возможно, отображает / делает то же самое, например, если вы делаете немного о всплывающем окне:

<a id="about" href="/about">About</a>

Потом с помощью jQuery

$('#about').click(function(e) {
    $('#aboutbox').show();
    e.preventDefault();
});

Таким образом, очень старые браузеры (или браузеры с отключенным JavaScript) могут по-прежнему переходить на отдельную страницу about, но, что более важно, Google также подберет это и просканирует содержимое страницы about.


5

Убедитесь, что все ваши ссылки, которые вы хотите прекратить иметь href="#!"(или все, что вы хотите, действительно), а затем используйте это:

jq('body').on('click.stop_link', 'a[href="#!"]',
function(event) {
     event.preventDefault();
});

4

Вы можете иметь HTML-привязку ( aтег) без hrefатрибута. Оставьте hrefатрибут, и он не будет ссылаться ни на что:

<a>link</a>

Спасибо! Это отлично сработало для моего случая. Где я хотел, чтобы тег Anchor открывался на новой вкладке, когда есть URL, но ничего, если нет URL. В случае # он принимал клик и перемещал его в начало страницы. Не имея части href, как вы предложили. Это решило проблему! Форматирование выглядит великолепно благодаря тегу, проблема кликов исчезла без всяких ссылок. Спасибо!!!
Мохсин

1
Если кто-то еще думает, является ли он верным в HTML5, ответьте ДА :) stackoverflow.com/a/33046203/5323892 . Вот пример со страницы стандартов (см. Третий элемент li): <nav> <ul> <li> <a href="https://stackoverflow.com/"> Главная страница </a> </ li> <li> <a href = "/ news "> News </a> </ li> <li> <a> Примеры </a> </ li> <li> <a href="https://stackoverflow.com/legal"> Legal </a> </ li> </ ul> </ nav>
Мохсин

Это работает, но если вы хотите, чтобы указатель мыши сменился на палец, просто добавьте href = "JavaScript: void (0)", как предложено в ответе @Rutesh Makhijani.
Тарик

3

Единственное, что сработало для меня, это сочетание вышеперечисленного:

Первый ли в уль

<li><a onclick="LoadTab2_1()" href="JavaScript:void(0)">All Assigned</a></li>

Затем в LoadTab2_1 я вручную переключил вкладку div

$("#tabs-2-1").hide();
    $("#tabs-2-2").show();

Это потому, что отключение также отключает действие на вкладках

Вам также нужно вручную оформить вкладку, когда основная вкладка меняет положение вещей.

$("#secTab1").addClass("ui-tabs-active").addClass("ui-state-active").addClass("ui-state-hover").addClass("ui-state-focus");
    $("#secTab1 a").css("color", "#ffffff");


1
<a href="#" onclick="SomeFunction()"  class="SomeClass">sth.</a>

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

<a onclick="SomeFunction()"  class="SomeClass">sth.</a>

и мне нужно было добавить этот CSS.

.SomeClass
{
    cursor: pointer;
}

Что ты имеешь в виду под этим. Что рекомендуется и почему?
Burk

Рекомендуется хранить javascript и html в отдельных файлах, вот подробный ответ: stackoverflow.com/questions/5871640/…
Александру Северин

1

Я столкнулся с этой проблемой на сайте WordPress. Заголовки в выпадающих меню всегда имели атрибут, href=""а используемый плагин заголовка допускал только стандартные URL-адреса. Самым простым решением было просто запустить этот код в нижнем колонтитуле:

jQuery('[href=""]').click(function(e){
    e.preventDefault();
});

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


0

React больше не поддерживает использование такой функции href="javascript:void(0)"в вашем теге привязки, но здесь есть кое-что, что работает довольно хорошо.

<a href="#" onClick={() => null} >link</a>

-1

Я знаю, что это помечено как вопрос jQuery, но вы также можете ответить на него с помощью AngularJS.

в вашем элементе добавьте директиву ng-click и используйте переменную $ event, которая является событием click ... предотвратите его поведение по умолчанию:

<a href="#" ng-click="$event.preventDefault()">

Вы даже можете передать переменную $ event в функцию:

<a href="#" ng-click="doSomething($event)">

в этой функции вы делаете все, что хотите с событием click.

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