Як зробити тег прив’язки до нічого не посилатися?


159

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

Я зазвичай пишу так:

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

Однак це стосується верхньої частини сторінки!


тому що jquery буде обробляти подію натискання, тому я хочу, щоб посилання була як прив'язка, але поводилася як функція JavaScript
ahmed


1
Як було сказано в одній з відповідей нижче: якщо ви не хочете, щоб посилання вказувало на ресурс, не використовуйте елемент A.
Mathias Bynens

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

Відповіді:


103

Якщо ви не хочете, щоб це вказувало на що-небудь, ви, ймовірно, не повинні використовувати <a>тег (якоря).

Якщо ви хочете, щоб щось виглядало як посилання, але не діяло як посилання, краще скористатися відповідним елементом (наприклад <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
Зауважимо, що (як зазначає Іраімбіланя), сюжетний підхід тут відключає можливість викликати функцію за допомогою клавіатури, що я вважав би проблемою зручності використання.
Фредрік Морк

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

4
Ось швидке виправлення цього питання: tabindex = "0" на елементі без посилання дозволить навігації по клавіатурі в більшості сучасних браузерів.
Mathias Bynens

1
Ще одна «проблема» полягає в тому, що ви не використовуєте CSS: наведення курсору псевдо не працюватиме на елементах, які не є посиланнями в IE6. Але оскільки ви все-таки додаєте ці елементи через JavaScript (принаймні, вам слід), ви можете так само написати сценарій, який додає клас .hover до елемента при наближенні.
Mathias Bynens

268

Є кілька менш ніж ідеальних рішень:

1. Посилання на підроблений якір

<a href="#">

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

2. Використання тегу, відмінного від "a"

Використовуйте тег 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 використовується для зникнення зображень, коли їх оточує посилання на функцію пустоти. Не впевнений, коли це було виправлено, але він працює в IE10, і це все, що я встановив. Я особисто зараз використовую<a href="javascript:;">
zaius

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

5
Здається, цього href="javascript:"теж достатньо і працює в останніх великих браузерах. Немає потреби в крапці з комою, адже PhpStorm навіть пропонує її видалити.
jlh

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>

Або ви можете додати недійсну функцію на зразок цієї, яка була б найкращим способом

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

Чи потрібен атрибут імені?
Петрус Терон

@PetrusTheron Не потрібно. .
Карайте Гаджара


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

@Partack Correct .. Дякуємо за те, що помітили
карайте Гаджажар

24

Що ти означає нічого?

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

або

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

1
Погоджено - просто поверніть помилкове з вашого методу 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


Правильна відповідь, дозволяє навігацію по вкладках.
K - Токсичність в SO зростає.

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, працюватимуть чудово, просто проблеми браузера за замовчуванням можуть бути проблемою.
1313

1
Це також не викликає clickподії, коли користувач фокусує елемент і натискає на введення (перевірено у Firefox 51).
торвін

@torvin, це просто. Використовуйте keydownподію.
aross



5

Я знаю, що це давнє питання, але я думав, що все одно додам свої два центи:

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

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

Потім з jQuery

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

Таким чином, дуже старі веб-переглядачі (або веб-переглядачі з відключеним JavaScript) все ще можуть переходити до окремої сторінки, але що ще важливіше, Google також вибере це і сканує вміст сторінки.


5

Переконайтеся, що всі ваші посилання, які ви хочете припинити href="#!"(або все, що завгодно, насправді), а потім скористайтеся цим:

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

4

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

<a>link</a>

Дякую! Це прекрасно спрацювало для моєї справи. Там, де я хотів мати тег прив’язки, який відкриється в новій вкладці, коли є URL, але нічого, якщо немає URL-адреси. У випадку # він прийняв КЛІК і перемістив його вгору сторінки. Не маючи частини href, як ви запропонували. Це вирішило питання! Форматування виглядає чудово завдяки тегу, проблема з натисканням помилка без href. Дякую!!!
Мохін

1
Якщо хтось інший думає, чи правильний він HTML5, то відповідь ТАК :) stackoverflow.com/a/33046203/5323892 . Ось з прикладу зі сторінки стандартів (див. 3-й елемент li): <nav> <ul> <li> <a href="https://stackoverflow.com/"> Домашня сторінка </a> </li> <li> <a href = "/ новини "> Новини </a> </li> <li> <a> Приклади </a> </li> <li> <a href="https://stackoverflow.com/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 я вручну перемикав вкладки діви

$("#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 onClick = "" подія тут не корисно. Щойно я видалив властивість href = "#", і він працював для мене так само, як нижче

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

і мені потрібно було додати цей css.

.SomeClass
{
    cursor: pointer;
}

Що ти маєш на увазі під цим. Що рекомендується і чому?
Берк

Його найкраща практика зберігати JavaScript та html в окремих файлах, ось детальна відповідь: stackoverflow.com/questions/5871640/…
Олександру Северин,

1

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

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

Це не дасть чистим якорям нічого робити.


0

Реакція більше не підтримує використання такої функції href="javascript:void(0)"у вашому тезі прив’язки, але ось щось дуже добре працює.

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

-1

Я знаю, що це позначено як питання jQuery, але ви можете відповісти на це також за допомогою AngularJS.

у своєму елементі додайте директиву ng-click та використовуйте змінну $ event, яка є подією клацання ... запобігайте її поведінці за замовчуванням:

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

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

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

в цій функції ви робите все, що завгодно, з подією натискання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.