Як запобігти переходу на верхню сторінку клацання посилання "#"?


213

Наразі я використовую <a>теги з jQuery для ініціювання таких речей, як події клацання тощо.

Приклад є <a href="#" class="someclass">Text</a>

Але я ненавиджу, як "#" змушує сторінку переходити на верхню частину сторінки. Що я можу зробити замість цього?



2
Я тут з Девідом Дорвордом , і гаргантаун по пов'язаному дублюючому питанню. Якщо на вашому веб-сайті є посилання, вони повинні функціонувати як звичайні посилання. Якщо JavaScript перехоплює їх і робить щось інше, все добре і добре, але вам потрібно мати реальне посилання там, що призводить до реальної сторінки. Це необхідно з усіляких причин, не останньою з яких є SEO та доступність.
Даніель Приден

«Дурний як дурний робить» Ми всі були там раніше :)
takeshin

Відповіді:


242

У jQuery, коли ви обробляєте подію натискання, повернути помилкове, щоб зупинити відповідь на звичайний спосібне дозволяти виконувати дію за замовчуванням, який повинен відвідувати 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 ОП повинен використовувати кнопки для обробки подій клацання замість якорів. Ваша відповідь є досить корисною, але у випадку, коли href кудись вказує, і вам не потрібно перенаправлення на даний момент . Запобігання поведінки за замовчуванням взагалі не потрібне - це така порада, як: візьміть ніж, візьміть за лезо і забийте цвяхи за ручку :) Візьміть правильний інструмент для роботи!
приймає

1
Якщо jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin

298

Це старе, але ... про всяк випадок, коли хтось знайде це в пошуку.

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


2
ТОЧНО, що мені було потрібно! Навіть через рік після Вашого коментаря це було корисно для мене, тож дякую Кріс
Зак

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

3
Це має бути найкращою відповіддю. Притулити тебе.
Гілберто Санчес

1
@slang, хоч ти маєш рацію, і це просто витісняння, але я вважаю за краще використовувати "# /" замість "#whateveryouwant", оскільки "# /" використовується досить часто і таким чином виявляє наміри (Чистий код). Це все ще може бути доповненням до відповіді.
роботодавець

22
Остерігайтеся - це створює запис в історії браузера, тому натискання назад не зробить те, що думає користувач, після натискання на посилання #/або що-небудь інше, наприклад #whatever.
Darren Sweeney

61

Ви можете навіть написати це саме так:

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

я не впевнений, що це кращий шлях, але це спосіб :)


Цей метод був чудовим для попереднього HTML 4, але сьогодні це дуже погана практика, оскільки він порушує занадто багато навігаційних дій, таких як "відкрита посилання на новій вкладці".
Стів-о

7
Ви, можливо, маєте рацію, але .. в цьому випадку це не має значення, тому що він дає подію onclick, так що відкрита посилання в новій вкладці все одно не буде працювати ...
хлопець schaller

Ярлик, href='javascript:;'але будьте обережні, він запускає window.beforeUnload event in IE
Mihir

Це може порушити його власну функцію? Тому що якщо я це зробив, мій функція відтворення слайдів більше не запускається.
user3806549

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.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
Не могли б ви додати коротке пояснення?
JF Meier

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

4

Просто використовуйте

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

ПІДТРИМКА

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

4

Якщо елемент не має значущого значення href, то він насправді не є посиланням, так чому б замість цього не використовувати якийсь інший елемент?

Як запропонував Neothor, проміжок настільки ж підходить і, якщо його правильно викладати, буде помітно очевидним як предмет, на який можна натиснути. Ви навіть можете прикріпити подію наведення курсору, щоб елемент "загорівся", коли миша користувача переміщається по ньому.

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


4

Посилання з href = "#" майже завжди повинні бути замінені елементом кнопки:

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

Використання посилань з href = "#" також є проблемою доступності, оскільки ці посилання будуть видимі читачам екрану, який прочитає "Посилання - текст", але якщо користувач натисне, він нікуди не піде.


3

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

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


Я, як правило, не рекомендую такий підхід, оскільки немає резервної дії, якщо у користувача відключений js. Але з огляду на те, що ви вже встановили href #, я припустив, що це не стосується вас, і тому я запропонував це рішення, оскільки це, найімовірніше, найпростіший засіб для задоволення ваших потреб.
kingjeffrey

1
a:linkCSS-селектори не орієнтуються на цей тег прив’язки.
BoltClock

BoltClock, це правда. Але st4ck0v3rfl0w не вказував на таку потребу.
kingjeffrey

Може також використовувати <div> тоді. Я вважаю, що сенс у підтримці <a> полягає у збереженні його стилізації, що вже визначено звичайними <a> s. Якщо немає 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()якщо ви передаєте подію натискання в jQuery.


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

2

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

Напр.

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

1
Це, і живий метод, як застарілий, так і більше не слід використовувати.
Квентін


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.