Ниже приведены два метода создания ссылки, единственной целью которой является запуск кода 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>
javascript
html
performance
optimization
href
Peter Mortensen
источник
источник
<a href="javascript:void(0)" onclick="myJsFunc();">
имеет абсолютно никакого смысла. Если вы должны использоватьjavascript:
псевдо-протокол, вам также не нужен этотonclick
атрибут.<a href="javascript:myJsFunc();">
все будет хорошо.myJsFunc()
возвращаемое значение, ваша страница сломается. jsfiddle.net/jAd9G Вы бы все равно придется использоватьvoid
вот так:<a href="javascript:void myJsFunc();">
. Но тогда поведение все равно будет другим. Вызов ссылки через контекстное меню не вызываетclick
событие.<a href="javascript:;" onclick="myEvent()"
?javascript:;
гораздо быстрее, чем печататьjavascript:void(0)
<a>
тег, если вы хотите НЕ открывать другую страницу с помощью встроенной функции браузера, а иметь какое-то действие javascript 'action' для запуска? Просто используйтеspan
тег с классомjs-trigger
будет, вероятно, намного лучше ". Или я что-то упустил?Ответы:
Я использую
javascript:void(0)
.Три причины Поощрение использования
#
команды разработчиков неизбежно приводит к тому, что некоторые используют возвращаемое значение функции, которая называется так:Но потом они забывают использовать
return doSomething()
в onclick и просто использоватьdoSomething()
.Вторая причина, по которой следует избегать,
#
заключается в том, что finalreturn false;
не будет выполняться, если вызываемая функция выдает ошибку. Следовательно, разработчики также должны помнить, чтобы обрабатывать любую ошибку соответствующим образом в вызываемой функции.Третья причина заключается в том, что в некоторых случаях
onclick
свойство события назначается динамически. Я предпочитаю иметь возможность вызывать функцию или назначать ее динамически, без необходимости кодировать функцию специально для того или иного метода вложения. Отсюда мойonclick
(или на что-нибудь) в разметке HTML выглядит следующим образом:ИЛИ
Использование
javascript:void(0)
позволяет избежать всех вышеперечисленных головных болей, и я не нашел примеров недостатков.Так что, если вы одинокий разработчик, вы можете сделать свой собственный выбор, но если вы работаете в команде, вы должны заявить:
Используйте
href="#"
, убедитесь, что в концеonclick
всегда указываетсяreturn false;
, что любая вызываемая функция не выдает ошибку, и если вы динамически присоединяете функцию кonclick
свойству, убедитесь, что она не выдает ошибку, а возвращаетfalse
.ИЛИ
использование
href="javascript:void(0)"
Со вторым явно гораздо проще общаться.
источник
href="javascript:void(0)"
методjavascript:
должно считаться плохой практикой, навязчивым и не грациозным.event.preventDefault()
предназначены именно для того, чтобы предотвратить поведение по умолчанию (например, перейти в начало страницы в этом случае) и сделать это лучше, безreturn false;
сумасшествия.javascript:void(0)
нарушает политику безопасности содержимого на страницах HTTPS с поддержкой CSP. Один из вариантов будет тогда использоватьhref='#'
иevent.preventDefault()
в обработчике, но мне это не очень нравится. Возможно, вы можете установить соглашение для использованияhref='#void'
и убедиться, что ни один элемент на странице не имеетid="void"
. Таким образом, нажатие на ссылку на несуществующий якорь не будет прокручивать страницу.href
. Это будет сделано в jQuery с:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
Ни.
Если у вас есть реальный URL, который имеет смысл, используйте его как HREF. Onclick не сработает, если кто-то щелкнет по вашей ссылке средней кнопкой мыши, чтобы открыть новую вкладку, или если у него отключен JavaScript.
Если это невозможно, то вы должны как минимум внедрить тег привязки в документ с помощью JavaScript и соответствующих обработчиков событий щелчка.
Я понимаю, что это не всегда возможно, но, по моему мнению, к этому следует стремиться при разработке любого общедоступного веб-сайта.
Проверьте ненавязчивый JavaScript и прогрессивное улучшение (обе Википедии).
источник
javascript:
или#
обоих плохих методов и не должен поощряться. Хорошие статьи между прочим.<button>
было сделано именно для этого. Но согласился: это, вероятно, не должно быть конкретно,<a>
если нет подходящего места для ссылки.Делать
<a href="#" onclick="myJsFunc();">Link</a>
или<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>
что-то еще, что содержитonclick
атрибут - было хорошо пять лет назад, хотя сейчас это может быть плохой практикой. Вот почему:Он продвигает практику навязчивого JavaScript - который оказался сложным в обслуживании и трудно масштабируемым. Подробнее об этом в ненавязчивом JavaScript .
Вы тратите свое время на написание невероятно многословного кода - который имеет очень мало (если таковые имеются) выгоды для вашей кодовой базы.
В настоящее время существуют лучшие, более простые и более поддерживаемые и масштабируемые способы достижения желаемого результата.
Ненавязчивый способ JavaScript
Просто не имеют
href
атрибута вообще! Любой хороший сброс CSS позаботится о отсутствующем стиле курсора по умолчанию, так что это не проблема. Затем добавьте свою функциональность JavaScript, используя изящные и ненавязчивые передовые практики, которые более удобны в обслуживании, поскольку логика JavaScript остается в JavaScript, а не в разметке, что очень важно, когда вы начинаете разрабатывать крупномасштабные приложения JavaScript, которые требуют, чтобы ваша логика была разбита на черные компоненты и шаблоны. Подробнее об этом в крупномасштабной архитектуре приложений JavaScriptПростой пример кода
Blackboxed Backbone.js пример
Для масштабируемого примера компонента Blackbed Backbone.js - см. Этот рабочий пример jsfiddle здесь . Обратите внимание, как мы используем ненавязчивые практики JavaScript, и в крошечном объеме кода есть компонент, который можно повторять по всей странице несколько раз без побочных эффектов или конфликтов между различными экземплярами компонента. Удивительно!
Ноты
Пропуск
href
атрибутаa
элемента приведет к тому, что элемент будет недоступен с помощьюtab
клавиш навигации. Если вы хотите, чтобы эти элементы были доступны черезtab
ключ, вы можете установитьtabindex
атрибут или использоватьbutton
элементы вместо этого. Вы можете легко стилизовать элементы кнопок, чтобы они выглядели как обычные ссылки, как указано в ответе Tracker1 .Пропуск
href
атрибута вa
элементе приведет к тому, что Internet Explorer 6 и Internet Explorer 7 не примутa:hover
стилизацию, поэтому мы добавили простую оболочку JavaScript, чтобы выполнить это черезa.hover
. Это совершенно нормально, так как если у вас нет атрибута href и нет постепенного ухудшения качества, тогда ваша ссылка все равно не будет работать - и у вас будут большие проблемы, о которых нужно беспокоиться.Если вы хотите, чтобы ваше действие по-прежнему работало с отключенным JavaScript, то используйте
a
элемент сhref
атрибутом, который идет по какому-либо URL-адресу, который будет выполнять действие вручную, а не с помощью Ajax-запроса или любого другого способа. Если вы делаете это, то вы хотите убедиться, что вы делаетеevent.preventDefault()
вызов, чтобы убедиться, что при нажатии кнопки она не переходит по ссылке. Этот вариант называется изящной деградацией.источник
button
предложенный здесь стиль ссылки связан с неизбежным активным состоянием «3d» в IE9 и ниже .javascript:void(0)
. Это прагматичный ответ и единственный разумный ответ в реальном мире.'#'
перенесет пользователя обратно в начало страницы, так что я обычно иду сvoid(0)
.javascript:;
также ведет себя какjavascript:void(0);
источник
#
или#something
приведет вас к этому якору на странице базового href , а не на текущей странице.#!
) добивается цели , но это определенно плохая практика.Я бы честно не предложил ни того, ни другого. Я бы использовал стилизованный
<button></button>
для этого поведения.Таким образом, вы можете назначить свой клик. Я также предлагаю связывать через скрипт, не используя
onclick
атрибут тега элемента. Единственный недостаток - это текстовый эффект psuedo в старых IE, который нельзя отключить.Если вы ДОЛЖНЫ использовать элемент A, используйте его
javascript:void(0);
по причинам, уже упомянутым.ПРИМЕЧАНИЕ. Вы можете заменить
0
строку на такую,javascript:void('Delete record 123')
которая может служить дополнительным индикатором, который покажет, что на самом деле будет делать щелчок.источник
<button>
аinput type=button
вместо этого?<clickable>
элемент. Или,<clickabletim>
если вы предпочитаете. К сожалению, использование нестандартного тега или простого div может затруднить фокусировку элемента на клавиатуре.button
. И, к счастью, IE9 быстро теряет доли рынка, и активный эффект в 1px не должен мешать нам использовать семантическую разметку.<a>
это ссылка, она предназначена для того, чтобы отправить вас куда-нибудь, для наших действий<button>
.Первый, в идеале с реальной ссылкой, чтобы следовать в случае, если у пользователя отключен JavaScript. Просто убедитесь, что вы вернули false, чтобы предотвратить запуск события click при выполнении JavaScript.
Если вы используете Angular2, этот способ работает:
<a [routerLink]="" (click)="passTheSalt()">Click me</a>
,Смотрите здесь https://stackoverflow.com/a/45465728/2803344
источник
Ни один, если вы спросите меня;
Если ваша «ссылка» имеет единственную цель - запустить какой-либо код JavaScript, она не может рассматриваться как ссылка; скорее кусок текста с функцией JavaScript, связанной с ним. Я бы рекомендовал использовать
<span>
тег сonclick handler
прикрепленным к нему и несколько базовых CSS для имитации ссылки. Ссылки сделаны для навигации, и если ваш код JavaScript не для навигации, это не должен быть<a>
тег.Пример:
источник
<span>
s не предназначены, чтобы сделать что-нибудь.<A>
nchors и<buttons>
используются для этого!buttons
- лучший выбор, а использованиеspan
- нет.В идеале вы бы сделали это:
Или, что еще лучше, у вас будет ссылка действия по умолчанию в HTML, и вы добавите событие onclick к элементу незаметно через JavaScript после рендеринга DOM, таким образом гарантируя, что если JavaScript не присутствует / не используется, вы не сделаете иметь бесполезные обработчики событий, которые запутывают ваш код и потенциально запутывают (или, по крайней мере, отвлекают) ваш фактический контент.
источник
Использование просто
#
делает несколько забавных движений, поэтому я рекомендую использовать,#self
если вы хотите сэкономить на печатании усилийJavaScript bla, bla,
.источник
#self
для именованных тегов и избежать раздражающего поведения браузера при переходе на верх страницы. Спасибо.#self
не кажется особенным. Любой идентификатор фрагмента, который не соответствует имени или идентификатору какого-либо элемента в документе (и не является пустым или «верхним»), должен иметь такой же эффект.#void
соглашение в другом комментарии, но на самом деле#self
он настолько короткий и его легко запомнить. Что-нибудь лучше чем#
Я использую следующее
вместо
источник
javascript:
(без точки с запятой), потому что он выглядит наиболее аккуратно в строке состояния при наведении курсора.javascript:void('Do foo')
так как void будет возвращать неопределенное значение независимо, это даст пользователю индикатор того, что будет делать щелчок. ГдеDo foo
может бытьDelete record X
или что угодно.Я согласен с предложениями в другом месте, утверждающими, что вы должны использовать обычный URL-адрес в
href
атрибуте, а затем вызывать некоторую функцию JavaScript в onclick. Недостаток в том, что они автоматически добавляютсяreturn false
после звонка.Проблема этого подхода заключается в том, что если функция не будет работать или возникнут какие-либо проблемы, ссылка станет неактивной. Событие Onclick всегда будет возвращаться
false
, поэтому обычный URL не будет вызываться.Там очень простое решение. Пусть функция вернется,
true
если она работает правильно. Затем используйте возвращенное значение, чтобы определить, следует ли отменить щелчок или нет:JavaScript
HTML
Обратите внимание, что я отрицаю результат
doSomething()
функции. Если он работает, он вернетсяtrue
, поэтому он будет отменен (false
) иpath/to/some/URL
не будет вызван. Если функция вернетсяfalse
(например, браузер не поддерживает что-то используемое внутри функции или что-то еще идет не так), она отменяетсяtrue
иpath/to/some/URL
вызывается.источник
#
лучше чемjavascript:anything
, но следующее даже лучше:HTML:
JavaScript:
Вы должны всегда стремиться к постепенной деградации (в случае, если у пользователя не включен JavaScript ... и когда у него есть спецификации и бюджет). Кроме того, считается плохой формой использовать атрибуты JavaScript и протокол непосредственно в HTML.
источник
click
по ссылкам ...<button>
Вместо этого я рекомендую использовать элемент, особенно если предполагается, что элемент управления приведет к изменению данных. (Что-то вроде ПОЧТЫ.)Еще лучше, если вы будете вводить элементы ненавязчиво, тип прогрессивного улучшения. (Смотрите этот комментарий .)
источник
.btn
делает кнопки и ссылки выглядят одинаково.button
также не вводит # в URL и не показываетa
href как javascript :;Если вы не пишете ссылку, используя JavaScript (чтобы вы знали, что она включена в браузере), в идеале вы должны предоставить правильную ссылку для людей, которые просматривают с отключенным JavaScript, а затем запретить действие ссылки по умолчанию в вашем клике. обработчик события. Таким образом, те, у кого включен JavaScript, будут запускать эту функцию, а те, у кого JavaScript отключен, будут переходить на соответствующую страницу (или местоположение на той же странице), а не просто нажимать на ссылку и ничего не произойдет.
источник
Определенно hash (
#
) лучше, потому что в JavaScript это псевдосхема:Конечно, «#» с обработчиком onclick, который предотвращает действие по умолчанию, [намного] лучше. Более того, ссылка, единственная цель которой - запустить JavaScript, на самом деле не является «ссылкой», если вы не отправляете пользователя на какой-нибудь разумный якорь на странице (просто # отправит наверх), когда что-то идет не так. Вы можете просто смоделировать внешний вид связи с таблицей стилей и вообще забыть о href.
Кроме того, в отношении предложения cowgod, в частности:
...href="javascript_required.html" onclick="...
это хороший подход, но он не различает сценарии «JavaScript отключен» и «onclick fails».источник
Я обычно иду на
Он короче javascript: void (0) и делает то же самое.
источник
Я хотел бы использовать:
Причины:
href
простые поисковые системы нужными. Если вы используете что-то еще (например, строку), это может вызвать404 not found
ошибку.return false;
страница не переходит наверх и не ломаетback
кнопку.источник
Я выбираю использование
javascript:void(0)
, потому что использование этого может предотвратить щелчок правой кнопкой мыши, чтобы открыть меню содержимого. Ноjavascript:;
короче и делает то же самое.источник
Таким образом, когда вы делаете некоторые вещи JavaScript с
<a />
тегом и, если выhref="#"
также добавляете, вы можете добавить return false в конце события (в случае встроенного связывания события), например:Или вы можете изменить атрибут href с помощью JavaScript, например:
или
Но с семантической точки зрения все вышеперечисленные способы достижения этого неверны (хотя он работает нормально) . Если какой-либо элемент не создан для навигации по странице и с ней связаны некоторые вещи JavaScript, то он не должен быть
<a>
тегом.<button />
Вместо этого вы можете просто использовать a для выполнения действий или любого другого элемента, такого как b, span или любого другого, который вам подходит, в соответствии с вашими потребностями, потому что вам разрешено добавлять события на все элементы.Так, есть одна выгода для использования
<a href="#">
. Вы получаете указатель курсора по умолчанию на этом элементе, когда вы делаетеa href="#"
. Для этого, я думаю, вы можете использовать CSS для этого,cursor:pointer;
который также решает эту проблему.И, наконец, если вы связываете событие с самим кодом JavaScript, вы можете сделать
event.preventDefault()
это, если вы используете<a>
тег, но если вы не используете<a>
тег для этого, вы получаете преимущество, вы не Это не нужно делать.Так что, если вы видите, лучше не использовать тег для такого рода вещей.
источник
Не используйте ссылки с единственной целью запуска JavaScript.
Использование href = "#" прокручивает страницу вверх; использование void (0) создает проблемы с навигацией в браузере.
Вместо этого используйте элемент, отличный от ссылки:
И стиль с помощью CSS:
источник
span
элемента, потому что это элемент без фокуса. Вот почему вам нужна кнопка.tabindex="0"
к промежутку. Тем не менее, использование кнопки лучше, потому что она дает вам желаемую функциональность бесплатно. Чтобы сделать его доступным с помощью диапазона, вам нужно не только прикрепить обработчик щелчков, но и обработчик событий клавиатуры, который ищет нажатия пробела или клавиши ввода, а затем запускает обычный обработчик щелчков. Вы также хотели бы изменить второй селектор CSS,.funcActuator:hover, .funcActuator:focus
чтобы тот факт, что элемент имеет фокус, очевиден.Было бы лучше использовать JQuery,
и опустить оба
href="#"
иhref="javascript:void(0)"
.Разметка якорного тега будет выглядеть
Достаточно просто!
источник
Если вы используете AngularJS , вы можете использовать следующее:
Который не будет ничего делать.
К тому же
false
с JavaScriptисточник
Если нет,
href
возможно, нет причин использовать тег привязки.Вы можете прикрепить события (щелчок, наведение и т. Д.) Практически к каждому элементу, так почему бы просто не использовать a
span
или adiv
?И для пользователей с отключенным JavaScript: если нет запасного варианта (например, альтернативы
href
), они должны, по крайней мере, вообще не иметь возможности видеть и взаимодействовать с этим элементом, независимо от того, является<a>
ли он<span>
тегом или тегом.источник
Обычно у вас всегда должна быть запасная ссылка, чтобы убедиться, что клиенты с отключенным JavaScript все еще имеют некоторые функции. Эта концепция называется ненавязчивым JavaScript.
Пример ... Допустим, у вас есть следующая поисковая ссылка:
Вы всегда можете сделать следующее:
Таким образом, люди с отключенным JavaScript направляются на
search.php
то, чтобы ваши зрители с помощью JavaScript могли просматривать вашу расширенную функциональность.источник
Я лично использую их в сочетании. Например:
HTML
с небольшим количеством JQuery
или
Но я использую это только для предотвращения перехода страницы наверх, когда пользователь нажимает на пустой якорь. Я редко использую onClick и другие
on
события прямо в HTML.Мое предложение было бы использовать
<span>
элемент сclass
атрибутом вместо якоря. Например:Затем назначьте функцию
.link
сценарию, заключенному в тело и непосредственно перед</body>
тегом или во внешний документ JavaScript.* Примечание: для динамически создаваемых элементов используйте:
А для динамически создаваемых элементов, которые создаются с помощью динамически создаваемых элементов, используйте:
Затем вы можете стилизовать элемент span, чтобы он выглядел как якорь с небольшим CSS:
Вот пример вышеупомянутого jsFiddle .
источник
В зависимости от того, чего вы хотите достичь, вы можете забыть щелчок мышью и просто использовать href:
Обходит необходимость вернуть ложь. Мне не нравится этот
#
вариант, потому что, как уже упоминалось, он перенесет пользователя наверх страницы. Если вам нужно куда-нибудь отправить пользователя, если у него не включен JavaScript (что редко случается, когда я работаю, но очень хорошая идея), то предложенный Стивом метод отлично работает.Наконец, вы можете использовать,
javascript:void(0)
если вы не хотите, чтобы кто-нибудь куда-то шел, и если вы не хотите вызывать функцию JavaScript. Это прекрасно работает, если у вас есть изображение, с которым вы хотите, чтобы происходило событие наведения мыши, но пользователю не на что нажимать.источник
Когда у меня есть несколько поддельных ссылок, я предпочитаю давать им класс «без ссылок».
Затем в jQuery я добавляю следующий код:
А для HTML ссылка просто
Я не люблю использовать Hash-теги, если они не используются для якорей, и я делаю выше, только когда у меня более двух поддельных ссылок, в противном случае я использую javascript: void (0).
Как правило, я предпочитаю вообще избегать использования ссылки и просто оборачивать что-то в промежуток и использовать это как способ активировать некоторый код JavaScript, например всплывающее окно или раскрытие контента.
источник
Я полагаю, что вы представляете ложную дихотомию. Это не единственные два варианта.
Я согласен с г-ном D4V360, который предположил, что, даже если вы используете тег привязки, у вас здесь действительно нет привязки. Все, что у вас есть, это специальный раздел документа, который должен вести себя немного иначе.
<span>
Тег является гораздо более подходящим.источник
a
на aspan
, вам нужно помнить, чтобы сделать его фокусируемым с помощью клавиатуры.Я попробовал как в Google Chrome с инструментами разработчика, и
id="#"
заняло 0,32 секунды. Покаjavascript:void(0)
метод занял всего 0,18 секунды. Так что в гугл хромеjavascript:void(0)
работает лучше и быстрее.источник
Я в основном перефразирую эту практическую статью, используя прогрессивное улучшение . Короткий ответ: вы никогда не используете
javascript:void(0);
или#
если ваш пользовательский интерфейс уже не сделал вывод, что JavaScript включен, и в этом случае вы должны использоватьjavascript:void(0);
. Кроме того, не используйте span в качестве ссылок, так как это семантически неверно для начала.Использование SEO- дружественных URL-маршрутов в вашем приложении, таких как / Home / Action / Parameters, также является хорошей практикой. Если у вас есть ссылка на страницу, которая сначала работает без JavaScript, вы можете улучшить работу с ней позже. Используйте реальную ссылку на рабочую страницу, затем добавьте событие onlick, чтобы улучшить презентацию.
Вот образец. Home / ChangePicture - это рабочая ссылка на форму на странице с пользовательским интерфейсом и стандартными кнопками отправки в формате HTML, но она выглядит лучше, введенная в модальное диалоговое окно с кнопками jQueryUI. В зависимости от браузера работает любой из этих способов, который удовлетворяет требованиям мобильной разработки.
источник