jQuery disabilita un collegamento


284

Qualcuno sa come disabilitare un collegamento in jquery SENZA utilizzare return false;?

In particolare, quello che sto cercando di fare è disabilitare il collegamento di un elemento, eseguendo un clic su di esso usando jquery che attiva alcune cose, quindi riattivare quel collegamento in modo che se viene cliccato di nuovo funzioni come predefinito.

Grazie. Dave

AGGIORNAMENTO Ecco il codice. Ciò che deve fare dopo l'applicazione della .expandedclasse è riattivare il collegamento disabilitato.

$('ul li').click(function(e) {
    e.preventDefault();
    $('ul').addClass('expanded');
    $('ul.expanded').fadeIn(300);
    //return false;
});

7
Perché il requisito di non utilizzare restituisce false? Usalo, quindi elimina il gestore eventi quando non si applica più (o inserisci un condizionale in esso per restituire valori diversi a seconda dello stato del "alcuni elementi" menzionato).
Quentin,

Stai solo provando a fare un po 'di pre-elaborazione prima che il collegamento venga seguito sulla stessa azione clic? cioè non stai proponendo due clic ma piuttosto un link clic utente, alcune azioni accadono, il link è seguito?
Lazzaro,

Altrimenti, puoi spiegare perché stai adottando questo approccio poiché una migliore comprensione dello spazio problematico migliorerà le risposte.
Lazzaro,

@lazarus, sto proponendo 2 clic sullo stesso link. 1 per fare prima alcune cose, poi il 2 per trattare il collegamento come un collegamento.
davebowker,

@daviddorward, Finora ho provato a restituire false e continua fino alla seconda parte del mio obiettivo, vale a dire non consentire al secondo clic di passare. Se potessi scrivere un breve esempio, ti sarei molto grato.
davebowker,

Risposte:


364
$('#myLink').click(function(e) {
    e.preventDefault();
    //do other stuff when a click happens
});

Ciò impedirà il comportamento predefinito di un collegamento ipertestuale, che è quello di visitare l'href specificato.

Dal tutorial di jQuery :

Per i clic e la maggior parte degli altri eventi, è possibile impedire il comportamento predefinito - qui, seguendo il collegamento a jquery.com - chiamando event.preventDefault () nel gestore eventi

Se lo desideri preventDefault()solo se una determinata condizione è soddisfatta (qualcosa è nascosto per esempio), potresti testare la visibilità del tuo ul con la classe espansa . Se è visibile (cioè non nascosto), il collegamento dovrebbe attivarsi normalmente, poiché l'istruzione if non verrà inserita e pertanto il comportamento predefinito non verrà impedito:

$('ul li').click(function(e) {
    if($('ul.expanded').is(':hidden')) {
        e.preventDefault();
        $('ul').addClass('expanded');
        $('ul.expanded').fadeIn(300);
    } 
});

3
Con jQuery 1.7+ è possibile utilizzare on / off: stackoverflow.com/questions/209029/…
Lance Cleveland

se ha un href e un clic funzionerà $ ("# myLink"). attr ('onclick', '') .click (function (e) {e.preventDefault ();});
Ronald McDonald,

realizzato attraverso Ajax e jquery, posso nascondere un grosso acquisto con il callback per impedire ai raschiatori di ottenere questi collegamenti. Fantastico grazie!
Cesar Bielich,

questo post ha il modo più semplice di usare bootstrap , la speranza aiuta.
shaijut,

107

Prova questo:

$("a").removeAttr('href');

MODIFICARE-

Dal tuo codice aggiornato:

 var location= $('#link1').attr("href");
 $("#link1").removeAttr('href');
 $('ul').addClass('expanded');
 $('ul.expanded').fadeIn(300);
 $("#link1").attr("href", location);

3
Giocare con href è molto bello perché è un modo rapido di disabilitare un collegamento che agisce tramite un evento onclick. Molto molto intelligente!
daitangio,

metodo dolce per impedire al browser di aggiungere il # all'interno dell'URI durante l'operazionehref="#"
Abela,

65

Per gli altri che sono venuti qui tramite Google come me, ecco un altro approccio:

css:
.disabled {
  color: grey; // ...whatever
}

jQuery:
$('#myLink').click(function (e) {
  e.preventDefault();
  if ($(this).hasClass('disabled'))
    return false; // Do something else in here if required
  else
    window.location.href = $(this).attr('href');
});

// Elsewhere in your code
if (disabledCondition == true)
  $('#myLink').addClass('disabled')
else
  $('#myLink').removeClass('disabled')

Ricorda: non solo questa è una classe CSS

class = "ButtonStyle"

ma anche questi due

class = "buttonstyle disabilitato"

così puoi facilmente aggiungere e rimuovere ulteriori classi con jQuery. Non c'è bisogno di toccare href ...

Adoro jQuery! ;-)


2
ciò presuppone che il collegamento non abbia un obiettivo :)
dstarh

2
Invece di fare tutto questo stravaganza, perché non limitarti a puntare il clic più in alto nella dom, usa on()per filtrare tutti i a.disabledcollegamenti e prevenire i valori predefiniti. Quindi tutto ciò che devi fare è attivare / disattivare la classe disabilitata e il collegamento si gestirà automaticamente quando "abilitato".
CodeChimp,

Non è necessario per "== true" - addClass ('disabled') verrà eseguito indipendentemente. if(disabledCondition)
Fox Wilson,

1
@fwilson, mentre hai ragione, per un programmatore principiante, è più facile capire con == true. :)
carmenismo,

Qualche motivo particolare per non semplificarlo if ($(this).hasClass('disabled')) { e.preventDefault(); }?
Mir,

58

Ecco una soluzione alternativa css / jQuery che preferisco per la sua terseness e gli script minimizzati:

css:

a.disabled {
  opacity: 0.5;
  pointer-events: none;
  cursor: default;
}

jQuery:

$('.disableAfterClick').click(function (e) {
   $(this).addClass('disabled');
});

7
Da Mozilla : "Avvertenza: l'uso di eventi puntatore in CSS per elementi non SVG è sperimentale. La funzione faceva parte della specifica della bozza dell'interfaccia utente CSS3 ma, a causa di molti problemi aperti, è stata rinviata a CSS4."
marcatori di duelli il

1
Questa è una buona considerazione, ma sembra funzionare bene nella maggior parte dei browser moderni.
Peter DeWeese,

Potresti voler prendere in considerazione il concatenamento .prop("tabindex", "-1");dopo iladdClass
Oleg Grishko il

19

È possibile rimuovere fare clic per il collegamento come segue;

$('#link-id').unbind('click');

Puoi riattivare il collegamento seguendo i seguenti

$('#link-id').bind('click');

Non è possibile utilizzare la proprietà "disabilitato" per i collegamenti.


1
Facile da attivare e disattivare rispetto ad altri.
python1981,

2
"Non è possibile utilizzare la proprietà 'disabilitato' per i collegamenti." Mi chiedo perché non esiste coerenza tra un pulsante e un collegamento per la disabilitazione. "disabled" dovrebbe funzionare anche per un link. È come dire che per un'auto Chevy devi premere il pedale del freno per fermarti, ma per quest'altra casa automobilistica, devi usare questa leva situata sul tetto.
eaglei22,

14

Se segui il percorso href, puoi salvarlo

Disabilitare:

$('a').each(function(){
    $(this).data("href", $(this).attr("href")).removeAttr("href");
});

Quindi riattivare utilizzando:

$('a').each(function(){
    $(this).attr("href", $(this).data("href"));
});

In un caso ho dovuto farlo in questo modo perché gli eventi clic erano già associati altrove e non avevo alcun controllo su di esso.


12

Lo uso sempre in jQuery per disabilitare i collegamenti

$("form a").attr("disabled", "disabled");

Puoi anche usarlo $("form a").attr("disabled", false);per
riattivarlo

9

esempio di collegamento html:

        <!-- boostrap button + fontawesome icon -->
        <a class="btn btn-primary" id="BT_Download" target="blank" href="DownloadDoc?Id=32">
        <i class="icon-file-text icon-large"></i>
        Download Document
        </a>

usa questo in jQuery

    $('#BT_Download').attr('disabled',true);

aggiungi questo a css:

    a[disabled="disabled"] {
        pointer-events: none;
    }

1
Non avevo mai trovato questa proprietà CSS prima, ma questo, per me, è di gran lunga il metodo più semplice per disabilitare un collegamento ipertestuale. Il bello è che quando rimuovete la classe che contiene la pointer-events: noneproprietà dagli elementi di ancoraggio, ritornano a fare qualunque cosa abbiano fatto in precedenza quando cliccato. Quindi, se fossero collegamenti ipertestuali di base, torneranno alla navigazione dell'URL nel loro hrefattributo e se hanno un gestore di eventi click impostato, questo diventa di nuovo attivo. Molto più semplice del salvataggio di hrefvalori e gestori di clic.
Philip Stratford,

Mi piace questa soluzione, è la più semplice.
louis

Da una manciata di "soluzioni" quando nulla ha funzionato (e quasi rinunciare a questa via), è arrivato a questo gioiello . È una soluzione semplice. E l'unico che FUNZIONA DAVVERO. Complimenti.
user12379095

5

Il mio preferito in "checkout per modificare un elemento e impedire -wild wild click ad ovunque- mentre in un checkout" funzioni

$('a').click(function(e) {
    var = $(this).attr('disabled');
    if (var === 'disabled') {
        e.preventDefault();
    }
});

Quindi, se voglio che tutti i collegamenti esterni in una barra degli strumenti della seconda azione siano disabilitati mentre si è in "modalità modifica" come descritto sopra, aggiungerò nella funzione di modifica

$('#actionToolbar .external').attr('disabled', true);

Esempio di collegamento dopo l'incendio:

<a href="http://goo.gl" target="elsewhere" class="external" disabled="disabled">Google</a>

E ora PUOI usare la proprietà disabilitata per i collegamenti

Saluti!


3

Dovresti trovare la tua risposta qui .

Grazie @Will e @Matt per questa elegante soluzione.

jQuery('#path .to .your a').each(function(){
    var $t = jQuery(this);
    $t.after($t.text());
    $t.remove();
});

3

puoi semplicemente nascondere e mostrare il link come preferisci

$(link).hide();
$(link).show();

2

Basta innescare roba, impostare un po 'di bandiera, restituire false. Se la bandiera è impostata, non fare nulla.


L'ho provato impostando una classe, quindi chiamando quella classe in seguito ma restituendo false carry through e impedisce il richiamo del collegamento.
davebowker,

1

unbind()è stato deprecato jQuery 3, utilizzare off()invece il metodo:

$("a").off("click");

0

So che questo non è con jQuery ma è possibile disabilitare un collegamento con alcuni semplici CSS:

a[disabled] {
  z-index: -1;
}

il codice HTML sarebbe simile

<a disabled="disabled" href="/start">Take Survey</a>

0

Funziona con collegamenti che hanno l'attributo onclick impostato in linea. Ciò consente anche di rimuovere successivamente "return false" per abilitarlo.

        //disable all links matching class
        $('.yourLinkClass').each(function(index) {
            var link = $(this);
            var OnClickValue = link.attr("onclick");
            link.attr("onclick", "return false; " + OnClickValue);
        });

        //enable all edit links
        $('.yourLinkClass').each(function (index) {
            var link = $(this);
            var OnClickValue = link.attr("onclick");
            link.attr("onclick", OnClickValue.replace("return false; ", ""));
        });

-2

Basta usare $("a").prop("disabled", true);. Questo disabiliterà davvero l'elemento de link. Deve essere prop("disabled", true). Non usareattr("disabled", true)

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.