La fonction event.preventDefault () ne fonctionne pas dans IE

202

Voici mon code 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', '');
        }
    });
});

Dans tous les navigateurs sauf IE, cela fonctionne très bien. Mais dans IE, cela provoque une erreur. J'ai IE8 donc en utilisant son débogueur JavaScript, j'ai découvert que l' eventobjet n'a pas de preventDefaultméthode qui provoque l'erreur et donc le formulaire est envoyé. La méthode est prise en charge dans le cas de Firefox (que j'ai découvert en utilisant Firebug).

De l'aide?

sv_in
la source
Cela fait; selon les documents ( mootools.net/docs/core/Native/Event#Event:preventDefault ) ce qu'il a devrait fonctionner: "Méthode d'événement: preventDefault - Méthode de navigateur croisé pour empêcher l'action par défaut de l'événement."
Paolo Bergantino
Mon mauvais, j'ai supprimé mon commentaire, qui était "les mootools n'ont-ils pas de méthode pour arrêter les événements?". Il y a donc un problème avec les mootools sur ie8 ...
Alsciende
2
Impossible de reproduire ce problème. Ce violon "fonctionne pour moi sur ie 8". Pourriez-vous configurer un violon réduit pour afficher l'erreur? jsfiddle.net
eerne

Réponses:

472

dans IE, vous pouvez utiliser

event.returnValue = false;

pour obtenir le même résultat.

Et pour ne pas obtenir d'erreur, vous pouvez tester l'existence de preventDefault:

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

Vous pouvez combiner les deux avec:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Alsciende
la source
48
Le code suivant a fonctionné pour moi: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in
229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mortiy
31
Il convient de noter que «événement» doit être l'objet d'événement global dans IE8. Vous ne pouvez pas utiliser l'événement passé dans le gestionnaire d'événements, comme e.preventDefault, il doit être event.preventDefault pour que cela fonctionne dans IE8.
jmort253
event.preventDefault();a cessé de travailler pour moi dans FireFox pour une raison quelconque, à l'improviste. Utilisé le code de moralité et cela a très bien fonctionné. Merci ~
James
8
Juste pour ajouter de la clarté au commentaire de @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luke
23

Si vous liez l'événement via la fonction addEvent de mootools, votre gestionnaire d'événements obtiendra un événement fixe (augmenté) passé en paramètre. Il contiendra toujours la méthode preventDefault ().

Essayez ce violon pour voir la différence dans la liaison d'événements. 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>

Pour tous les utilisateurs de jQuery , vous pouvez corriger un événement en cas de besoin. Supposons que vous avez utilisé HTML onclick = ".." et obtenez un événement spécifique à IE qui n'a pas preventDefault (), utilisez simplement ce code pour l'obtenir.

e = $.event.fix(e);

Après cela, e.preventDefault (); fonctionne bien.

vieux sorcier
la source
2
Malheureusement, cette astuce ne fonctionne pas pour moi. J'utilise IE 10 et avant d'appeler e.preventDefault (); Je suis en train d'appeler $ .event.fix (e); sans succès :(
Beatles1692
Il a peut-être été supprimé de jquery 2? Mais IE10 n'a pas besoin du correctif.
oldwizard
Avez-vous affecté à nouveau l'événement fixe à la variable e?
oldwizard
11

Je sais que c'est un article assez ancien, mais je viens de passer du temps à essayer de faire fonctionner cela dans IE8.

Il semble qu'il y ait des différences dans les versions d'IE8 car les solutions publiées ici et dans d'autres threads ne fonctionnaient pas pour moi.

Disons que nous avons ce code:

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

Dans ma preventDefault()méthode IE8 existe à cause de jQuery, mais ne fonctionne pas (probablement à cause du point ci-dessous), donc cela échouera.

Même si je définis la returnValuepropriété directement sur false:

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

Cela ne fonctionnera pas non plus, car je viens de définir certaines propriétés de l'objet d'événement personnalisé jQuery.

La seule solution qui fonctionne pour moi est de définir la propriété returnValuede la variable globale event comme ceci:

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

Juste pour le rendre plus facile pour quelqu'un qui tentera de convaincre IE8 de travailler. J'espère que IE8 mourra horriblement dans une mort douloureuse bientôt.

METTRE À JOUR:

Comme le souligne sv_in , vous pouvez utiliser event.originalEventpour obtenir l'objet d'événement d'origine et définir la returnValuepropriété dans celui d'origine. Mais je ne l'ai pas encore testé dans mon IE8.

muffir
la source
1
Vous pouvez également obtenir l'objet d'événement de navigateur d'origine à partir de event.originalEvent. Plus d'informations: stackoverflow.com/a/16675056/22550
sv_in
6

Mootools redéfinit preventDefault dans les objets Event. Votre code devrait donc fonctionner correctement sur tous les navigateurs. Si ce n'est pas le cas, il y a un problème avec le support ie8 dans mootools.

Avez-vous testé votre code sur ie6 et / ou ie7?

Le doc dit

Chaque événement ajouté avec addEvent obtient automatiquement la méthode mootools, sans qu'il soit nécessaire de l'instaurer manuellement.

mais si ce n'est pas le cas, vous voudrez peut-être essayer

new Event(event).preventDefault();
Alsciende
la source
1
Il y avait un problème lors de l'encapsulation de ce type également dans IE. Oh mon Dieu! Pourquoi IE?
sv_in
Elle ne veut pas arrêter l'événement, mais empêche simplement son action par défaut.
Alsciende
5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Testé sur IE 9 et Chrome.

RolandoCC
la source
2
Ne fonctionne pas dans IE 11 (e.preventDefault est une fonction, bien qu'elle ne semble rien faire)
GreySage
4

Pour désactiver une touche du clavier après IE9, utilisez: e.preventDefault();

Pour désactiver une touche de clavier standard sous IE7 / 8, utilisez: e.returnValue = false;oureturn false;

Si vous essayez de désactiver un raccourci clavier (avec Ctrl, comme Ctrl+F), vous devez ajouter ces lignes:

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

Voici un exemple complet pour IE7 / 8 uniquement:

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

Référence: comment désactiver les raccourcis clavier dans IE7 / IE8

JBE
la source
Vous êtes le seul répondant à frapper le clou sur la tête. La seule raison pour laquelle quelqu'un ici parle d'IE précoce est qu'il a besoin d'une fonctionnalité multiplateforme. "e.keyCode = 0;" va tuer toute action par défaut au début d'IE.
www-0av-Com
3

Voici une fonction que j'ai testée avec la version nocturne de jquery 1.3.2 et 09-18-2009. Faites-moi savoir vos résultats avec. Tout s'exécute bien à cette fin dans Safari, FF, Opera sur OSX. Il sert exclusivement à corriger un bogue IE8 problématique et peut avoir des résultats inattendus:

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

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

Usage:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})
Eliran Malka
la source
1
Je n'ai jamais vu cette stopméthode auparavant et je ne l'ai pas trouvée dans msdn. Qu'est ce que ça fait?
Oriol
1
.stop()lève une exception, car elle n'existe pas. Toute exception aura l'effet souhaité.
Jay Bazuzi
et pourquoi voudriez-vous lever une exception? Je veux dire, si vous voulez lever une exception, vous pouvez simplement appeler e.preventDefault()parce que ça lèverait une exception de toute façon ...
Matthias Burger
2

preventDefaultest une norme répandue; utiliser un adhoc chaque fois que vous voulez être conforme aux anciennes versions d'IE est encombrant, mieux vaut utiliser un polyfill:

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

Cela modifiera le prototype de l'événement et ajoutera cette fonction, une grande fonctionnalité de javascript / DOM en général. Vous pouvez maintenant l'utiliser e.preventDefaultsans problème.

EliuX
la source
0

return false dans votre écouteur devrait fonctionner dans tous les navigateurs.

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

FWIW, au cas où quelqu'un reviendrait sur cette question plus tard, vous pourriez également vérifier ce que vous remettez à votre fonction de gestionnaire onKeyPress.

J'ai rencontré cette erreur lorsque j'ai transmis par erreur onKeyPress (this) au lieu de onKeyPress (event).

Juste autre chose à vérifier.

Kirby L. Wallace
la source
0

J'ai été aidé par une méthode avec une vérification de fonction. Cette méthode fonctionne dans IE8

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