Frage

Im Folgenden finden Sie meinen 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 dh, funktioniert dies gut. Aber in IE verursacht dies einen Fehler. Ich habe IE8, während ich seinen JavaScript -Debugger verwendete, habe ich herausgefunden, dass die event Objekt hat keine preventDefault Methode, die den Fehler verursacht, und so wird das Formular eingereicht. Die Methode wird bei Firefox unterstützt (was ich mit Firebug herausgefunden habe).

Irgendeine Hilfe?

War es hilfreich?

Lösung

In IE können Sie verwenden

event.returnValue = false;

das gleiche Ergebnis erzielen.

Und um keinen Fehler zu erhalten, können Sie auf das Vorhandensein von PreventDefault testen:

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

Sie können die beiden mit:

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

Andere Tipps

Wenn Sie das Ereignis über die AddEvent -Funktion von Mootools binden, wird Ihr Event -Handler ein festes (erweitertes) Ereignis als Parameter übergeben. Es enthält immer die Verhinderungdefault () -Methode.

Probieren Sie diese Geige aus, um den Unterschied in der Ereignisbindung zu erkennen.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 da draußen können Sie bei Bedarf ein Ereignis beheben. Sagen Sie, dass Sie HTML Onclick = ".." verwendet haben und ein spezifisches Ereignis erhalten, bei dem es fehlt, dass Siedefault () fehlt. Verwenden Sie diesen Code einfach, um ihn zu erhalten.

e = $.event.fix(e);

Danach e.preventDefault (); funktioniert gut.

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 IE8 -Versionen gibt, da Lösungen hier und in anderen Threads bei mir nicht funktioniert haben.

Nehmen wir an, wir haben diesen Code:

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

In meinem IE8 preventDefault() Die Methode gibt es aufgrund von JQuery, funktioniert aber nicht (wahrscheinlich wegen des folgenden Punktes), sodass dies fehlschlägt.

Auch wenn ich setze returnValue Eigenschaft direkt zu falsch:

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

Dies funktioniert auch nicht, da ich nur eine Eigenschaft von JQuery Custom Event -Objekt festgelegt habe.

Die einzige Lösung, die für mich funktioniert, besteht darin, Eigenschaften festzulegen returnValue von Globale Variable event so was:

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

Nur um es jemandem zu erleichtern, der versuchen wird, IE8 davon zu überzeugen, zu arbeiten. Ich hoffe, dass der IE8 bald in schmerzhaftem Tod schrecklich sterben wird.

AKTUALISIEREN:

Wie sv_in weist darauf hin, dass Sie verwenden könnten event.originalEvent Um Original -Ereignisobjekte zu erhalten und festzulegen returnValue Eigenschaft im ursprünglichen. Aber ich habe es noch nicht in meinem IE8 getestet.

Mootools definiert die Verhinderung von Ereignisobjekten neu. Ihr Code sollte also in jedem Browser gut funktionieren. Wenn dies nicht der Fall ist, gibt es ein Problem mit der IE8 -Unterstützung in Mootools.

Hast du deinen Code auf IE6 und/oder IE7 getestet?

Der Doc sagt

Jedes mit AddEvent hinzugefügte Ereignis erhält die Mootools -Methode automatisch, ohne dass sie manuell eingestuft werden müssen.

Aber für den Fall, dass dies nicht der Fall ist, möchten Sie vielleicht versuchen

new Event(event).preventDefault();
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Getestet auf IE 9 und Chrome.

Um einen Tastaturschlüssel nach IE9 zu deaktivieren, verwenden Sie: e.preventDefault();

Zu deaktivieren a Regelmäßiger Tastaturschlüssel Unter IE7/8, verwenden Sie: e.returnValue = false; oder return false;

Wenn Sie versuchen, a zu deaktivieren Tastaturkürzel (mit Strg wie, wie Ctrl+F) Sie müssen diese Zeilen hinzufügen:

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

Hier ist ein vollständiges Beispiel für IE7/8 nur:

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;
    }
});

Bezug : So deaktivieren Sie Tastaturverknüpfungen in IE7 / IE8

Hier ist eine Funktion, die ich mit JQuery 1.3.2 und dem nächtlichen Build von 18.18.2009 getestet habe. Lassen Sie mich Ihre Ergebnisse damit wissen. Alles ausgeführt an diesem Ende in Safari, FF, Opera unter OSX. Es dient ausschließlich für die Behebung eines problematischen IE8 -Fehlers und kann unbeabsichtigte Ergebnisse haben:

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

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

Verwendungszweck:

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

preventDefault ist ein weit verbreiteter Standard; Wenn Sie jedes Mal, wenn Sie mit alten IE -Versionen konform sein möchten, ein Adhoc verwenden, ist es umständlich, eine Polyfill zu verwenden:

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

Dies ändert den Prototyp des Ereignisses und fügt diese Funktion hinzu, eine großartige Funktion von JavaScript/DOM im Allgemeinen. Jetzt können Sie verwenden e.preventDefault ohne Problem.

return false in your listener should work in all browsers.

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

FWIW, in case anyone revisits this question later, you might also check what you are handing to your onKeyPress handler function.

I ran into this error when I mistakenly passed onKeyPress(this) instead of onKeyPress(event).

Just something else to check.

I was helped by a method with a function check. This method works in IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top