Los siguientes son dos métodos para construir un enlace que tiene el único propósito de ejecutar código JavaScript. ¿Qué es mejor, en términos de funcionalidad, velocidad de carga de página, propósitos de validación, etc.?
function myJsFunc() {
alert("myJsFunc");
}
<a href="#" onclick="myJsFunc();">Run JavaScript Code</a>
o
function myJsFunc() {
alert("myJsFunc");
}
<a href="javascript:void(0)" onclick="myJsFunc();">Run JavaScript Code</a>
javascript
html
performance
optimization
href
Peter Mortensen
fuente
fuente
<a href="javascript:void(0)" onclick="myJsFunc();">
tiene absolutamente ningún sentido. Si debe usar eljavascript:
protocolo psuedo, no necesita elonclick
atributo también.<a href="javascript:myJsFunc();">
hará bien.myJsFunc()
tiene un valor de retorno, su página se romperá. jsfiddle.net/jAd9G usted todavía tiene que utilizarvoid
de este modo:<a href="javascript:void myJsFunc();">
. Pero entonces, el comportamiento aún sería diferente. Invocar el enlace a través del menú contextual no activa elclick
evento.<a href="javascript:;" onclick="myEvent()"
?javascript:;
es mucho más rápido de escribir quejavascript:void(0)
<a>
etiqueta si lo que quieres hacer es NO abrir otra página a través de la función del navegador nativo, sino tener alguna 'acción' de JavaScript que se activará? Simplemente usando unaspan
etiqueta con una clase dejs-trigger
probablemente mucho mejor ". ¿O me estoy perdiendo algo?Respuestas:
Yo uso
javascript:void(0)
.Tres razones Fomentar el uso de
#
un equipo de desarrolladores inevitablemente lleva a algunos a usar el valor de retorno de la función llamada así:Pero luego se olvidan de usar
return doSomething()
en el onclick y solo lo usandoSomething()
.Una segunda razón para evitar
#
es que la finalreturn false;
no se ejecutará si la función llamada arroja un error. Por lo tanto, los desarrolladores también deben recordar manejar cualquier error adecuadamente en la función llamada.Una tercera razón es que hay casos en los
onclick
que la propiedad del evento se asigna dinámicamente. Prefiero poder llamar a una función o asignarla dinámicamente sin tener que codificar la función específicamente para un método de conexión u otro. Por lo tanto, mionclick
(o en cualquier cosa) en el marcado HTML se ve así:O
El uso
javascript:void(0)
evita todos los dolores de cabeza anteriores, y no he encontrado ningún ejemplo de un inconveniente.Entonces, si eres un desarrollador solitario, puedes elegir claramente, pero si trabajas en equipo tienes que decir:
Use
href="#"
, asegúrese de queonclick
siempre contengareturn false;
al final, que cualquier función llamada no arroje un error y si asocia una función dinámicamente a laonclick
propiedad, asegúrese de que, además de no arrojar un error, regresefalse
.O
Utilizar
href="javascript:void(0)"
El segundo es claramente mucho más fácil de comunicar.
fuente
href="javascript:void(0)"
métodojavascript:
debe considerarse una mala práctica, molesto y no degrada de manera elegante.event.preventDefault()
existen exactamente para evitar el comportamiento predeterminado (como saltar a la parte superior de la página en este caso) y hacer un mejor trabajo sin toda lareturn false;
locura.javascript:void(0)
viola la Política de seguridad de contenido en páginas HTTPS habilitadas para CSP. Una opción sería usarhref='#'
yevent.preventDefault()
en el controlador, pero no me gusta mucho. Quizás pueda establecer una convención para usarhref='#void'
y asegurarse de que ningún elemento de la página lo tengaid="void"
. De esa manera, al hacer clic en un enlace a un ancla no existente, no se desplazará la página.href
. Esto se haría en jQuery con:$('a[href="#"]').click(function(e) { e.preventDefault ? e.preventDefault() : e.returnValue = false; });
Ninguno.
Si puede tener una URL real que tenga sentido, úsela como HREF. El onclick no se activará si alguien hace clic con el botón central en su enlace para abrir una nueva pestaña o si tiene JavaScript deshabilitado.
Si eso no es posible, entonces al menos debe inyectar la etiqueta de anclaje en el documento con JavaScript y los controladores de eventos de clic apropiados.
Me doy cuenta de que esto no siempre es posible, pero en mi opinión, se debe esforzar por desarrollar cualquier sitio web público.
Consulte JavaScript discreto y mejora progresiva (ambos Wikipedia).
fuente
javascript:
o#
son malas prácticas y no se debe alentar. Buenos artículos por cierto.<button>
fue hecho. Pero de acuerdo: probablemente no debería ser específicamente<a>
si no hay un lugar adecuado para que se vincule.Hacer
<a href="#" onclick="myJsFunc();">Link</a>
o<a href="javascript:void(0)" onclick="myJsFunc();">Link</a>
cualquier otra cosa que contenga unonclick
atributo estaba bien hace cinco años, aunque ahora puede ser una mala práctica. Este es el por qué:Promueve la práctica de JavaScript intrusivo, que resultó ser difícil de mantener y difícil de escalar. Más sobre esto en JavaScript discreto .
Estás gastando tu tiempo escribiendo código increíblemente excesivamente detallado, lo que tiene muy poco (o ningún) beneficio para tu base de código.
Ahora hay formas mejores, más fáciles y más fáciles de mantener y escalables para lograr el resultado deseado.
La manera discreta de JavaScript
¡Simplemente no tengo un
href
atributo en absoluto! Cualquier buen restablecimiento de CSS se encargaría del estilo de cursor predeterminado que falta, por lo que no es un problema. Luego, adjunte su funcionalidad de JavaScript utilizando las mejores prácticas elegantes y discretas, que son más fáciles de mantener ya que su lógica de JavaScript permanece en JavaScript, en lugar de en su marcado, lo cual es esencial cuando comienza a desarrollar aplicaciones de JavaScript a gran escala que requieren que su lógica se divida en componentes y plantillas en caja negra. Más sobre esto en Arquitectura de aplicaciones JavaScript a gran escalaEjemplo de código simple
Un ejemplo de Backbone.js en caja negra
Para ver un ejemplo de componente de Backbone.js escalable y en caja negra, vea este ejemplo de jsfiddle que funciona aquí . Observe cómo utilizamos prácticas discretas de JavaScript, y en una pequeña cantidad de código tenemos un componente que puede repetirse en la página varias veces sin efectos secundarios o conflictos entre las diferentes instancias de componentes. ¡Asombroso!
Notas
Omitir el
href
atributo en ela
elemento hará que el elemento no sea accesible usando latab
navegación clave. Si desea que esos elementos sean accesibles a través de latab
clave, puede establecer eltabindex
atributo o utilizarbutton
elementos en su lugar. Puede diseñar fácilmente elementos de botón para que se vean como enlaces normales como se menciona en la respuesta de Tracker1 .Omitir el
href
atributo en ela
elemento hará que Internet Explorer 6 e Internet Explorer 7 no adopten ela:hover
estilo, por lo que en su lugar hemos agregado una calza JavaScript simple para lograr estoa.hover
. Lo cual está perfectamente bien, ya que si no tiene un atributo href y no hay degradación elegante, su enlace no funcionará de todos modos, y tendrá problemas más importantes por los que preocuparse.Si desea que su acción siga funcionando con JavaScript deshabilitado, use un
a
elemento con unhref
atributo que vaya a alguna URL que realice la acción manualmente en lugar de a través de una solicitud de Ajax o lo que sea el camino a seguir. Si está haciendo esto, entonces quiere asegurarse de hacer unaevent.preventDefault()
llamada de clic para asegurarse de que cuando se hace clic en el botón no siga el enlace. Esta opción se llama degradación elegante.fuente
button
enfoque de estilo de enlace sugerido aquí está plagado por el inevitable estado activo "3d" en IE9 y versiones inferiores .javascript:void(0)
. Esa es la respuesta pragmática, y la única respuesta sensata en el mundo real.'#'
llevará al usuario de vuelta a la parte superior de la página, por lo que generalmente voy convoid(0)
.javascript:;
también se comporta comojavascript:void(0);
fuente
#
o#something
lo llevará a ese anclaje en la página base href , en lugar de en la página actual.#!
) hace el truco, pero definitivamente es una mala práctica.Yo sinceramente sugeriría que ninguno. Yo usaría un estilizado
<button></button>
para ese comportamiento.De esta manera puedes asignar tu onclick. También sugiero vincular mediante script, no usar el
onclick
atributo en la etiqueta del elemento. El único problema es el efecto de texto psuedo 3d en los IE más antiguos que no se pueden deshabilitar.Si DEBE usar un elemento A, úselo
javascript:void(0);
por los motivos ya mencionados.NOTA: Puede reemplazarlo
0
con una cadena como lajavascript:void('Delete record 123')
que puede servir como un indicador adicional que mostrará lo que realmente hará el clic.fuente
<button>
sino uninput type=button
en su lugar?<clickable>
elemento. O un<clickabletim>
si lo prefieres. Desafortunadamente, el uso de una etiqueta no estándar o un div simple podría dificultar que los usuarios del teclado enfoquen el elemento.button
. E IE9 está perdiendo rápidamente cuotas de mercado, afortunadamente, y el efecto activo de 1px no debería impedirnos usar el marcado semántico.<a>
es un enlace, está destinado a enviarte a alguna parte, para acciones que tenemos<button>
.El primero, idealmente con un enlace real a seguir en caso de que el usuario tenga JavaScript deshabilitado. Solo asegúrese de devolver falso para evitar que se active el evento de clic si se ejecuta JavaScript.
Si usa Angular2, de esta manera funciona:
<a [routerLink]="" (click)="passTheSalt()">Click me</a>
.Ver aquí https://stackoverflow.com/a/45465728/2803344
fuente
Tampoco si me preguntas;
Si su "enlace" tiene el único propósito de ejecutar algún código JavaScript, no califica como enlace; más bien un fragmento de texto con una función de JavaScript acoplada. Yo recomendaría usar un
<span>
etiqueta con unonclick handler
adjunto y algo de CSS básico para imitar un enlace. Los enlaces están hechos para la navegación, y si su código JavaScript no es para la navegación, no debería ser una<a>
etiqueta.Ejemplo:
fuente
<span>
s no están destinados a hacer nada.<A>
Nchors y<buttons>
se utilizan para eso!buttons
es una mejor opción aquí mientras que usar aspan
no lo es.Idealmente harías esto:
O, mejor aún, tendría el enlace de acción predeterminado en el HTML, y agregaría el evento onclick al elemento discretamente a través de JavaScript después de que se renderice el DOM, asegurando así que si JavaScript no está presente / utilizado, no tenga controladores de eventos inútiles que descifren su código y puedan ofuscar (o al menos distraer) su contenido real.
fuente
El uso solo
#
hace algunos movimientos divertidos, por lo que recomendaría usarlo#self
si desea ahorrar en los esfuerzos de mecanografíaJavaScript bla, bla,
.fuente
#self
etiquetas con nombre y evitar el molesto comportamiento del navegador de saltar al principio de la página. Gracias.#self
no parece ser especial. Cualquier identificador de fragmento que no coincida con el nombre o la identificación de ningún elemento del documento (y que no esté en blanco o "arriba") debería tener el mismo efecto.#void
convención en el otro comentario, pero en realidad#self
es tan breve y fácil de memorizar. Cualquier cosa es mejor que#
Yo uso lo siguiente
en lugar
fuente
javascript:
(sin punto y coma) porque se ve más ordenado en la barra de estado al pasar el mouse.javascript:void('Do foo')
dado que void volverá indefinido independientemente, le dará un indicador al usuario de lo que hará hacer clic. ¿DóndeDo foo
puede estarDelete record X
o lo que quieras?Estoy de acuerdo con las sugerencias en otros lugares que indican que debe usar URL normal en el
href
atributo, luego llamar a alguna función de JavaScript en onclick. La falla es que agregan automáticamentereturn false
después de la llamada.El problema con este enfoque es que si la función no funcionará o si habrá algún problema, el enlace no se podrá hacer clic. El evento onclick siempre regresará
false
, por lo que no se llamará a la URL normal.Hay una solución muy simple. Dejar que la función regrese
true
si funciona correctamente. Luego use el valor devuelto para determinar si el clic debe cancelarse o no:JavaScript
HTML
Tenga en cuenta que niego el resultado de la
doSomething()
función. Si funciona, volverátrue
, por lo que se negará (false
) ypath/to/some/URL
no se invocará. Si la función regresafalse
(por ejemplo, el navegador no admite algo usado dentro de la función o cualquier otra cosa sale mal), se niegatrue
ypath/to/some/URL
se llama al.fuente
#
es mejor quejavascript:anything
, pero lo siguiente es aún mejor:HTML:
JavaScript:
Siempre debe luchar por una degradación elegante (en el caso de que el usuario no tenga habilitado JavaScript ... y cuando esté con especificaciones y presupuesto). Además, se considera una mala forma utilizar los atributos y el protocolo de JavaScript directamente en HTML.
fuente
click
en los enlaces ...Recomiendo usar un
<button>
elemento en su lugar, especialmente si se supone que el control produce un cambio en los datos. (Algo así como un POST).Es aún mejor si inyecta los elementos discretamente, un tipo de mejora progresiva. (Ver este comentario )
fuente
.btn
hace que los botones y enlaces se vean exactamente iguales.button
tampoco introduce un # en la URL ni muestra ela
href como javascript :;A menos que esté escribiendo el enlace usando JavaScript (para que sepa que está habilitado en el navegador), lo ideal sería proporcionar un enlace adecuado para las personas que están navegando con JavaScript deshabilitado y luego evitar la acción predeterminada del enlace en su onclick controlador de eventos. De esta manera, aquellos con JavaScript habilitado ejecutarán la función y aquellos con JavaScript deshabilitado saltarán a una página apropiada (o ubicación dentro de la misma página) en lugar de simplemente hacer clic en el enlace y no sucederá nada.
fuente
Definitivamente hash (
#
) es mejor porque en JavaScript es un pseudoesquema:Por supuesto, "#" con un controlador onclick que impide la acción predeterminada es [mucho] mejor. Además, un enlace que tiene el único propósito de ejecutar JavaScript no es realmente "un enlace" a menos que esté enviando al usuario a un ancla sensible en la página (solo # se enviará al principio) cuando algo sale mal. Simplemente puede simular la apariencia del enlace con la hoja de estilo y olvidarse de href.
Además, con respecto a la sugerencia de cowgod, particularmente esto:
...href="javascript_required.html" onclick="...
este es un buen enfoque, pero no distingue entre los escenarios "JavaScript deshabilitado" y "onclick falla".fuente
Por lo general voy por
Es más corto que javascript: void (0) y hace lo mismo.
fuente
Yo usaría:
Razones:
href
motores de búsqueda lo necesiten. Si usa algo más (como una cadena), puede causar un404 not found
error.return false;
, la página no salta a la parte superior ni rompe elback
botón.fuente
Elijo usar
javascript:void(0)
, porque usar esto podría evitar el clic derecho para abrir el menú de contenido. Perojavascript:;
es más corto y hace lo mismo.fuente
Entonces, cuando está haciendo algunas cosas de JavaScript con una
<a />
etiqueta y si también las colocahref="#"
, puede agregar return false al final del evento (en caso de enlace de evento en línea) como:O puede cambiar el atributo href con JavaScript como:
o
Pero semánticamente, todas las formas anteriores para lograr esto están mal (aunque funciona bien) . Si algún elemento no se crea para navegar por la página y tiene algunas cosas de JavaScript asociadas, entonces no debería ser una
<a>
etiqueta.Simplemente puede usar a
<button />
en su lugar para hacer cosas o cualquier otro elemento como b, span o lo que corresponda según su necesidad, porque puede agregar eventos en todos los elementos.Por lo tanto, hay un beneficio para usar
<a href="#">
. Obtiene el puntero del cursor de forma predeterminada en ese elemento cuando lo hacea href="#"
. Para eso, creo que puedes usar CSS para esto, locursor:pointer;
que también resuelve este problema.Y al final, si está vinculando el evento desde el código JavaScript en sí, puede hacerlo
event.preventDefault()
para lograrlo si está usando una<a>
etiqueta, pero si no está usando una<a>
etiqueta para esto, obtendrá una ventaja, no ' No necesito hacer esto.Entonces, si ves, es mejor no usar una etiqueta para este tipo de cosas.
fuente
No use enlaces con el único propósito de ejecutar JavaScript.
El uso de href = "#" desplaza la página hacia arriba; El uso de void (0) crea problemas de navegación dentro del navegador.
En su lugar, use un elemento que no sea un enlace:
Y dale estilo con CSS:
fuente
span
elemento porque es un elemento no enfocable. Por eso necesitas un botón.tabindex="0"
al lapso. Dicho esto, usar el botón es mejor porque le brinda la funcionalidad deseada de forma gratuita. Para que sea accesible usando un intervalo, no solo necesita adjuntar un controlador de clic, sino un controlador de eventos de teclado que busca presionar la barra espaciadora o la tecla enter y luego dispara el controlador de clic normal. También desearía cambiar el segundo selector CSS para.funcActuator:hover, .funcActuator:focus
que el hecho de que el elemento tenga el foco sea evidente.Sería mejor usar jQuery,
y omita ambos
href="#"
yhref="javascript:void(0)"
.El marcado de etiqueta de anclaje será como
¡Suficientemente simple!
fuente
Si está utilizando AngularJS , puede utilizar lo siguiente:
Lo que no hará nada.
Adicionalmente
false
con JavaScriptfuente
Si no hay
href
tal vez no hay razón para usar una etiqueta de anclaje.Puede adjuntar eventos (clic, desplazamiento, etc.) en casi todos los elementos, entonces, ¿por qué no usar solo una
span
o unadiv
?Y para los usuarios con JavaScript deshabilitado: si no hay una reserva (por ejemplo, una alternativa
href
), al menos no deberían poder ver e interactuar con ese elemento, sea lo que sea<a>
o una<span>
etiqueta.fuente
Por lo general, siempre debe tener un enlace alternativo para asegurarse de que los clientes con JavaScript deshabilitado todavía tengan alguna funcionalidad. Este concepto se llama JavaScript discreto.
Ejemplo ... Digamos que tiene el siguiente enlace de búsqueda:
Siempre puedes hacer lo siguiente:
De esa forma, las personas con JavaScript deshabilitado son dirigidas
search.php
mientras que los espectadores con JavaScript ven su funcionalidad mejorada.fuente
Yo personalmente los uso en combinación. Por ejemplo:
HTML
con un poco de jQuery
o
Pero estoy usando eso solo para evitar que la página salte a la parte superior cuando el usuario hace clic en un ancla vacía. Raramente estoy usando onClick y otros
on
eventos directamente en HTML.Mi sugerencia sería usar el
<span>
elemento con elclass
atributo en lugar de un ancla. Por ejemplo:Luego asigne la función a
.link
con un script envuelto en el cuerpo y justo antes de la</body>
etiqueta o en un documento externo de JavaScript.* Nota: Para elementos creados dinámicamente, use:
Y para los elementos creados dinámicamente que se crean con elementos creados dinámicamente, use:
Luego puede diseñar el elemento span para que parezca un ancla con un poco de CSS:
Aquí hay un ejemplo de jsFiddle de lo mencionado anteriormente.
fuente
Dependiendo de lo que quieras lograr, puedes olvidar el onclick y simplemente usar el href:
Evita la necesidad de devolver falso. No me gusta la
#
opción porque, como se mencionó, llevará al usuario a la parte superior de la página. Si tiene otro lugar para enviar al usuario si no tiene JavaScript habilitado (lo cual es raro en mi trabajo, pero es una muy buena idea), entonces el método propuesto por Steve funciona muy bien.Por último, puede usarlo
javascript:void(0)
si no desea que nadie vaya a ningún lado y si no desea llamar a una función de JavaScript. Funciona muy bien si tiene una imagen con la que desea que ocurra un evento de mouseover, pero no hay nada para que el usuario haga clic.fuente
Cuando tengo varios enlaces falsos, prefiero darles una clase de 'sin enlace'.
Luego, en jQuery, agrego el siguiente código:
Y para el HTML, el enlace es simplemente
No me gusta usar Hash-Tags a menos que se usen para anclas, y solo hago lo anterior cuando tengo más de dos enlaces falsos, de lo contrario voy con javascript: void (0).
Por lo general, me gusta evitar usar un enlace y simplemente envolver algo en un lapso y usarlo como una forma de activar algún código JavaScript, como una ventana emergente o una revelación de contenido.
fuente
Creo que estás presentando una falsa dicotomía. Estas no son las únicas dos opciones.
Estoy de acuerdo con el Sr. D4V360, quien sugirió que, aunque esté utilizando la etiqueta de anclaje, realmente no tiene un ancla aquí. Todo lo que tiene es una sección especial de un documento que debería comportarse de manera ligeramente diferente. Una
<span>
etiqueta es mucho más apropiada.fuente
a
con unspan
, deberá recordar que debe enfocarse mediante el teclado.Probé ambos en google chrome con las herramientas de desarrollo, y
id="#"
tardé 0.32 segundos. Mientras que eljavascript:void(0)
método tomó solo 0.18 segundos. Entonces, en Google Chrome,javascript:void(0)
funciona mejor y más rápido.fuente
Básicamente, estoy parafraseando de este artículo práctico usando mejoras progresivas . La respuesta breve es que nunca usa
javascript:void(0);
o, a#
menos que su interfaz de usuario ya haya inferido que JavaScript está habilitado, en cuyo caso debe usarjavascript:void(0);
. Además, no use span como enlaces, ya que eso es semánticamente falso para empezar.También es una buena práctica utilizar rutas de URL amigables para SEO en su aplicación, como / Home / Action / Parameters. Si primero tiene un enlace a una página que funciona sin JavaScript, puede mejorar la experiencia después. Use un enlace real a una página de trabajo, luego agregue un evento onlick para mejorar la presentación.
Aquí hay una muestra. Inicio / ChangePicture es un enlace de trabajo a un formulario en una página completa con interfaz de usuario y botones de envío HTML estándar, pero se ve mejor inyectado en un diálogo modal con botones jQueryUI. De cualquier manera funciona, dependiendo del navegador, que satisface el primer desarrollo móvil.
fuente