Какое значение «href» следует использовать для ссылок JavaScript: «#» или «javascript: void (0)»?

Ниже приведены два метода создания ссылки, единственной целью которой является запуск кода JavaScript. Что лучше с точки зрения функциональности, скорости загрузки страницы, целей проверки и т. д.?

function myJsFunc() {
    alert("myJsFunc");
}
<a href = "#" onclick = "myJsFunc();">Run JavaScript Code</a>

или же

function myJsFunc() {
    alert("myJsFunc");
}
 <a href = "javascript:void(0)" onclick = "myJsFunc();">Run JavaScript Code</a>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4 196
0
2 358 609
54

Ответы 54

'#' вернет пользователя наверх страницы, поэтому я обычно выбираю void(0).

javascript:; также ведет себя как javascript:void(0);

Способ избежать этого - вернуть false в обработчике события onclick.

Guvante 26.09.2008 01:22

Возврат false в обработчике событий не предотвращает того, что, если JavaScript, JS не запускается успешно.

Quentin 26.09.2008 12:10

использование "#someNonExistantAnchorName" работает хорошо, потому что ему некуда перейти.

scunliffe 27.09.2008 06:46

Если у вас есть базовый href, то # или #something переведет вас на эту страницу привязки на базе href, а не на текущую страницу.

Abhi Beckert 28.03.2012 10:39

Любое использование # или void(0) является плохой практикой и не должно поощряться.

user692942 18.07.2013 16:06

Шебанг (#!) делает свое дело, но это определенно плохая практика.

Neel 17.04.2014 04:23

@Neel, любой якорь, который фактически не существует в документе (например, #_), выполняет тот же трюк с теми же недостатками.

Ilya Streltsyn 22.09.2014 13:18

@Neel В первом выпуске angular автор сказал что-то вроде «лучшие практики следуют необходимости» прямо перед тем, как поместить свои теги скрипта в самый низ страницы.

musicin3d 03.05.2017 14:31

@Guvante, возвращающий false, абсолютно ничего не сделает, если это событие DOM-3, возвращение false - это специфическая вещь для jquery.

ehab 15.12.2019 14:21

@ehab: html.spec.whatwg.org/multipage/… говорит: «Если возвращаемое значение истинно, установить флаг отмены события». поэтому я не знаю, о чем вы говорите.

Guvante 16.12.2019 20:37

Первый, в идеале с реальной ссылкой, по которой можно переходить, если у пользователя отключен JavaScript. Просто убедитесь, что вы вернули false, чтобы событие click не сработало, если выполняется JavaScript.

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

Если вы используете Angular2, этот способ работает:

<a [routerLink] = "" (click) = "passTheSalt()">Click me</a>.

Смотрите здесь https://stackoverflow.com/a/45465728/2803344

Итак, в пользовательских агентах с включенным JavaScript и функцией, поддерживающей это, запускается функция JavaScript, возвращаясь (для пользовательских агентов, где JS не работает по какой-либо причине) к ссылке в верхнюю часть страницы? Это редко бывает разумным отступлением.

Quentin 26.09.2008 12:09

«в идеале с реальной ссылкой для перехода в случае, если у пользователя отключен JavaScript», он должен переходить на полезную страницу, а не #, даже если это просто объяснение того, что сайту нужен JS для работы. Что касается сбоя, я ожидаю, что разработчик будет использовать правильное определение функций браузера и т.д. перед развертыванием.

Zach 26.09.2008 19:41

Я предполагаю (надеюсь), что что-то подобное будет только для отображения всплывающего окна или чего-то подобного простого. В этом случае по умолчанию будет URL-адрес всплывающей страницы. Если это часть веб-приложения или отключение JS приведет к полному разрушению страницы, тогда у этого кода есть другие проблемы ...

Brian Moeskau 13.07.2009 17:52

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

Zach 14.07.2009 03:08

Проблема в том, что если myJsFunc выдает ошибку, она не будет зафиксирована для возврата false.

Tracker1 15.12.2011 22:35

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

Если вы не пишете ссылку с помощью JavaScript (чтобы вы знали, что она включена в браузере), в идеале вы должны предоставить правильную ссылку для людей, которые просматривают с отключенным JavaScript, а затем предотвратить действие ссылки по умолчанию в вашем onclick обработчик события. Таким образом, те, у кого включен JavaScript, будут запускать функцию, а те, у кого отключен JavaScript, будут переходить на соответствующую страницу (или место на той же странице), а не просто нажимать на ссылку и ничего не происходит.

Ни один.

Если у вас есть реальный URL-адрес, который имеет смысл, используйте его как HREF. Onclick не сработает, если кто-то щелкнет по вашей ссылке, чтобы открыть новую вкладку, или если у него отключен JavaScript.

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

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

Проверьте Ненавязчивый JavaScript и Прогрессивное улучшение (оба - Википедия).

В идеале вы бы сделали это:

<a href = "javascriptlessDestination.html" onclick = "myJSFunc(); return false;">Link text</a>

Или, что еще лучше, у вас будет ссылка на действие по умолчанию в HTML, и вы бы ненавязчиво добавили событие onclick к элементу через JavaScript после рендеринга DOM, таким образом гарантируя, что если JavaScript отсутствует / используется, вы иметь бесполезные обработчики событий, загадывающие ваш код и потенциально запутывающие (или, по крайней мере, отвлекающие) ваш фактический контент.

Приятно иметь доступ к вашему сайту для пользователей с отключенным JavaScript, и в этом случае href указывает на страницу, которая выполняет то же действие, что и выполняемый JavaScript. В противном случае я использую «#» с «return false;», чтобы предотвратить действие по умолчанию (прокрутить до верхней части страницы), как упоминали другие.

Поиск в Google по запросу "javascript:void(0)" дает много информации по этой теме. Некоторые из них, например Вот этот, упоминают причины НЕ используйте void (0).

В записи блога нет ссылки на то, почему следует избегать использования javascript: void (0).

AnthonyWJones 26.09.2008 11:20

Ссылка (фактически) разорвана.

Peter Mortensen 31.05.2011 12:06

Не лучшее решение для доступности: dequeuniversity.com/rules/axe/3.0/href-no-hash

Hrvoje Golcic 26.11.2019 18:13

javascript:void(0); также не подходит, если вы хотите использовать строгую политику безопасности контента, которая отключает встроенный JavaScript.

Scott Schupbach 07.04.2020 21:59

В идеале у вас должен быть реальный URL-адрес в качестве запасного варианта для пользователей, не использующих JavaScript.

Если это не имеет смысла, используйте # в качестве атрибута href. Мне не нравится использовать атрибут onclick, поскольку он встраивает JavaScript непосредственно в HTML. Лучше было бы использовать внешний JS-файл, а затем добавить обработчик событий к этой ссылке. Затем вы можете предотвратить событие по умолчанию, чтобы URL-адрес не изменился для добавления # после того, как пользователь щелкнет его.

Ни то, ни другое, если вы спросите меня;

Если ваша «ссылка» имеет единственную цель - запустить некоторый код JavaScript, она не считается ссылкой; скорее кусок текста с связанной с ним функцией JavaScript. Я бы рекомендовал использовать тег <span> с прикрепленным к нему onclick handler и немного базового CSS для имитации ссылки. Ссылки предназначены для навигации, и если ваш код JavaScript не предназначен для навигации, он не должен быть тегом <a>.

Пример:

function callFunction() { console.info("function called"); }
.jsAction {
    cursor: pointer;
    color: #00f;
    text-decoration: underline;
}
<p>I want to call a JavaScript function <span class = "jsAction" onclick = "callFunction();">here</span>.</p>

Этот подход ограничивает «ссылку» только операцией мыши. Якорь можно посетить с клавиатуры, и его событие onclick запускается при нажатии клавиши ввода.

AnthonyWJones 26.09.2008 11:09

Жесткое кодирование цветов в вашем CSS не позволит браузеру использовать пользовательские цвета, которые может определить пользователь, что может быть проблемой с доступностью.

Hosam Aly 28.02.2009 22:21

Они сводятся к тому же, что и семантика использования тега span или anchor. Если URL-адрес страницы может быть сгенерирован только в javascript, не имеет значения, где он запускается, кроме как указанные теги привязки могут использовать навигацию с клавиатуры.

PeteT 27.01.2010 13:13

<span> не предназначены для чего-либо делать. Для этого используются якоря <A> и <buttons>!

redShadow 15.12.2011 03:15

Здесь лучше использовать buttons, в то время как span - нет.

apnerve 28.12.2012 12:33

Я думаю, что промежуток лучше, чем якорный тег. Тег привязки существует, чтобы направить вас к его обязательному атрибуту href. Если вы не собираетесь использовать href, не используйте якорь. Он не ограничивает ссылку мышью только потому, что это не ссылка. У него нет href. Это больше похоже на кнопку, но не публикует. Диапазон, не предназначенный для каких-либо действий, полностью недействителен. Рассмотрим раскрывающееся меню, которое активируется при наведении курсора. Вероятно, это комбинация span и div, выполняющая функцию кнопки, которая расширяет область на экране.

NibblyPig 09.04.2014 21:00

@SLC Но <span> бессмысленен для программы чтения с экрана или доступного браузера, не так ли?

Dave Newton 18.06.2015 02:53

Использование buttons часто является ужасной идеей с точки зрения разработки для запуска атрибутов отображения / скрытия небольших разделов веб-сайта, особенно если таких триггеров много. Множество кнопок в одном месте обычно выглядит ужасно, если это не какая-то панель управления. И, как указывалось ранее, якоря тоже не предназначены для работы в качестве триггеров JS. Так что span или, может быть, даже div выглядит как лучшая замена, со своими недостатками, но все же лучше. Нет ничего хуже на свете тарабарщины в атрибуте href. Кроме того, span обрабатывает средний щелчок лучше, чем что-либо еще.

Neurotransmitter 15.08.2016 14:10

Я делаю это для случаев, когда пользователя куда-то не направляют, например, при открытии модального окна. Это приятно, потому что тогда средняя кнопка не по умолчанию пытается открыть ссылку в новой вкладке. Если у меня есть что-то, что перемещает пользователя и, ему разрешено открывать его в новой вкладке, я использую ссылку (тег a с href), чтобы пользователи могли легко открывать новые вкладки с помощью средней мыши или ctrl + click. Если у меня есть что-то, что управляет пользователем, и я не хочу, чтобы он открывал несколько вкладок, то подход с использованием кнопок работает.

ps2goat 12.12.2016 21:51

В зависимости от того, чего вы хотите достичь, вы можете забыть об onclick и просто использовать href:

<a href = "javascript:myJsFunc()">Link Text</a>

Это избавляет от необходимости возвращать false. Мне не нравится опция #, потому что, как уже упоминалось, она выводит пользователя наверх страницы. Если у вас есть куда отправить пользователя, если у него не включен JavaScript (что бывает редко, когда я работаю, но очень хорошая идея), то метод, предложенный Стивом, отлично работает.

<a href = "javascriptlessDestination.html" onclick = "myJSFunc(); return false;">Link text</a>

Наконец, вы можете использовать javascript:void(0), если вы не хотите, чтобы кто-то никуда уходил, и если вы не хотите вызывать функцию JavaScript. Он отлично работает, если у вас есть изображение, с которым должно происходить событие наведения курсора мыши, но пользователю не на что нажимать.

Единственный недостаток этого (по памяти, я могу ошибаться) заключается в том, что IE не считает A как A, если внутри него нет href. (Так что правила CSS не будут работать)

Benjol 26.09.2008 16:01

Я считаю, что вы представляете ложную дихотомию. Это не единственные два варианта.

Я согласен с г-ном D4V360, который предположил, что, даже если вы используете тег привязки, на самом деле у вас здесь нет привязки. Все, что у вас есть, - это специальный раздел документа, который должен вести себя немного иначе. Тег <span> гораздо более уместен.

Кроме того, если вам нужно было заменить a на span, вам нужно не забыть сделать его управляемым с клавиатуры.

AndFisher 18.01.2017 17:42

Если вы используете ссылку как способ только выполнить некоторый код JavaScript (вместо использования диапазона, подобного D4V360), просто выполните:

<a href = "javascript:(function()%7Balert(%22test%22)%3B%7D)()%3B">test</a>

Если вы используете ссылку с onclick для навигации, не используйте href = "#" в качестве запасного варианта, когда JavaScript отключен. Обычно это очень раздражает, когда пользователь нажимает на ссылку. Вместо этого предоставьте ту же ссылку, которую предоставит обработчик onclick, если это возможно. Если вы не можете этого сделать, пропустите onclick и просто используйте URI JavaScript в href.

Это привело бы к ошибке, если бы JS был отключен вместо того, чтобы, казалось бы, ничего не делать или просто перейти в верхнюю часть страницы

mplungjan 14.01.2012 23:24

@mplungjan Если JS выключен, щелчок по нему ничего не сделает, что имеет смысл, если нет альтернативного представления / действия, отличного от js, того, что делает JS. В случае, если href будет "#" или какой-то URI, бесполезно.

Shadow2531 15.01.2012 10:07

Поэтому используйте вместо него href = "jsdisabled.html"

mplungjan 15.01.2012 14:28

@mplungjan Вы могли бы. Но это уводит от страницы.

Shadow2531 16.01.2012 09:52

@mplungjan Понятно. Вы могли бы это сделать. Никаких аргументов. Лично я бы просто имел сообщение «эта страница требует JS» для страницы, которая исчезает при включении JS.

Shadow2531 17.01.2012 08:09

Пользуюсь javascript:void(0).

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

function doSomething() {
    //Some code
    return false;
}

Но потом они забывают использовать return doSomething() в onclick и просто используют doSomething().

Вторая причина, по которой следует избегать #, заключается в том, что последний return false; не будет выполняться, если вызываемая функция выдает ошибку. Следовательно, разработчики также должны не забывать обрабатывать любую ошибку соответствующим образом в вызываемой функции.

Третья причина заключается в том, что бывают случаи, когда свойство события onclick назначается динамически. Я предпочитаю иметь возможность вызывать функцию или назначать ее динамически без необходимости кодировать функцию специально для того или иного метода присоединения. Следовательно, мой onclick (или что-то еще) в разметке HTML выглядит так:

onclick = "someFunc.call(this)"

ИЛИ ЖЕ

onclick = "someFunc.apply(this, arguments)"

Использование javascript:void(0) позволяет избежать всех вышеперечисленных проблем, и я не нашел примеров недостатков.

Итак, если вы одинокий разработчик, вы можете сделать свой собственный выбор, но если вы работаете в команде, вы должны указать:

Используйте href = "#", убедитесь, что onclick всегда содержит return false; в конце, что любая вызываемая функция не выдает ошибку, и если вы динамически присоединяете функцию к свойству onclick, убедитесь, что она не только не выдает ошибку, но и возвращает false.

ИЛИ ЖЕ

Используйте href = "javascript:void(0)"

Со вторым явно намного проще общаться.

Перенесемся в 2013 год: javascript:void(0) нарушает Политика безопасности контента на страницах HTTPS с включенным CSP. Тогда можно было бы использовать href='#' и event.preventDefault() в обработчике, но мне это не очень нравится. Возможно, вы сможете установить соглашение об использовании href='#void' и убедиться, что ни один элемент на странице не имеет id = "void". Таким образом, щелчок по ссылке на несуществующий якорь не будет прокручивать страницу.

jakub.g 01.10.2013 13:21

Вы можете использовать «#», а затем привязать событие щелчка ко всем ссылкам с «#» в качестве href. Это будет сделано в jQuery с помощью: $('a[href = "#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });

Nathan 14.02.2014 08:58

Тем не менее #void добавит запись в историю браузера. Другой способ - использовать URL-адрес ресурса, который возвращает HTTP-статус 204 (и по-прежнему использовать preventDefault - 204 - это просто запасной вариант).

CherryDT 16.02.2021 01:35

Если вы используете элемент <a>, просто используйте это:

<a href = "javascript:myJSFunc();" />myLink</a>

Лично я бы позже прикрепил обработчик событий с помощью JavaScript (используя attachEvent или addEventListener или, может быть, также <поместите сюда свой любимый JavaScript-фреймворк>).

Может ли кто-нибудь объяснить причину, по которой у этого ответа так много голосов против?

Timo Huovinen 16.05.2012 23:36

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

David Granado 15.03.2013 18:31

Я согласен с предложениями в другом месте, в которых говорится, что вы должны использовать обычный URL-адрес в атрибуте href, а затем вызывать некоторую функцию JavaScript в onclick. Недостаток в том, что они автоматически добавляют return false после звонка.

Проблема с этим подходом заключается в том, что если функция не будет работать или возникнут какие-либо проблемы, ссылка станет неактивной. Событие Onclick всегда будет возвращать false, поэтому обычный URL-адрес не вызывается.

Есть очень простое решение. Пусть функция вернет true, если она работает правильно. Затем используйте возвращенное значение, чтобы определить, следует ли отменить щелчок или нет:

JavaScript

function doSomething() {
    alert( 'you clicked on the link' );
    return true;
}

HTML

<a href = "path/to/some/url" onclick = "return !doSomething();">link text</a>

Обратите внимание, что я отрицаю результат функции doSomething(). Если он работает, он вернет true, поэтому он будет инвертирован (false) и path/to/some/URL не будет вызываться. Если функция вернет false (например, браузер не поддерживает что-то, что используется в этой функции, или что-то еще пойдет не так), это инвертируется в true и вызывается path/to/some/URL.

Я рекомендую вместо этого использовать элемент <button>, особенно, если предполагается, что элемент управления производит изменение данных. (Что-то вроде POST.)

Еще лучше, если вы вводите элементы ненавязчиво, что-то вроде прогрессивного улучшения. (См. этот комментарий.)

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

mateuscb 17.10.2011 22:45

Если вы спросите, и ваш href будет выглядеть как "#something", некоторые из других перечисленных ответов могут подойти, но: Без ссылки href на что-либо разумное нет смысла иметь href или даже ссылку в целом. Предлагаемое использование кнопки может подойти или использовать любой другой элемент, кроме ссылки, поблагодарить ссылки нигде.

kontur 16.12.2011 15:09

Еще одно преимущество этого заключается в том, что Bootstrap .btn заставляет кнопки и ссылки выглядеть точно так же.

Ciro Santilli TRUMP BAN IS BAD 19.09.2014 16:42

С точки зрения пользователя button также не вводит # в URL-адрес и не отображает a href как javascript :;

mr_joncollette 19.12.2019 01:38

Обычно у вас всегда должна быть резервная ссылка, чтобы убедиться, что клиенты с отключенным JavaScript по-прежнему имеют некоторые функции. Эта концепция называется ненавязчивым JavaScript.

Пример ... Допустим, у вас есть следующая поисковая ссылка:

<a href = "search.php" id = "searchLink">Search</a>

Вы всегда можете сделать следующее:

var link = document.getElementById('searchLink');

link.onclick = function() {
    try {
        // Do Stuff Here        
    } finally {
        return false;
    }
};

Таким образом, люди с отключенным JavaScript будут перенаправлены на search.php, в то время как ваши зрители с JavaScript будут просматривать ваши расширенные функции.

Лучше было бы использовать jQuery,

$(document).ready(function() {
    $("a").css("cursor", "pointer");
});

и опустить как href = "#", так и href = "javascript:void(0)".

Разметка тега привязки будет похожа на

<a onclick = "hello()">Hello</a>

Достаточно просто!

Вот что я собирался сказать. Если у ссылки есть запасной URL-адрес, который имеет смысл, используйте его. В противном случае просто опустите href или используйте что-то более семантически подходящее, чем <a>. Если единственная причина, по которой все выступают за включение href, состоит в том, чтобы удерживать палец при наведении курсора, простой "a {cursor: pointer;}" сделает свое дело.

Matt Kantor 22.07.2009 17:40

Могу я сказать, что это вариант, которым SO решила пойти. Например, проверьте ссылки "флаг".

mtyaka 24.11.2009 13:19

Это дает ужасную доступность. Попробуйте в SO: вы не можете пометить сообщение без использования мыши. Ссылки «ссылка» и «редактировать» доступны с помощью табуляции, а «флаг» - нет.

Nicolás 07.07.2010 07:51

Я согласен с этим вариантом. Если привязка не имеет иной цели, кроме JavaScript, у нее не должно быть href. @Fatih: использование jQuery означает, что если JavaScript отключен, ссылка НЕ ​​будет иметь указателя.

Scott Rippey 17.06.2011 23:32

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

Muhd 15.12.2011 02:39

Лучше добавить класс js в тело и позволить CSS обрабатывать CSS. body.js a{cursor: pointer;}

AndFisher 18.01.2017 17:45

Просто чтобы поднять то, о чем говорили некоторые другие.

Намного лучше связать событие onload'a или $ ('document'). Ready {}; затем поместить JavaScript непосредственно в событие щелчка.

В случае, если JavaScript недоступен, я бы использовал href для текущего URL-адреса и, возможно, привязку к позиции ссылки. Страницу по-прежнему могут использовать люди без JavaScript, те, у кого есть, не заметят никакой разницы.

Так как он у меня есть, вот несколько jQuery, которые могут помочь:

var [functionName] = function() {
   // do something
};

jQuery("[link id or other selector]").bind("click", [functionName]);

LowPro действительно хорош для ненавязчивого JS, если у вас много сложного поведения.

Matt Kantor 22.07.2009 17:43

Вы также можете написать подсказку в якоре следующим образом:

<a href = "javascript:void('open popup image')" onclick = "return f()">...</a>

чтобы пользователь знал, что делает эта ссылка.

Я использую следующие

<a href = "javascript:;" onclick = "myJsFunc();">Link</a>

вместо

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

Я использую javascript: (без точки с запятой), потому что он лучше всего выглядит в строке состояния при наведении курсора.

Boann 29.07.2012 08:18

Этот код может вызвать неприятные сюрпризы в старом IE. В какой-то момент он использовал для прерывания любых анимационных эффектов с изображениями, включая ролловеры и даже анимированные гифки: groups.google.com/forum/#!topic/comp.lang.javascript/…

Ilya Streltsyn 08.07.2013 20:43

Вы всегда можете сделать ... javascript:void('Do foo'), так как void вернет undefined независимо от того, что даст пользователю индикатор того, что будет делать щелчок. Где Do foo может быть Delete record X или что угодно.

Tracker1 19.12.2014 20:09

Определенно хеш (#) лучше, потому что в JavaScript это псевдосхема:

  1. загрязняет историю
  2. создает новую копию движка
  3. работает в глобальном масштабе и не уважает систему событий.

Конечно, "#" с обработчиком onclick, который предотвращает действие по умолчанию, [намного] лучше. Более того, ссылка, единственная цель которой - запустить JavaScript, на самом деле не является «ссылкой», если только вы не отправляете пользователя на какой-нибудь разумный якорь на странице (просто # отправит наверх), когда что-то пойдет не так. Вы можете просто смоделировать внешний вид ссылки с помощью таблицы стилей и вообще забыть о href.

Кроме того, что касается предложения cowgod, особенно этого: ...href = "javascript_required.html" onclick = "... Это хороший подход, но он не делает различий между сценариями «JavaScript отключен» и «onclick fails».

# лучше, чем javascript:anything, но еще лучше:

HTML:

<a href = "/gracefully/degrading/url/with/same/functionality.ext" class = "some-selector">For great justice</a>

JavaScript:

$(function() {
    $(".some-selector").click(myJsFunc);
});

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

@Muhd: Возврат должен активировать click по ссылкам…

Ry- 11.04.2014 03:47

В полном согласии с общим мнением используйте void(0), когда он вам нужен, и действительный URL-адрес, когда он вам нужен.

Используя Перезапись URL, вы можете создавать URL-адреса, которые не только делают то, что вы хотите делать с отключенным JavaScript, но и сообщают вам, что именно он будет делать.

<a href = "./Readable/Text/URL/Pointing/To/Server-Side/Script" id = "theLinkId">WhyClickHere</a>

На стороне сервера вам просто нужно проанализировать URL-адрес и строку запроса и сделать то, что вы хотите. Если вы сообразительны, вы можете позволить сценарию на стороне сервера по-разному реагировать как на Ajax, так и на стандартные запросы. Позволяет иметь краткий централизованный код, обрабатывающий все ссылки на вашей странице.

Учебники по перезаписи URL

Плюсы

  • Отображается в строке состояния
  • Легко обновляется до Ajax через обработчик onclick в JavaScript
  • Практически сам комментирует
  • Предотвращает засорение ваших каталогов одноразовыми HTML-файлами

Минусы

  • Следует по-прежнему использовать event.preventDefault () в JavaScript
  • Довольно сложная обработка пути и парсинг URL на стороне сервера.

Я уверен, что есть еще масса минусов. Не стесняйтесь их обсуждать.

Здесь нужно помнить еще об одном важном моменте. Соответствие Раздел 508.. Из-за этого я считаю необходимым указать, что вам нужен тег привязки для программ чтения с экрана, таких как Челюсти, чтобы иметь возможность фокусировать его с помощью табуляции. Так что решение «просто используйте JavaScript и забудьте для начала привязку» для некоторых из них не подходит. Запуск JavaScript внутри href необходим только в том случае, если вы не можете позволить экрану вернуться наверх. Вы можете использовать settimeout на 0 секунд и активировать JavaScript там, где вам нужен фокус, но даже страница будет прыгать наверх, а затем обратно.

Я выбираю использовать javascript:void(0), потому что это может помешать щелчку правой кнопкой мыши открыть меню содержимого. Но javascript:; короче и делает то же самое.

Использование только # приводит к забавным движениям, поэтому я бы рекомендовал использовать #self, если вы хотите сэкономить на вводе текста на JavaScript bla, bla,.

Для справки, #self не выглядит особенным. Любой идентификатор фрагмента, который не соответствует имени или идентификатору какого-либо элемента в документе (и не является пустым или «верхним»), должен иметь такой же эффект.

cHao 17.05.2013 20:16

Я настоятельно предпочитаю, чтобы мой JavaScript не попадал в разметку HTML, насколько это возможно. Если я использую <a> в качестве обработчика событий щелчка, я бы рекомендовал использовать <a class = "trigger" href = "#">Click me!</a>.

$('.trigger').click(function (e) {
    e.preventDefault();
    // Do stuff...
});

Очень важно отметить, что многие разработчики считают, что использование тегов привязки для обработчиков событий щелчка нецелесообразно. Они предпочли бы, чтобы вы использовали <span> или <div> с некоторым CSS, который добавляет к нему cursor: pointer;. Это предмет многочисленных споров.

Я в основном перефразирую эта практическая статья с использованием прогрессивного улучшения. Короткий ответ заключается в том, что вы никогда не используете javascript:void(0); или #, если ваш пользовательский интерфейс уже не предполагает, что JavaScript включен, и в этом случае вам следует использовать javascript:void(0);.. Кроме того, не используйте span в качестве ссылок, поскольку это изначально семантически неверно.

Использование дружественных маршрутов URL-адресов SEO в вашем приложении, таких как / Home / Action / Parameters, также является хорошей практикой. Если у вас есть ссылка на страницу, которая сначала работает без JavaScript, вы можете улучшить работу позже. Используйте реальную ссылку на рабочую страницу, а затем добавьте событие onlick для улучшения презентации.

Вот образец. Home / ChangePicture - это рабочая ссылка на форму на странице с пользовательским интерфейсом и стандартными кнопками отправки HTML, но она выглядит лучше в модальном диалоговом окне с кнопками jQueryUI. Любой способ работает в зависимости от браузера, который подходит для разработки в первую очередь для мобильных устройств.

<p><a href = "Home/ChangePicture" onclick = "return ChangePicture_onClick();" title = "Change Picture">Change Picture</a></p>

<script type = "text/javascript">
    function ChangePicture_onClick() {
        $.get('Home/ChangePicture',
              function (htmlResult) {
                  $("#ModalViewDiv").remove(); //Prevent duplicate dialogs
                  $("#modalContainer").append(htmlResult);
                  $("#ModalViewDiv").dialog({
                      width: 400,
                      modal: true,
                      buttons: {
                          "Upload": function () {
                              if (!ValidateUpload()) return false;
                              $("#ModalViewDiv").find("form").submit();
                          },
                          Cancel: function () { $(this).dialog("close"); }
                      },
                      close: function () { }
                  });
              }
        );
        return false;
    }
</script>

С точки зрения SEO я бы предпочел этот путь. Использование как можно большего количества дружественных URL-адресов определенно улучшит коэффициент ценности страницы.

Chetabahana 22.04.2015 01:18

Из ваших слов я понял, что вы хотите создать ссылку только для запуска кода JavaScript.

Тогда вы должны учитывать, что есть люди, которые блокируют JavaScript в своих браузерах.

Поэтому, если вы действительно собираетесь использовать эту ссылку только для запуска функции JavaScript, вам следует добавить ее динамически, чтобы ее даже не было видно, если пользователи не включили свой JavaScript в браузере, а вы используете эту ссылку только для запускать функцию JavaScript, которая не имеет смысла использовать такую ​​ссылку, когда JavaScript отключен в браузере.

По этой причине ни один из них не годится, когда JavaScript отключен.

A и если JavaScript включен, и вы хотите использовать эту ссылку только для вызова функции JavaScript, тогда

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

намного лучше, чем использование

<a href = "#" onclick = "myJsFunc();">Link</a>

потому что href = "#" заставит страницу выполнять действия, которые не нужны.

Кроме того, еще одна причина, по которой <a href = "javascript:void(0)" onclick = "myJsFunc();">Link</a> лучше, чем <a href = "#" onclick = "myJsFunc();">Link</a>, заключается в том, что JavaScript используется в качестве языка сценариев по умолчанию для большинства браузеров. Например, Internet Explorer использует атрибут onclick для определения типа языка сценариев, который будет использоваться. Если не появится другой хороший язык сценариев, Internet Explorer также будет использовать JavaScript по умолчанию, но если другой язык сценариев использует javascript:, это позволит Internet Explorer понять, какой язык сценариев используется.

Учитывая это, я бы предпочел использовать и тренироваться на

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

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

$(document).ready(function(){
    $(".blabla").append('<a href = "javascript:void(0)" onclick = "myJsFunc();">Link</a>')
});

Я честно не предлагаю ни то, ни другое. Для этого я бы использовал стилизованный <button></button>.

button.link {
  display: inline-block;
  position: relative;
  background-color: transparent;
  cursor: pointer;
  border: 0;
  padding: 0;
  color: #00f;
  text-decoration: underline;
  font: inherit;
}
<p>A button that looks like a <button type = "button" class = "link">link</button>.</p>

Таким образом, вы можете назначить свой onclick. Я также предлагаю привязку через скрипт, не используя атрибут onclick в теге элемента. Единственная проблема - это текстовый эффект psuedo 3d в старых IE, который нельзя отключить.


Если вы ДОЛЖЕН используете элемент A, используйте javascript:void(0); по уже упомянутым причинам.

  • Всегда будет перехватывать, если ваше событие onclick не удастся.
  • Не будет происходить ошибочные вызовы загрузки или запускать другие события на основе изменения хэша.
  • Хэш-тег может вызвать неожиданное поведение, если щелчок проваливается (выбросы onclick), избегайте этого, если это не подходящее поведение провала, и вы хотите изменить историю навигации.

ПРИМЕЧАНИЕ. Вы можете заменить 0 строкой, например javascript:void('Delete record 123'), которая может служить дополнительным индикатором, показывающим, что на самом деле будет делать щелчок.

Затем используйте элемент <clickable>. Или <clickabletim>, если хотите. К сожалению, использование нестандартного тега или простого div может затруднить пользователям клавиатуры фокусировку элемента.

joeytwiddle 02.09.2015 15:29

Этот ответ должен быть наверху. Если у вас возникла эта дилемма, скорее всего, вам действительно нужен button. К счастью, IE9 быстро теряет долю рынка, и активный эффект 1px не должен мешать нам использовать семантическую разметку. <a> - это ссылка, она предназначена для того, чтобы вас куда-то отправить, для действий у нас есть <button>.

mjsarfatti 14.03.2016 18:00

Он будет работать как настоящие ссылки с button.link:hover{ text-decoration:underline; }

user5490177 13.11.2019 15:22

Я хотел бы использовать:

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

Причины:

  1. Это делает href простым, в нем нуждаются поисковые системы. Если вы используете что-нибудь еще (например, строку), это может вызвать ошибку 404 not found.
  2. При наведении курсора мыши на ссылку это не означает, что это скрипт.
  3. При использовании return false; страница не перескакивает вверх и не ломает кнопку back.

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

Berker Yüceer 30.12.2011 15:32

Использование <a href = "#" onclick = "myJsFunc();">Link</a> или <a href = "javascript:void(0)" onclick = "myJsFunc();">Link</a> или чего-то еще, что содержит атрибут onclick - было нормально пять лет назад, хотя сейчас это может быть плохой практикой. Вот почему:

  1. Он продвигает навязчивый JavaScript, который, как оказалось, сложно поддерживать и масштабировать. Подробнее об этом в Ненавязчивый JavaScript.

  2. Вы тратите свое время на написание чрезмерно подробного кода, который приносит очень мало пользы (если вообще имеет) для вашей кодовой базы.

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

Ненавязчивый способ JavaScript

Просто нет атрибута href! Любой хороший сброс CSS позаботится об отсутствии стиля курсора по умолчанию, так что это не проблема. Затем прикрепите свои функции JavaScript, используя изящные и ненавязчивые передовые методы, которые более удобны в обслуживании, поскольку ваша логика JavaScript остается в JavaScript, а не в вашей разметке - что важно, когда вы начинаете разрабатывать крупномасштабные приложения JavaScript, которые требуют, чтобы ваша логика была разделена на компоненты и шаблоны в черном ящике. Подробнее об этом в Архитектура крупномасштабных приложений JavaScript

Пример простого кода

// Cancel click event
$('.cancel-action').click(function(){
    alert('Cancel action occurs!');
});

// Hover shim for Internet Explorer 6 and Internet Explorer 7.
$(document.body).on('hover','a',function(){
    $(this).toggleClass('hover');
});
a { cursor: pointer; color: blue; }
a:hover,a.hover { text-decoration: underline; }
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class = "cancel-action">Cancel this action</a>

Пример Backbone.js в черном ящике

Пример масштабируемого компонента Backbone.js с черным ящиком - см. этот рабочий пример jsfiddle здесь. Обратите внимание, как мы используем ненавязчивые методы JavaScript, и в небольшом количестве кода есть компонент, который можно повторять на странице несколько раз без побочных эффектов или конфликтов между различными экземплярами компонентов. Удивительный!

Ноты

  • Отсутствие атрибута href в элементе a приведет к тому, что элемент будет недоступен с помощью клавиш навигации tab. Если вы хотите, чтобы эти элементы были доступны через ключ tab, вы можете установить атрибут tabindex или использовать вместо него элементы button. Вы можете легко стилизовать элементы кнопок, чтобы они выглядели как обычные ссылки, как указано в Ответ Tracker1.

  • Отсутствие атрибута href в элементе a приведет к тому, что Интернет-технологии и Интернет-технологии не будут использовать стиль a:hover, поэтому мы добавили простую прокладку JavaScript, чтобы выполнить это через a.hover. Что совершенно нормально, ведь если у вас нет атрибута href и постепенной деградации, ваша ссылка все равно не будет работать - и у вас возникнут более серьезные проблемы, о которых нужно беспокоиться.

  • Если вы хотите, чтобы ваше действие по-прежнему работало с отключенным JavaScript, используйте элемент a с атрибутом href, который переходит на некоторый URL-адрес, который будет выполнять действие вручную, а не через запрос Ajax или что-то еще. Если вы делаете это, то вы хотите убедиться, что вы выполняете event.preventDefault() при вызове щелчка, чтобы убедиться, что при нажатии кнопки она не переходит по ссылке. Этот вариант называется постепенной деградацией.

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

redanimalwar 07.02.2021 12:35

Вот еще один вариант для полноты, который не позволяет ссылке что-либо делать, даже если JavaScript отключен, и он короткий :)

<a href = "#void" onclick = "myJsFunc()">Run JavaScript function</a>

Если идентификатор отсутствует на странице, ссылка не будет делать ничего.

Как правило, я согласен с ответом Аарона Вагнера, ссылка JavaScript должна быть вставлена ​​с кодом JavaScript в документ.

В HTML5 большинство ограничений на идентификаторы снято, поэтому они могут начинаться с числа. Единственные ограничения теперь заключаются в том, что они должны быть уникальными и не должны содержать пробелов. См. whatwg.org/specs/web-apps/current-work/multipage/…. Кроме того, ваше решение изменяет URL-адрес и вставляет запись в историю, загрязняя кнопку «Назад» бесполезными состояниями.

Andy E 16.05.2012 17:07

@AndyE да, вы правы, я не знал, что id может начинаться с цифр, также это решение никогда не предназначалось для того, чтобы быть хорошим или рекомендованным, я добавил его "ради полноты" о количестве способов сделать это.

Timo Huovinen 16.05.2012 17:16

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

А) Я счастлив иметь javascript:void(0) в качестве значения href:

<a href = "javascript:void(0)" onclick = "someFunc.call(this)">Link Text</a>

Б) Я использую jQuery и хочу, чтобы # был моим значением href:

<a href = "#" onclick = "someFunc.call(this)">Link Text</a>

<script type = "text/javascript">
    /* Stop page jumping when javascript links are clicked.
       Only select links where the href value is a #. */
    $('a[href = "#"]').live("click", function(e) {
         return false; // prevent default click action from happening!
         e.preventDefault(); // same thing as above
    });
</script>

Обратите внимание: если вы знаете, что ссылки не будут создаваться динамически, используйте вместо этого функцию click:

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

Когда у меня есть несколько фальшивых ссылок, я предпочитаю давать им класс «без ссылок».

Затем в jQuery я добавляю следующий код:

$(function(){
   $('.no-link').click(function(e){
       e.preventDefault();
   });
});

А для HTML ссылка просто

<a href = "/" class = "no-link">Faux-Link</a>

Мне не нравится использовать хэш-теги, если они не используются для якорей, и я делаю это только тогда, когда у меня больше двух фальшивых ссылок, в противном случае я использую javascript: void (0).

<a href = "javascript:void(0)" class = "no-link">Faux-Link</a>

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

Вы можете использовать href и удалить все ссылки, в которых есть только хеши:

HTML:

<a href = "#" onclick = "run_foo()"> foo </a>

JS:

$(document).ready(function(){         // on DOM ready or some other event

   $('a[href=#]').attr('href','');    // set all reference handles to blank strings
                                      //  for anchors that have only hashes

});

Это плохо, особенно в IE (до версии 10, насчет 11 не уверен). Щелчок по ссылке с пустым href приводит к запуску ненужного (и, возможно, нежелательного) запроса, а в IE он пытается открыть проводник Windows.

squidbe 04.03.2014 02:12

@squidbe: Это был старый ответ, но я думаю, это зависит от того, как написан ваш JS. Если вы не хотите, чтобы это сработало, я думаю, вы бы onclick = "return run_foo()" и run_foo вернули false или просто добавили строку return false после вызова функции. Суть этого ответа заключалась в том, что вы можете удалить теги href, когда JS включен. Идеальным решением было бы заполнить href отказоустойчивой ссылкой, скорее всего, на страницу, отображаемую на стороне сервера href = "render/full_page.script?arg=value" onclick = "loadAJAXContent.call(this); return false".

vol7ron 02.06.2014 20:13

Вы правы насчет безотказного решения. Я хотел сказать, что значение атрибута href никогда не должно быть пустой строкой, и установка его на пустое значение может вызвать нежелательные побочные эффекты. Даже когда вы возвращаете false, если в вашем скрипте есть ошибки, нежелательный запрос и нежелательное поведение Windows все равно возникают. Если есть вариант между оставлением хеша в href и его удалением с помощью скрипта, я думаю, что лучше оставить его.

squidbe 02.06.2014 22:03

Вы не следует использовать встроили onclick = "something();" в свой HTML, чтобы не засорять его бессмысленным кодом; все привязки кликов должны быть установлены в файлах Javascript (* .js).

Установите привязку так: $('#myAnchor').click(function(){... **return false**;}); или $('#myAnchor').bind('click', function(){... **return false**;});

Тогда у вас есть чистый HTML-файл, который легко загружать (и оптимизировать поисковую оптимизацию) без тысяч href = "javascript:void(0);" и просто href = "#".

это не отвечает на вопрос, что делать с href. если у вас нет атрибута href в теге a, он не будет отображаться в виде интерактивной ссылки.

user428517 12.08.2013 18:17

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

ryabenko-pro 22.10.2013 16:55

Если вы используете AngularJS, вы можете использовать следующее:

<a href = "">Do some fancy JavaScript</a>

Которая ни к чему не приведет.

Кроме того

  • Это не приведет вас к началу страницы, как в случае с (#)
    • Следовательно, вам не нужно явно возвращать false с помощью JavaScript.
  • Это коротко лаконично

Но это приведет к перезагрузке страницы, а поскольку мы всегда используем javascript для изменения страницы, это недопустимо.

Henry Hu 30.07.2013 04:16

@HenryHu Я понял, что причина, по которой он не перезагружается, была из-за AngularJS. Смотрите мой обновленный ответ.

whirlwin 30.07.2013 14:46

Итак, когда вы выполняете некоторые операции JavaScript с тегом <a /> и если вы также помещаете href = "#", вы можете добавить вернуть ложь в конце события (в случае привязки встроенного события), например:

<a href = "#" onclick = "myJsFunc(); return false;">Run JavaScript Code</a>

Или вы можете изменить атрибут href с помощью JavaScript, например:

<a href = "javascript://" onclick = "myJsFunc();">Run JavaScript Code</a>

или же

<a href = "javascript:void(0)" onclick = "myJsFunc();">Run JavaScript Code</a>

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

Вместо этого вы можете просто использовать <button /> для выполнения каких-либо действий или любого другого элемента, такого как b, span или того, что подходит вам в соответствии с вашими потребностями, потому что вам разрешено добавлять события ко всем элементам.


Итак, есть одно преимущество для использования <a href = "#">. Вы получаете указатель курсора по умолчанию на этом элементе, когда выполняете a href = "#". Для этого, я думаю, вы можете использовать CSS, например cursor:pointer;, который также решает эту проблему.

И в конце, если вы привязываете событие из самого кода JavaScript, вы можете сделать event.preventDefault() для достижения этого, если вы используете тег <a>, но если вы не используете тег <a> для этого, вы получаете преимущество, вам не нужно этого делать.

Итак, если вы видите, лучше не использовать теги для такого рода вещей.

Я использую href = "#" для ссылок, для которых я хочу фиктивное поведение. Затем я использую этот код:

$(document).ready(function() {
    $("a[href='#']").click(function(event) {
        event.preventDefault();
    });
});

Это означает, что если href равен хешу (* = "#"), он предотвращает поведение ссылки по умолчанию, тем самым по-прежнему позволяя вам писать для нее функции, и это не влияет на щелчки привязки.

Я бы сказал, что лучший способ - привязать href к идентификатору, который вы никогда не будете использовать, например # Do1Not2Use3This4Id5 или аналогичному идентификатору, который вы на 100% уверены, что никто не будет использовать и не обидит людей.

  1. Javascript:void(0) - плохая идея и нарушает политику безопасности контента на HTTPS-страницах с поддержкой CSP https://developer.mozilla.org/en/docs/Security/CSP (спасибо @ jakub.g)
  2. Использование только # заставит пользователя вернуться наверх при нажатии
  3. Не испортит страницу, если JavaScript не включен (если у вас нет кода обнаружения JavaScript.
  4. Если включен JavaScript, вы можете отключить событие по умолчанию.
  5. Вы должны использовать href, если не знаете, как запретить браузеру выбирать какой-либо текст (не знаю, удалит ли использование 4 то, что мешает браузеру выбирать текст)

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

Я лично использую их в сочетании. Например:

HTML

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

с небольшим количеством jQuery

$('a[href = "#"]').attr('href','javascript:void(0);');

или же

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

Но я использую это только для предотвращения перехода страницы наверх, когда пользователь нажимает на пустую привязку. Я редко использую onClick и другие события on непосредственно в HTML.

Я предлагаю использовать элемент <span> с атрибутом class вместо якорь. Например:

<span class = "link">Link</span>

Затем назначьте функцию .link с помощью сценария, заключенного в тело и непосредственно перед тегом </body> или во внешнем документе JavaScript.

<script>
    (function($) {
        $('.link').click(function() {
            // do something
        });
    })(jQuery);
</script>

*Примечание: Для динамически создаваемых элементов используйте:

$('.link').on('click', function() {
    // do something
});

А для динамически создаваемых элементов, которые создаются с помощью динамически создаваемых элементов, используйте:

$(document).on('click','.link', function() {
    // do something
});

Затем вы можете стилизовать элемент span, чтобы он выглядел как якорь с небольшим CSS:

.link {
    color: #0000ee;
    text-decoration: underline;
    cursor: pointer;
}
.link:active {
    color: red;
}

Вот пример вышеупомянутого jsFiddle.

Почему бы не использовать это? Это не прокручивает страницу вверх.

<span role = "button" onclick = "myJsFunc();">Run JavaScript Code</span>

На самом деле это кажется очень хорошим решением, спасибо. Я заменил href = "#" на role = "button" везде, а затем вставил *[role = "button"] { cursor:pointer; } в CSS, и это, кажется, работает очень хорошо без необходимости в ненужном JS :)

Alex Yorke 29.12.2014 23:20

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

Martin 14.03.2017 17:18

Да, при нажатии клавиши TAB невозможно перейти к нему. Использование tabindex = "0" может улучшить ситуацию, но я не уверен, что это подходящее решение.

Hrvoje Golcic 26.11.2019 18:15

Спустя 5 лет после ответа я тоже рассматриваю a11y фичи :)

AlxGol 27.11.2019 10:43

Я обычно иду за

<a href = "javascript:;" onclick = "yourFunction()">Link description</a>

Он короче, чем javascript: void (0), и делает то же самое.

Не используйте ссылки исключительно для запуска JavaScript.

Использование href = "#" прокручивает страницу вверх; использование void (0) создает проблемы с навигацией в браузере.

Вместо этого используйте элемент, отличный от ссылки:

<span onclick = "myJsFunc()" class = "funcActuator">myJsFunc</span>

И стилизуем его с помощью CSS:

.funcActuator { 
  cursor: default;
}

.funcActuator:hover { 
  color: #900;
}

Используйте кнопку, а не диапазон. Кнопки, естественно, попадают в порядок фокусировки, поэтому к ним можно получить доступ без мыши / трекпада и т. д.

Quentin 15.06.2016 15:12

Добавление тонного комментария Квентина: как написано в настоящее время, пользователи клавиатуры не смогут добраться до элемента span, потому что это не фокусируемый элемент. Вот почему вам нужна кнопка.

Tsundoku 25.07.2017 16:09

Вы можете сделать его фокусируемым, добавив tabindex = "0" к диапазону. Тем не менее, использовать кнопку лучше, потому что она дает вам желаемую функциональность бесплатно. Чтобы сделать его доступным с помощью диапазона, вам нужно не только присоединить обработчик кликов, но и обработчик событий клавиатуры, который ищет нажатие клавиши пробела или клавиши ввода, а затем запускает обычный обработчик кликов. Вы также можете изменить второй селектор CSS на .funcActuator:hover, .funcActuator:focus, чтобы тот факт, что элемент имеет фокус, был очевиден.

Useless Code 22.11.2017 14:45

Я попробовал оба в google chrome с инструментами разработчика, и id = "#" занял 0,32 секунды. В то время как метод javascript:void(0) занял всего 0,18 секунды. Так что в google chrome javascript:void(0) работает лучше и быстрее.

На самом деле они не делают то же самое. # заставляет вас перейти в начало страницы.

Jochen Schultz 21.09.2017 13:58

На современном веб-сайте следует избегать использования href, если элемент выполняет только функции JavaScript (а не настоящую ссылку).

Почему? Наличие этого элемента сообщает браузеру, что это ссылка с местом назначения. При этом браузер покажет функцию «Открыть в новой вкладке / окне» (также срабатывает, когда вы используете Shift + щелчок). Это приведет к открытию той же страницы без срабатывания нужной функции (что приведет к разочарованию пользователя).

Что касается IE: Начиная с IE8, стили элементов (включая наведение курсора) работают, если задан doctype. О других версиях IE больше не о чем беспокоиться.

Единственный недостаток: Удаление HREF удаляет tabindex. Чтобы преодолеть это, вы можете использовать кнопку, стилизованную под ссылку, или добавить атрибут tabindex с помощью JS.

Модальные окна начальной загрузки до 4.0 имеют в основном недокументированное поведение, заключающееся в том, что они загружают href из элементов a с помощью AJAX, если только они не соответствуют #. Если вы используете Bootstrap 3, javascript:void(0); hrefs вызовет ошибки javascript:

AJAX Error: error GET javascript:void(0);

В этих случаях вам нужно будет перейти на bootstrap 4 или изменить href.

Отредактировано в январе 2019 г.

В HTML5 использование элемента a без атрибута href - это действительный. Считается "гиперссылка-заполнитель"

If the a element has no href attribute, then the element represents a placeholder for where a link might otherwise have been placed, if it had been relevant, consisting of just the element's contents.

Пример:

<a>previous</a>

Если после этого вы захотите поступить иначе:

1 - Если ваша ссылка никуда не ведет, не используйте элемент <a>. Используйте <span> или что-то еще подходящее и добавьте CSS :hover, чтобы стилизовать его по своему усмотрению.

2 - Используйте javascript:void(0) ИЛИ javascript:undefined ИЛИ javascript:;, если вы хотите быть сырым, точным и быстрым.

Javascript: void(0); недействителен до нулевого значения [Не назначен], что означает, что ваш браузер перейдет к NULL, щелкните по ДОМ, а окно вернется к false. • '#' не соответствует DOM или Window в javascript. что означает, что знак '#' внутри привязки href - это СВЯЗЬ. Ссылка на то же текущее направление.

Вы можете использовать здесь javascript: void (0) вместо #, чтобы остановить перенаправление тега привязки в раздел заголовка.

function helloFunction() {
    alert("hello world");
}
<a href = "javascript:void(0)" onclick = "helloFunction();">Call Hello Function</a>

Самый простой и обычно используемый всеми - javascript: void (0). Вы можете использовать его вместо #, чтобы остановить перенаправление тега в раздел заголовка.

<a href = "javascript:void(0)" onclick = "testFunction();">Click To check Function</a>

function testFunction() {
    alert("hello world");
}

На самом деле здесь есть четыре варианта.

Использование return false; позволяет вам сохранить версию привязки в тех случаях, когда вам нужен безопасный «запасной вариант» в браузерах с JavaScript отключен или он не поддерживается в пользовательском агенте (сейчас 1-5% пользователей). Вы можете использовать знак привязки «#», пустую строку или специальный URL-адрес для hrefесли ваш скрипт не сработает. Обратите внимание, что вы должны использовать href, чтобы программы чтения с экрана знали, что это гиперссылка. (Примечание: я не собираюсь вдаваться в аргументы об удалении атрибута href, поскольку этот вопрос здесь спорный. Без href на якоре якорь больше не является гиперссылкой, а просто тегом html с событием щелчка на нем захвачен.)

<a href = "" onclick = "alert('hello world!');return false;">My Link</a>
<a href = "#" onclick = "alert('hello world!');return false;">My Link</a>
<a href = "MyFallbackURL.html" onclick = "alert('hello world!');return false;">My Link</a>

Ниже представлен наиболее популярный сегодня дизайн, использующий javascript:void(0) внутри атрибута href. Если браузер не поддерживает сценарии, он должен снова отправить сообщение обратно на свою страницу, поскольку для пути гиперссылки href возвращается пустая строка. Используйте это, если вам все равно, кто поддерживает JavaScript.

<a href = "javascript:void(0);" onclick = "alert('hello world!');">My Link</a>

Другие вопросы по теме