¿Cómo puedo desactivar HREF si se ejecuta onclick?

95

Tengo un ancla con ambos HREF y ONCLICKatributos establecidos. Si se hace clic y Javascript está habilitado, quiero que solo se ejecute ONCLICKe ignore HREF. Del mismo modo, si Javascript está deshabilitado o no es compatible, quiero que siga la HREFURL e ignore ONCLICK. A continuación se muestra un ejemplo de lo que estoy haciendo, que ejecutaría el JS y seguiría el enlace al mismo tiempo (generalmente el JS se ejecuta y luego la página cambia):

<A HREF="http://example.com/no-js-login" ONCLICK="yes_js_login()">Log in</A>

¿Cuál es la mejor manera de hacer esto?

Espero una respuesta de Javascript, pero aceptaré cualquier método siempre que funcione, especialmente si esto se puede hacer con PHP. Ya he leído " un enlace href se ejecuta y redirige la página antes de que la función onclick de javascript pueda finalizar ", pero solo lo retrasa HREF, pero no lo desactiva por completo. También busco algo mucho más sencillo.

Supuhstar
fuente
4
Solía ​​anclar uno con un href y otro sin él. En la carga de la página, compruebe si JavaScript está habilitado, si se muestra el ancla correcta, de lo contrario, muestre el otro.
ewein
1
@ewein ¿Por qué? Eso suena como una gran cantidad de marcado para una característica simple.
Supuhstar

Respuestas:

58

Puede usar la primera solución sin editar, si coloca return primero en el onclickatributo:

<a href="https://example.com/no-js-login" onclick="return yes_js_login();">Log in</a>

yes_js_login = function() {
     // Your code here
     return false;
}

Ejemplo: https://jsfiddle.net/FXkgV/289/

elproduc3r
fuente
1
¡Me gusta lo limpio que está! Sin embargo, la solución aceptada me da más control sobre si se ignora el HREF
Supuhstar
Durante los últimos dos años he cambiado de opinión; esta es una mejor solución
Supuhstar
¡Qué sano!
DrunkDevKek
Pero esto no funciona con JSX react. esto funcionara?
Codificador
1
esto ahorró mucho tiempo.
Mark Lozano
61
    yes_js_login = function() {
         // Your code here
         return false;
    }

Si devuelve falso, debería evitar la acción predeterminada (ir al href).

Editar: Lo siento, eso no parece funcionar, puedes hacer lo siguiente en su lugar:

<a href="http://example.com/no-js-login" onclick="yes_js_login(); return false;">Link</a>
Chris Bier
fuente
1
La respuesta editada no responde a la pregunta, ya que elimina el enlace real.
Itai Bar-Haim
12
alternativamente usar onclick="return yes_js_login();"con yes_js_logindevoluciónfalse
Uwe Kleine-König
1
@cgogolin mira mi respuesta.
Gabe Rogan
para cualquiera que todavía se event.stopImmediatePropagation()
quede
34

Simplemente deshabilite el comportamiento predeterminado del navegador usando preventDefaulty pase el eventdentro de su HTML.

<a href=/foo onclick= yes_js_login(event)>Lorem ipsum</a>

yes_js_login = function(e) {
  e.preventDefault();
}
Buksy
fuente
1
return false no funcionó en polímero ... la solución anterior funcionó ... Gracias
Paras Sachapara
16
<a href="http://www.google.com" class="ignore-click">Test</a>

con jQuery:

<script>
    $(".ignore-click").click(function(){
        return false;
    })
</script>

con JavaScript

<script>
        for (var i = 0; i < document.getElementsByClassName("ignore-click").length; i++) {
            document.getElementsByClassName("ignore-click")[i].addEventListener('click', function (event) {
                event.preventDefault();
                return false;
            });
        }
</script>

Asignas clase .ignore-clicka tantos elementos como quieras y los clics en esos elementos serán ignorados

Andrés
fuente
¡Esta es una gran solución! Lo usé para botones que tengo que cuando se hace clic en una pseudo clase .btn-loadingse agrega al enlace en el que se hizo clic, luego, si tiene éxito, una marca de verificación (en el error una X) reemplaza la animación de carga. No quiero que se pueda hacer clic en el botón nuevamente en algunos casos (tanto para el éxito como para el error), ¡al usar esto puedo $(elemnent).addClass('disabled')lograr de manera simple y fácil la funcionalidad que estaba buscando de una manera elegante!
Matthew Mathieson
14

Puede utilizar este sencillo código:

<a href="" onclick="return false;">add new action</a><br>
mishanon
fuente
5

Es más simple si pasa un parámetro de evento como este:

<a href="#" onclick="yes_js_login(event);">link</a>
function yes_js_login(e) {
    e.stopImmediatePropagation();
}
Trigon219
fuente
1
Eso no funciona para mí. Tengo que usar e.preventDefault ()
Milan Simek
2

Esto podría ayudar. No se necesita JQuery

<a href="../some-relative-link/file" 
onclick="this.href = 'https://docs.google.com/viewer?url='+this.href; this.onclick = '';" 
target="_blank">

Este código hace lo siguiente: pasa el vínculo relativo al visor de documentos de Google

  1. Obtenga la versión de enlace completo del ancla this.href
  2. abre el enlace en la nueva ventana.

Entonces, en su caso, esto podría funcionar:

<a href="../some-relative-link/file" 
onclick="this.href = 'javascript:'+console.log('something has stopped the link'); " 
target="_blank">
marlo
fuente
1

Resolví una situación en la que necesitaba una plantilla para el elemento que manejaría alternativamente una URL normal o una llamada de JavaScript, donde la función js necesita una referencia al elemento de llamada. En javascript, "esto" funciona como una autorreferencia solo en el contexto de un elemento de formulario, por ejemplo, un botón. No quería un botón, solo la aparición de un enlace normal.

Ejemplos:

<a onclick="http://blahblah" href="http://blahblah" target="_blank">A regular link</a>
<a onclick="javascript:myFunc($(this));return false" href="javascript:myFunc($(this));"  target="_blank">javascript with self reference</a>

Los atributos href y onClick tienen los mismos valores, excepto que agrego "return false" en onClick cuando es una llamada javascript. Tener "return false" en la función llamada no funcionó.

Bo Johanson
fuente
porque hay dos ¿Por qué estás poniendo JS en el HREF?
Supuhstar
Supuhstar, el código real es dinámico, javascript, y generará un elemento <a> para varios cientos de elementos que se definen externamente. Cada elemento especificará una dirección de enlace estático, y ahí es donde el elemento <a> generado debe utilizar el "comportamiento href" habitual. O bien, se especifica una llamada a la función javascript para el elemento, en cuyo caso se calcula el comportamiento del elemento <a>, en función del contexto del elemento. Y en el código para el generador <a>, solo quería copiar lo que se especifique para cada elemento, sin probar si es una dirección de enlace o una llamada de función de JavaScript.
Bo Johanson
No entiendo cómo esto responde a mi pregunta. ¿Quién dijo que quería varios cientos de enlaces? Realmente no entiendo el sentido de todo esto, ni siquiera la mitad de lo que acaba de decir.
Supuhstar
0

Esto funcionó para mí:

<a href="" onclick="return false;">Action</a>
Cero
fuente
¡Gracias por tu respuesta y bienvenido a Stack Exchange! Desafortunadamente, esto no parece agregar ningún conocimiento nuevo, ya que parece que las respuestas anteriores ya lo sugieren. Si está de acuerdo, entonces es mejor votarlos. Si no está de acuerdo, edite su respuesta para que sus nuevos conocimientos salgan a la luz.
Supuhstar
0

En mi caso, tuve una condición cuando el usuario hace clic en el elemento "a". La condición era:

Si otra sección tiene más de diez elementos, el usuario no debe ser redirigido a otra página.

Si otra sección tiene menos de diez elementos, entonces el usuario debe ser redirigido a otra página.

La funcionalidad de los elementos "a" depende del otro componente. El código dentro del evento de clic es el siguiente:

var elementsOtherSection = document.querySelectorAll("#vehicle-item").length;
if (elementsOtherSection> 10){
     return true;
}else{
     event.preventDefault();
     return false;
}
Jorge Santos Neill
fuente