La funzione event.preventDefault () non funziona in IE


202

Di seguito è riportato il mio codice JavaScript (mootools):

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

In tutti i browser tranne IE, questo funziona bene. Ma in IE, questo provoca un errore. Ho IE8 quindi mentre usando il suo debugger JavaScript, ho scoperto che l' eventoggetto non ha un preventDefaultmetodo che causa l'errore e quindi il modulo viene inviato. Il metodo è supportato in caso di Firefox (che ho scoperto usando Firebug).

Qualsiasi aiuto?


Lo fa; secondo i documenti ( mootools.net/docs/core/Native/Event#Event:preventDefault ) ciò che ha dovrebbe funzionare: "Metodo evento: preventDefault - Metodo cross browser per impedire l'azione predefinita dell'evento".
Paolo Bergantino,

Mio male, ho cancellato il mio commento, che era "i mootools non hanno un metodo per fermare gli eventi?". Quindi c'è un problema con i mootools su ie8 ...
Alsciende,

2
Impossibile riprodurre questo problema. Questo violino "funziona per me su 8" Potresti impostare un violino ridotto per mostrare l'errore? jsfiddle.net
eerne

Risposte:


472

in IE, puoi usare

event.returnValue = false;

per ottenere lo stesso risultato.

E per non ottenere un errore, puoi verificare l'esistenza di preventDefault:

if(event.preventDefault) event.preventDefault();

Puoi combinare i due con:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

48
Il seguente codice ha funzionato per me: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in

229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mory

31
Vale la pena notare che "evento" deve essere l'oggetto evento globale in IE8. Non è possibile utilizzare l'evento passato nel gestore eventi, come e.preventDefault, deve essere event.preventDefault affinché funzioni in IE8.
jmort253,

event.preventDefault();ha smesso di funzionare per me in FireFox per qualche motivo, all'improvviso. Ha usato il codice di mority e ha funzionato benissimo. Grazie ~
James,

8
Solo per aggiungere un po 'di chiarezza al commento di @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luca

23

Se si associa l'evento tramite la funzione addEvent di mootools, il gestore eventi riceverà un evento fisso (aumentato) come parametro. Conterrà sempre il metodo preventDefault ().

Prova questo violino per vedere la differenza nell'associazione di eventi. http://jsfiddle.net/pFqrY/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

Per tutti gli utenti di jQuery , è possibile correggere un evento quando necessario. Supponi di aver usato HTML onclick = ".." e di ottenere un evento specifico di IE in cui manca preventDefault (), basta usare questo codice per ottenerlo.

e = $.event.fix(e);

Dopodiché e.preventDefault (); funziona bene.


2
Purtroppo questo trucco non funziona per me. Sto usando IE 10 e prima di chiamare e.preventDefault (); Ho chiamato $ .event.fix (e); senza successo :(
Beatles1692,

Potrebbe essere stato rimosso da jquery 2? Ma IE10 non ha bisogno della correzione.
oldwizard

Hai assegnato di nuovo l'evento fisso alla variabile e?
oldwizard

11

So che questo è un post piuttosto vecchio ma ho appena trascorso un po 'di tempo a provare a farlo funzionare in IE8.

Sembra che ci siano alcune differenze nelle versioni di IE8 perché le soluzioni pubblicate qui e in altri thread non hanno funzionato per me.

Diciamo che abbiamo questo codice:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

Nel mio preventDefault()metodo IE8 esiste a causa di jQuery, ma non funziona (probabilmente a causa del punto seguente), quindi questo fallirà.

Anche se ho impostato la returnValueproprietà direttamente su false:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

Anche questo non funzionerà, perché ho appena impostato alcune proprietà dell'oggetto evento personalizzato jQuery.

L'unica soluzione che funziona per me è impostare la proprietà returnValuedella variabile globale in event questo modo:

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

Solo per rendere più facile per qualcuno che cercherà di convincere IE8 a lavorare. Spero che IE8 morirà presto orribilmente in una morte dolorosa.

AGGIORNARE:

Come sv_in sottolinea, è possibile utilizzare event.originalEventper ottenere l'oggetto evento originale e impostare la returnValueproprietà in quello originale. Ma non l'ho ancora testato su IE8.


1
È inoltre possibile ottenere l'oggetto evento del browser originale da event.originalEvent. Ulteriori informazioni: stackoverflow.com/a/16675056/22550
sv_in

6

Mootools ridefinisce preventDefault negli oggetti Event. Quindi il tuo codice dovrebbe funzionare bene su ogni browser. In caso contrario, c'è un problema con il supporto ie8 nei mootools.

Hai testato il tuo codice su ie6 e / o ie7?

Il doc dice

Ogni evento aggiunto con addEvent ottiene automaticamente il metodo mootools, senza la necessità di istanziarlo manualmente.

ma in caso contrario, potresti provare

new Event(event).preventDefault();

1
Si è verificato un problema durante il wrapping in questo modo anche in IE. Oh mio Dio! Perché IE?
sv_in

Lei non vuole fermare l'evento, però, semplicemente prevenire la sua azione predefinita.
Alsciende,

5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Testato su IE 9 e Chrome.


2
Non funziona in IE 11 (e.preventDefault è una funzione, sebbene non sembri fare nulla)
GreySage

4

Per disabilitare un tasto della tastiera dopo IE9, utilizzare: e.preventDefault();

Per disabilitare un normale tasto della tastiera in IE7 / 8, utilizzare: e.returnValue = false;oreturn false;

Se provi a disabilitare una scorciatoia da tastiera (con Ctrl, come Ctrl+F), devi aggiungere quelle righe:

try {
    e.keyCode = 0;
}catch (e) {}

Ecco un esempio completo solo per IE7 / 8:

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

Riferimento: come disabilitare le scorciatoie da tastiera in IE7 / IE8


Sei l'unico risponditore a colpire l'unghia sulla testa. L'unico motivo per cui qualcuno qui parla di IE iniziale è che hanno bisogno della funzionalità multipiattaforma. "e.keyCode = 0;" ucciderà qualsiasi azione predefinita all'inizio di IE.
www-0av-Com,

3

Ecco una funzione che ho testato con la build notturna di jquery 1.3.2 e 09-18-2009. Fammi sapere i tuoi risultati con esso. Tutto funziona bene in questo senso in Safari, FF, Opera su OSX. Serve esclusivamente per correggere un bug IE8 problematico e può avere risultati indesiderati:

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

Uso:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})

1
Non ho mai visto questo stopmetodo prima e non sono riuscito a trovarlo in msdn. Che cosa fa?
Oriol,

1
.stop()genera un'eccezione, perché non esiste. Qualsiasi eccezione avrà l'effetto desiderato.
Jay Bazuzi,

e perché vorresti lanciare un'eccezione? Voglio dire, se vuoi lanciare un'eccezione, potresti semplicemente chiamare e.preventDefault()perché genererebbe comunque un'eccezione ...
Matthias Burger,

2

preventDefaultè uno standard diffuso; usare un ad hoc ogni volta che vuoi essere conforme alle vecchie versioni di IE è complicato, meglio usare un polyfill:

if (typeof Event.prototype.preventDefault === 'undefined') {
    Event.prototype.preventDefault = function (e, callback) {
        this.returnValue = false;
    };
}

Questo modificherà il prototipo dell'evento e aggiungerà questa funzione, una grande caratteristica di javascript / DOM in generale. Ora puoi usarlo e.preventDefaultsenza problemi.


0

return false nel tuo listener dovrebbe funzionare in tutti i browser.

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}

0

FWIW, nel caso in cui qualcuno riesca a rivedere questa domanda in un secondo momento, potresti anche controllare cosa stai passando alla tua funzione di gestore onKeyPress.

Ho riscontrato questo errore quando ho erroneamente passato su KeyPress (questo) anziché su KeyKey (evento).

Solo qualcos'altro da controllare.


0

Sono stato aiutato da un metodo con un controllo funzionale. Questo metodo funziona in IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = 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.