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


Tengo un ancla con ambos HREF y ONCLICK conjunto de atributos. Si se hace clic y Javascript está habilitado, quiero que solo ejecute ONCLICK e ignore HREF. Del mismo modo, si Javascript está deshabilitado o no es compatible, quiero que siga la URL HREF 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 simultáneamente (generalmente se ejecuta el JS y luego cambia la página):

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

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

Espero una respuesta de Javascript, pero aceptaré cualquier método siempre y cuando funcione, especialmente si esto se puede hacer con PHP. He leído " un enlace href ejecuta y redirige la página antes de que la función onclick de javascript pueda terminar" ya, pero solo retrasa HREF, pero no lo deshabilita completamente. También estoy buscando algo mucho más simple.

Author: Community, 2013-03-25

11 answers

Puede utilizar la primera solución no editada, si pone return primero en el atributo onclick:

<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/

 27
Author: elproduc3r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-12 00:45:19
    yes_js_login = function() {
         // Your code here
         return false;
    }

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

Editar: Lo sentimos, no parece funcionar, puede hacer lo siguiente en su lugar:

<a href="http://example.com/no-js-login" onclick="yes_js_login(); return false;">Link</a>
 53
Author: Chris Bier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-12 00:42:16

Simplemente deshabilite el comportamiento predeterminado del navegador usando preventDefault y pasa el event dentro de tu HTML.

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

yes_js_login = function(e) {
  e.preventDefault();
}
 23
Author: Buksy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-06 07:17: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>

Asigna la clase .ignore-click a tantos elementos como desee y los clics en esos elementos se ignorarán

 12
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-21 00:55:07

Puedes usar este sencillo código:

<a href="" onclick="return false;">add new action</a><br>
 11
Author: mishanon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 06:36:09

Es más sencillo 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();
}
 5
Author: Trigon219,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-05 17:52:17

Resolví una situación en la que necesitaba una plantilla para el elemento que manejaría alternativamente una URL regular o una llamada javascript, donde la función js necesita una referencia al elemento que llama. En javascript, "esto" funciona como una referencia propia solo en el contexto de un elemento de formulario, por ejemplo, un botón. No quería un botón, sólo la apariencia 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 I append "return false" on onClick cuando se trata de una llamada javascript. Tener "return false" en la función llamada no funcionó.

 1
Author: Bo Johanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-18 09:24:55

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: Pase el enlace relativo a Google Docs Viewer

  1. Obtenga la versión de enlace completa del ancla por this.href
  2. abra el enlace de la nueva ventana.

Así que en tu caso esto podría funcionar:

<a href="../some-relative-link/file" 
onclick="this.href = 'javascript:'+console.log('something has stopped the link'); " 
target="_blank">
 1
Author: marlo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-31 20:35:32

Esto funcionó para mí:

<a href="" onclick="return false;">Action</a>
 0
Author: Zero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-08 14:57:39

En mi caso, tenía 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, entonces 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 click es el siguiente:

var elementsOtherSection = document.querySelectorAll("#vehicle-item").length;
if (elementsOtherSection> 10){
     return true;
}else{
     event.preventDefault();
     return false;
}
 0
Author: Jorge Santos Neill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-11 19:40:01

Utilizar como sigue

 onClick="javascript:void(0);anyfunction();"
 -1
Author: Karl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-01 07:15:47