Die Funktion event.preventDefault () funktioniert im IE nicht

202

Folgendes ist mein JavaScript-Code (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 allen Browsern außer IE funktioniert dies einwandfrei. Im IE verursacht dies jedoch einen Fehler. Ich habe IE8, also habe ich bei der Verwendung des JavaScript-Debuggers festgestellt, dass das eventObjekt keine preventDefaultMethode hat, die den Fehler verursacht, und daher wird das Formular gesendet. Die Methode wird im Fall von Firefox unterstützt (was ich mit Firebug herausgefunden habe).

Irgendeine Hilfe?

sv_in
quelle
Es tut; Laut den Dokumenten ( mootools.net/docs/core/Native/Event#Event:preventDefault ) sollte das, was er hat, funktionieren: "Ereignismethode: PreventDefault - Cross-Browser-Methode, um die Standardaktion des Ereignisses zu verhindern."
Paolo Bergantino
Mein schlechtes, ich habe meinen Kommentar gelöscht, der lautete: "Haben Mootools keine Methode, um Ereignisse zu stoppen?". Es gibt also ein Problem mit mootools auf ie8 ...
Alsciende
2
Dieses Problem kann nicht reproduziert werden. Diese Geige "funktioniert für mich auf dh 8" Könnten Sie eine reduzierte Geige einrichten, um den Fehler anzuzeigen? jsfiddle.net
eerne

Antworten:

472

im IE können Sie verwenden

event.returnValue = false;

um das gleiche Ergebnis zu erzielen.

Und um keinen Fehler zu erhalten, können Sie die Existenz von PreventDefault testen:

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

Sie können beide kombinieren mit:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Alsciende
quelle
48
Der folgende Code hat bei mir funktioniert: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in
229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
Mortiy
31
Es ist erwähnenswert, dass "Ereignis" das globale Ereignisobjekt in IE8 sein muss. Sie können das an den Ereignishandler übergebene Ereignis nicht wie e.preventDefault verwenden. Es muss event.preventDefault sein, damit dies in IE8 funktioniert.
jmort253
event.preventDefault();hat aus irgendeinem Grund aus heiterem Himmel aufgehört, für mich in FireFox zu arbeiten. Ich habe den Code von mority verwendet und es hat großartig funktioniert. Danke ~
James
8
Nur um dem Kommentar von @ jmort253 etwas Klarheit zu verleihen:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luke
23

Wenn Sie das Ereignis über die addEvent-Funktion von mootools binden, erhält Ihr Ereignishandler ein festes (erweitertes) Ereignis, das als Parameter übergeben wird. Es wird immer die PreventDefault () -Methode enthalten.

Probieren Sie diese Geige aus, um den Unterschied in der Ereignisbindung festzustellen. 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>

Für alle jQuery- Benutzer können Sie bei Bedarf ein Ereignis beheben. Angenommen, Sie haben HTML onclick = ".." verwendet und erhalten ein IE-spezifisches Ereignis, dem PreventDefault () fehlt. Verwenden Sie einfach diesen Code, um es abzurufen.

e = $.event.fix(e);

Danach e.preventDefault (); funktioniert gut.

alter Zauberer
quelle
2
Leider funktioniert dieser Trick bei mir nicht. Ich verwende IE 10 und bevor ich e.preventDefault () aufrufe; Ich rufe $ .event.fix (e) auf; ohne Erfolg :(
Beatles1692
Es könnte aus jquery 2 entfernt worden sein? IE10 benötigt das Update jedoch nicht.
Oldwizard
Haben Sie das feste Ereignis erneut der Variablen e zugewiesen?
Oldwizard
11

Ich weiß, dass dies ein ziemlich alter Beitrag ist, aber ich habe nur einige Zeit damit verbracht, diese Arbeit in IE8 zu machen.

Es scheint, dass es einige Unterschiede in den IE8-Versionen gibt, da die hier und in anderen Threads veröffentlichten Lösungen bei mir nicht funktionierten.

Nehmen wir an, wir haben diesen Code:

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

In meinem IE8 preventDefault()existiert die Methode wegen jQuery, funktioniert aber nicht (wahrscheinlich wegen des folgenden Punktes), so dass dies fehlschlägt.

Auch wenn ich die returnValueEigenschaft direkt auf false setze :

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

Dies funktioniert auch nicht, da ich nur eine Eigenschaft des benutzerdefinierten jQuery-Ereignisobjekts festgelegt habe.

Die einzige Lösung, die für mich funktioniert, besteht darin, die Eigenschaft returnValueeiner globalen Variablen event wie folgt festzulegen :

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

Nur um es jemandem zu erleichtern, der versucht, IE8 zur Arbeit zu überreden. Ich hoffe, dass IE8 bald schrecklich im schmerzhaften Tod sterben wird.

AKTUALISIEREN:

Wie sv_in hervorhebt , können Sie das event.originalEventursprüngliche Ereignisobjekt abrufen und die returnValueEigenschaft im ursprünglichen Objekt festlegen . Aber ich habe es noch nicht in meinem IE8 getestet.

Muffir
quelle
1
Sie können auch das ursprüngliche Browserereignisobjekt von abrufen event.originalEvent. Weitere Informationen
sv_in
6

Mootools definiert PreventDefault in Ereignisobjekten neu. Ihr Code sollte also in jedem Browser einwandfrei funktionieren. Wenn dies nicht der Fall ist, gibt es ein Problem mit der Unterstützung von ie8 in mootools.

Haben Sie Ihren Code auf ie6 und / oder ie7 getestet?

Der Arzt sagt

Jedes mit addEvent hinzugefügte Ereignis erhält die mootools-Methode automatisch, ohne dass sie manuell instanziiert werden muss.

Falls dies nicht der Fall ist, möchten Sie es vielleicht versuchen

new Event(event).preventDefault();
Alsciende
quelle
1
Es gab ein Problem beim Verpacken wie dieses auch im IE. Oh mein Gott! Warum IE?
sv_in
Sie möchte das Ereignis jedoch nicht stoppen, sondern nur die Standardaktion verhindern.
Alsciende
5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Getestet auf IE 9 und Chrome.

RolandoCC
quelle
2
Funktioniert nicht in IE 11 (e.preventDefault ist eine Funktion, obwohl sie nichts zu tun scheint)
GreySage
4

Verwenden Sie zum Deaktivieren einer Tastaturtaste nach IE9: e.preventDefault();

Verwenden Sie: oder, um eine normale Tastaturtaste unter IE7 / 8 zu deaktivierene.returnValue = false;return false;

Wenn Sie versuchen, eine Tastenkombination zu deaktivieren (z. B. mit Strg Ctrl+F), müssen Sie folgende Zeilen hinzufügen:

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

Hier ist ein vollständiges Beispiel nur für 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;
    }
});

Referenz: So deaktivieren Sie Tastaturkürzel in IE7 / IE8

JBE
quelle
Sie sind der einzige Antwortende, der den Nagel auf den Kopf trifft. Der einzige Grund, warum hier jemand über frühen IE spricht, ist, dass er plattformübergreifende Funktionen benötigt. "e.keyCode = 0;" beendet jede Standardaktion im frühen IE.
www-0av-Com
3

Hier ist eine Funktion, die ich mit dem nächtlichen Build von jquery 1.3.2 und dem 18.09.2009 getestet habe. Lassen Sie mich Ihre Ergebnisse damit wissen. In Safari, FF, Opera unter OSX läuft alles gut. Es dient ausschließlich zur Behebung eines problematischen IE8-Fehlers und kann zu unbeabsichtigten Ergebnissen führen:

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

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

Verwendung:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})
Eliran Malka
quelle
1
Ich habe diese stopMethode noch nie gesehen und konnte sie in msdn nicht finden. Was tut es?
Oriol
1
.stop()löst eine Ausnahme aus, da sie nicht existiert. Jede Ausnahme hat den gewünschten Effekt.
Jay Bazuzi
und warum sollten Sie eine Ausnahme auslösen wollen? Ich meine, wenn Sie eine Ausnahme e.preventDefault()auslösen möchten, können Sie einfach anrufen, weil es sowieso eine Ausnahme auslösen würde ...
Matthias Burger
2

preventDefaultist ein weit verbreiteter Standard; Die Verwendung eines Ad-hoc-Systems jedes Mal, wenn Sie mit alten IE-Versionen kompatibel sein möchten, ist umständlich. Verwenden Sie besser eine Polyfüllung:

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

Dadurch wird der Prototyp des Ereignisses geändert und diese Funktion hinzugefügt, eine großartige Funktion von Javascript / DOM im Allgemeinen. Jetzt können Sie e.preventDefaultohne Probleme verwenden.

EliuX
quelle
0

return false in Ihrem Listener sollte in allen Browsern funktionieren.

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

FWIW, falls jemand diese Frage später erneut beantwortet, können Sie auch überprüfen, was Sie an Ihre onKeyPress-Handlerfunktion übergeben.

Ich bin auf diesen Fehler gestoßen, als ich versehentlich onKeyPress (this) anstelle von onKeyPress (event) übergeben habe.

Nur noch etwas zu überprüfen.

Kirby L. Wallace
quelle
0

Mir half eine Methode mit einer Funktionsprüfung. Diese Methode funktioniert in IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Pablo
quelle