Come separare un ascoltatore che chiama event.preventDefault () (usando jQuery)?


128

jquery attiva / disattiva le chiamate preventDefault () per impostazione predefinita, quindi i valori predefiniti non funzionano. non puoi fare clic su una casella di controllo, non puoi fare clic su un collegamento ecc. ecc

è possibile ripristinare il gestore predefinito?


Puoi dare qualche esempio di codice?
Jojo,

4
La domanda nel titolo è fantastica! Peccato che la vera domanda non sia ... Speravo di trovare qui la risposta a come (se possibile) possiamo "annullare" l'effetto di preventDefaultdopo che è stato chiamato. Attualmente questa domanda è in realtà "come separare un ascoltatore di eventi con jQuery?".
Stijn de Witt,

Risposte:


80

Nel mio caso:

$('#some_link').click(function(event){
    event.preventDefault();
});

$('#some_link').unbind('click'); ha funzionato come unico metodo per ripristinare l'azione predefinita.

Come visto qui: https://stackoverflow.com/a/1673570/211514


2
Se questo elemento ha un altro gestore di clic, si sciolgono tutti gli eventi collegati e non solo il gestore impedito ...
Aure77

56

È abbastanza semplice

Supponiamo che tu faccia qualcosa del genere

document.ontouchmove = function(e){ e.preventDefault(); }

ora per ripristinare la situazione originale, fare quanto segue ...

document.ontouchmove = function(e){ return true; }

Da questo sito Web .


Questa soluzione non funziona dopo $ ('# a_link'). Click (function (e) {e.preventDefault ();}); usa la funzione unbind.
Denis Makarskiy,

2
Il link che hai fornito è interrotto.
Accatastato l'

16

Non è possibile ripristinare un preventDefault()ma quello che puoi fare è ingannarlo :)

<div id="t1">Toggle</div>
<script type="javascript">
$('#t1').click(function (e){
   if($(this).hasClass('prevented')){
       e.preventDefault();
       $(this).removeClass('prevented');
   }else{
       $(this).addClass('prevented');
   }
});
</script>

Se vuoi fare un ulteriore passo in avanti puoi persino usare il pulsante di attivazione per attivare un evento.


Sono abbastanza sicuro che lo sia - l'ho fatto di recente su un design. All'inizio con un clic di un pulsante ho impedito lo scorrimento in un iphone aggiungendo e.preventDefault all'evento touchmove e poi dopo che l'animazione è stata fatta sono tornato vero e ha funzionato come un fascino.
Foxybagga,

11
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

// Bind:
$(element).on('click', DoPrevent);

// UnBind:
$(element).off('click', DoPrevent);

Il modo in cui ha funzionato per me è stato: $ (document) .off ('touchmove'); $ (documento) .on ('touchmove', function () {return true;});
rogervila,

9

in alcuni casi * è possibile inizialmente return falseanziché e.preventDefault(), quindi quando si desidera ripristinare l'impostazione predefinita return true.

* Significato quando non ti dispiace che l'evento bolle e non lo usi e.stopPropagation()insiemee.preventDefault()

Vedi anche domande simili (anche nello stack Overflow)

o nel caso di checkbox puoi avere qualcosa del tipo:

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 

9

È possibile ripristinare l'azione predefinita (se è un follow HREF) facendo questo:

window.location = $(this).attr('href');


2
le idee erano giuste ma il codice pronto per l'uso non funzionava per me (a meno che non sia solo una modifica della sintassi in jquery) che ho usato: window.location = $ (this) .attr ('href');
Modika,

3

se è un link allora $(this).unbind("click"); , riattiverebbe il clic del collegamento e il comportamento predefinito verrà ripristinato.

Ho creato un violino demo JS per dimostrare come funziona:

Ecco il codice del violino JS:

HTML:

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<a href="http://jquery.com">Default click action is prevented, only on the third click it would be enabled</a>
<div id="log"></div>

Javascript:

<script>
var counter = 1;
$(document).ready(function(){
$( "a" ).click(function( event ) {
  event.preventDefault();

  $( "<div>" )
    .append( "default " + event.type + " prevented "+counter )
    .appendTo( "#log" );

    if(counter == 2)
    {
        $( "<div>" )
    .append( "now enable click" )
    .appendTo( "#log" );

    $(this).unbind("click");//-----this code unbinds the e.preventDefault() and restores the link clicking behavior
    }
    else
    {
        $( "<div>" )
    .append( "still disabled" )
    .appendTo( "#log" );
    }
    counter++;
});
});
</script>

2

Prova questo codice, penso che risolva il tuo problema:

event.stopPropagation();

Riferimento


è necessario interrompere la propagazione su un gestore che si verifica prima del gestore che impedisce l'impostazione predefinita. Puoi farlo su capturePhase se l'altro gestore è registrato sulla fase bubble.
Vitim.us

2

Il modo migliore per farlo utilizzando lo spazio dei nomi. È un modo sicuro e protetto. Qui .rb è lo spazio dei nomi che assicura che la funzione unbind funzioni su quel particolare keydown ma non su altri.

$(document).bind('keydown.rb','Ctrl+r',function(e){
            e.stopImmediatePropagation();
            return false;
        });

$(document).unbind('keydown.rb');

ref1: http://idodev.co.uk/2014/01/safely-binding-to-events-using-namespaces-in-jquery/

ref2: http://jqfundamentals.com/chapter/events


1

Disattivare:

document.ontouchstart = function(e){ e.preventDefault(); }

Abilitare:

document.ontouchstart = function(e){ return true; }

1

Il metodo preventDefault () dell'interfaccia evento dice all'agente utente che se l'evento non viene gestito in modo esplicito, la sua azione predefinita non dovrebbe essere eseguita normalmente. L'evento continua a propagarsi come al solito, a meno che uno dei suoi listener di eventi chiama stopPropagation () o stopImmediatePropagation (), uno dei due che termina la propagazione in una sola volta.

La chiamata a preventDefault () durante qualsiasi fase del flusso di eventi annulla l'evento, il che significa che non si verificherà alcuna azione predefinita normalmente eseguita dall'implementazione a seguito dell'evento.

È possibile utilizzare Event.cancelable per verificare se l'evento è annullabile. La chiamata a preventDefault () per un evento non annullabile non ha alcun effetto.

window.onKeydown = event => {
    /*
        if the control button is pressed, the event.ctrKey 
        will be the value  [true]
    */

    if (event.ctrKey && event.keyCode == 83) {
        event.preventDefault();
        // you function in here.
    }
}

0

Ho avuto un problema in cui avevo bisogno dell'azione predefinita solo dopo la conclusione di un'azione personalizzata (abilita campi di input altrimenti disabilitati su un modulo). Ho racchiuso l'azione predefinita (submit ()) in una propria funzione ricorsiva (dosubmit ()).

var prevdef=true;
var dosubmit=function(){
    if(prevdef==true){
        //here we can do something else first//
        prevdef=false;
        dosubmit();
    }
    else{
        $(this).submit();//which was the default action
    }
};

$('input#somebutton').click(function(){dosubmit()});

1
Nota generale: mentre alcuni programmatori si sentono if (predef == true) più esplicito, si stanno aggiungendo 7 caratteri al codice JS senza motivo. if (prevdef)è altrettanto leggibile. Inoltre, hai aggiunto un gestore di eventi anonimo ridondante quando .click(dosubmit)fa la stessa cosa in .click(function(){dosubmit()})quanto non vengono passati parametri.
Gone Coding

0

Usa un valore booleano:

let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) { 
    if (prevent_touch) event.preventDefault(); 
}

Lo uso in un'app Web progressiva per impedire lo scorrimento / lo zoom su alcune "pagine" e consentire ad altre.


0

È possibile impostare per formare 2 classi. Dopo aver impostato lo script JS su uno di essi, quando si desidera disabilitare lo script, è sufficiente eliminare la classe con script associato da questo modulo.

HTML:

<form class="form-create-container form-create"> </form>   

JS

$(document).on('submit', '.form-create', function(){ 
..... ..... ..... 
$('.form-create-container').removeClass('form-create').submit();

});

-3
$('#my_elementtt').click(function(event){
    trigger('click');
});

-10

Non sono sicuro che tu voglia dire: ma ecco una soluzione per un problema simile (e forse lo stesso) ...

Uso spesso preventDefault () per intercettare gli oggetti. Tuttavia: non è l'unico metodo di intercettazione ... spesso potresti semplicemente voler una "domanda" a seguito della quale il comportamento continua come prima o si interrompe. In un caso recente ho usato la seguente soluzione:

$("#content").on('click', '#replace', (function(event){ return confirm('Are you sure you want to do that?') }));

Fondamentalmente, "prevenire il default" ha lo scopo di intercettare e fare qualcos'altro: la "conferma" è progettata per l'uso in ... beh, confermando!

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.