Impedisci l’azione onclick con jQuery

ci sono alcuni collegamenti con azioni evento onclick

Let's panic I can't panic no more 

Ho bisogno di impedire l’esecuzione di actons di eventi su collegamenti con attributi disabilitati senza rimuovere azioni onclick.

 $('a[disabled]').click(function(e){ e.stopPropagation(); return false; }); 

Questo codice non mi aiuta

aggiornamento Anche questo codice non funziona

   TEST  $('a[disabled], a.disabled').click(function(e){ console.log('override?'); e.stopImmediatePropagation(); e.preventDefault(); e.stopPropagation(); return false; });   

jQuery non risolverà questo OOTB. Può essere d’aiuto, ma nessuno di stopPropagation , stopImmediatePropagation , preventDefault , return false funzionerà se si collegano semplicemente all’elemento. Devi eseguire l’ override del gestore di clic dell’elemento.

Comunque tu affermi nella tua domanda “senza rimuovere azioni onclick” . Quindi è necessario sovrascrivere il comportamento predefinito nel momento in cui viene triggersto l’evento (in opposizione all’approccio più pulito di eliminare semplicemente l’attributo onclick per le ancore disabilitate):

Ecco cosa intendo:

     Disable clicks    Let's panic I can't panic no more    

Demo qui.

L’approccio consiste nell’override del gestore di clic inline ( onclick ) con logica preventiva per intercettare il caso in cui l’ancoraggio è “disabilitato” e quindi annullare l’evento (con return false ).

Il vantaggio è che per abilitare di nuovo l’ancora, semplicemente .removeAttr('disabled') su di esso.

disabled non è una proprietà di ancore. Usa invece qualcosa come rel='disabled' .

 $('a[rel="disabled"]').click( function() { return false; } ); 

Aggiornamento :

Ah, certo. Attiva ancora l’ alert perché è effettivamente in linea nel markup! Non lo faccio mai e quindi non me ne sono accorto. Prendi il gestore dei clic dal markup e fallo in jQuery e quindi puoi solo fare qualcosa del tipo:

 $('a').click( function() { if( $(this).attr('rel') == 'disabled' ) { return; } // do stuff here when not disabled return false; // so your '#' href doesn't get used } ); 

Il problema è che jQuery aggiunge eventi in ordine. Per interrompere altri eventi, gli eventi che devi interrompere devono arrivare dopo il codice di arresto. Dal momento che hai un codice nel tuo clic, dovrai cambiare l’ordine. Questo è quello che farei:

 TEST TEST  

Il vantaggio è semplicemente rimuovere / aggiungere la class disabilitata usando jQuery: $('a#whatever').addClass('disabled') o rimuoverlo $('a#whatever').removeClass('disabled') e nessun’altra pulizia / l’installazione è richiesta.

Qualsiasi gestore di clic aggiunto da jQuery sembra sparare dopo quelli aggiunti nel markup. La mia soluzione sarebbe quella di applicare i gestori di clic utilizzando jQuery anziché nel markup, ma non si può avere abbastanza controllo sul codice per farlo. Se lo fai, semplicemente non applicare il gestore di clic per ancorare i tag con la class disabilitata (e, sì, vorrei usare una class piuttosto che un attributo inappropriato). Se non hai il controllo sul markup, allora potresti voler sostituire il gestore di clic usando jQuery, memorizzandolo per una successiva richiesta.

  $(function() { $('a.disabled').each( function() { var $this = $(this); var click = $this.attr('onclick'); if (click) { $this.data('click',click); // add return false to prevent default action $this[0].onclick = function() { return false; }; } }); $('#restoreClick').click( function() { $('a.disabled').each( function() { var $this = $(this); $this.removeClass('disabled'); var click = $this.data('click'); if (click) { $this[0].onclick = click; } }); }); }); 

Testato con:

  

Ho trovato una soluzione piuttosto semplice per prevenire onclicks oggi, ma mantenendo l’azione se ne hai bisogno.

 Let's panic I can't panic no more $('a').click(function(e){ if($(this).attr('disabled')) e.preventDefault(); }); 

Non sono un grande fan dell’uso di “javascript:”, ma questa è stata di gran lunga la soluzione più semplice al problema.

Spero che sia d’aiuto!