Come posso disabilitare HREF se viene eseguito onclick?


95

Ho un'ancora con entrambi HREF e gli ONCLICKattributi impostati. Se cliccato e Javascript sia abilitato, voglio che solo eseguire ONCLICKe ignorare HREF. Allo stesso modo, se Javascript è disabilitato o non supportato, desidero che segua l' HREFURL e ignori ONCLICK. Di seguito è riportato un esempio di ciò che sto facendo, che eseguirà il JS e seguirà il collegamento contemporaneamente (di solito il JS viene eseguito e quindi la pagina cambia):

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

qual'è il miglior modo per farlo?

Spero in una risposta Javascript, ma accetterò qualsiasi metodo fintanto che funziona, soprattutto se questo può essere fatto con PHP. Ho già letto " un collegamento href esegue e reindirizza la pagina prima che la funzione javascript onclick sia in grado di finire ", ma ritarda solo HREF, ma non la disabilita completamente. Sto anche cercando qualcosa di molto più semplice.


4
Userei per ancorare uno con un href e uno senza. Al caricamento della pagina controlla se javascript è abilitato, se è mostra l'ancoraggio corretto altrimenti mostra l'altro.
ewein

1
@ewein Why? Sembra un sacco di markup per una semplice funzionalità.
Supuhstar

Risposte:


58

Puoi usare la prima soluzione non modificata, se metti prima return onclicknell'attributo:

<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;
}

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


1
Mi piace quanto è pulito! Tuttavia, la soluzione accettata mi dà più controllo sul fatto che l'HREF venga ignorato
Supuhstar

Negli ultimi due anni ho cambiato idea; questa è una soluzione migliore
Supuhstar

Com'è sano!
DrunkDevKek

Ma questo non funziona con JSX reagire. Funzionerà?
Coder

1
questo ha risparmiato molto tempo.
Mark Lozano

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

Se restituisci false dovrebbe impedire l'azione predefinita (andando a href).

Modifica: mi dispiace che non funzioni, puoi invece eseguire le seguenti operazioni:

<a href="http://example.com/no-js-login" onclick="yes_js_login(); return false;">Link</a>

1
La risposta modificata non risponde alla domanda, poiché rimuove il collegamento effettivo.
Itai Bar-Haim

12
in alternativa utilizzare onclick="return yes_js_login();"con yes_js_loginritornofalse
Uwe Kleine-König

1
@cgogolin vedi la mia risposta.
Gabe Rogan

per chiunque sia ancora bloccato, può aggiungere questa rigaevent.stopImmediatePropagation()
didxga

34

Disabilita semplicemente il comportamento del browser predefinito utilizzando preventDefaulte passa eventall'interno del tuo HTML.

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

yes_js_login = function(e) {
  e.preventDefault();
}

1
return false non ha funzionato in polimero ... la soluzione sopra ha funzionato ... Grazie
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>

Assegni la classe .ignore-clicka tutti gli elementi che desideri e i clic su quegli elementi verranno ignorati


Questa è un'ottima soluzione! L'ho usato per i pulsanti che ho che quando cliccato una pseudo classe .btn-loadingviene aggiunta al link cliccato, quindi se ha successo un segno di spunta (in caso di errore una X) sostituisce l'animazione di caricamento. Non voglio che il pulsante possa essere cliccato di nuovo in alcuni casi (sia per successo che per errore), usando questo posso ottenere semplicemente $(elemnent).addClass('disabled')e facilmente la funzionalità che stavo cercando in modo elegante!
Matthew Mathieson

14

Puoi usare questo semplice codice:

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

5

È più semplice se passi un parametro evento come questo:

<a href="#" onclick="yes_js_login(event);">link</a>
function yes_js_login(e) {
    e.stopImmediatePropagation();
}

1
Non funziona per me. Devo usare e.preventDefault ()
Milan Simek

2

Questo potrebbe aiutare. Non è necessario JQuery

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

Questo codice esegue le seguenti operazioni: Passa il collegamento relativo a Google Docs Viewer

  1. Ottieni la versione completa del link dell'ancora di this.href
  2. apri il link nella nuova finestra.

Quindi nel tuo caso potrebbe funzionare:

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

1

Ho risolto una situazione in cui avevo bisogno di un modello per l'elemento che gestisse in alternativa un URL normale o una chiamata javascript, in cui la funzione js necessita di un riferimento all'elemento chiamante. In javascript, "this" funziona come riferimento personale solo nel contesto di un elemento del modulo, ad esempio un pulsante. Non volevo un pulsante, solo l'aspetto di un normale collegamento.

Esempi:

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

Gli attributi href e onClick hanno gli stessi valori, tranne che aggiungo "return false" su onClick quando è una chiamata javascript. Avere "return false" nella funzione chiamata non ha funzionato.


perché ce ne sono due? Perché stai mettendo JS nel HREF?
Supuhstar

Supuhstar, il codice effettivo è dinamico, javascript e genererà un elemento <a> per diverse centinaia di elementi definiti esternamente. Ogni elemento specificherà un indirizzo di collegamento statico, ed è qui che l'elemento <a> generato dovrebbe usare il normale "comportamento href". Oppure, per l'elemento viene specificata una chiamata a una funzione JavaScript, nel qual caso viene calcolato il comportamento dell'elemento <a>, in base al contesto dell'elemento. E nel codice per il generatore <a>, volevo solo copiare tutto ciò che è specificato per ogni elemento, senza testare se si tratta di un indirizzo di collegamento o di una chiamata di funzione javascript.
Bo Johanson

Non capisco come questo risponda alla mia domanda. Chi ha detto che volevo diverse centinaia di link? Non capisco davvero il senso di tutto questo, o nemmeno la metà di quello che hai appena detto.
Supuhstar

0

Questo ha funzionato per me:

<a href="" onclick="return false;">Action</a>

Grazie per la tua risposta e benvenuto in Stack Exchange! Sfortunatamente, questo non sembra aggiungere alcuna nuova conoscenza, poiché sembra che le risposte precedenti lo suggeriscano già. Se sei d'accordo, allora è meglio votare quelli. Se non sei d'accordo, modifica la tua risposta in modo che le tue nuove conoscenze vengano alla luce!
Supuhstar

0

Nel mio caso, ho riscontrato una condizione quando l'utente fa clic sull'elemento "a". La condizione era:

Se un'altra sezione aveva più di dieci elementi, l'utente non dovrebbe essere reindirizzato a un'altra pagina.

Se un'altra sezione aveva meno di dieci elementi, l'utente dovrebbe essere reindirizzato a un'altra pagina.

La funzionalità degli elementi "a" dipende dall'altro componente. Il codice all'interno dell'evento clic è il seguente:

var elementsOtherSection = document.querySelectorAll("#vehicle-item").length;
if (elementsOtherSection> 10){
     return true;
}else{
     event.preventDefault();
     return false;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.