événement.préventdefault () fonction ne fonctionne pas dans IE

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'objet event n'a pas de méthode preventDefault qui est à l'origine de l'erreur et donc le formulaire est soumis. La méthode est supportée dans le cas de Firefox (que j'ai découvert en utilisant Firebug).

De L'Aide?

192
demandé sur danwellman 2009-06-16 14:09:03

11 réponses

dans IE, vous pouvez utiliser

event.returnValue = false;

pour obtenir le même résultat.

et pour ne pas obtenir une 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);
454
répondu Alsciende 2015-11-12 13:17:20

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

essayez ce violon pour voir la différence dans la liaison d'événement. 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 jQuery utilisateurs là-bas, vous pouvez fixer un événement si nécessaire. Dites que vous avez utilisé HTML onclick=".."et obtenir un événement spécifique à IE qui ne possède pas preventDefault (), il suffit d'utiliser ce code pour l'obtenir.

e = $.event.fix(e);

après cela E. preventDefault (); works fine.

23
répondu oldwizard 2015-12-05 07:52:44

je sais que c'est tout à fait un vieux poste, mais je viens de passer un certain temps à essayer de faire ce travail dans IE8.

il semble qu'il y ait quelques différences dans les versions IE8 parce que les solutions posté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 méthode IE8 preventDefault() existe en raison de jQuery, mais ne fonctionne pas( probablement en raison du point ci-dessous), de sorte que ce sera échouer.

même si je mets returnValue propriété directement à false:

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

cela ne marchera pas non plus, parce que je viens de définir une propriété de jQuery custom event object.

seule solution qui fonctionne pour moi est de mettre la propriété returnValue de variable globale event comme ceci:

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

juste pour rendre plus facile pour quelqu'un qui essaiera de convaincre IE8 de travail. J'espère que IE8 mourra horriblement dans une mort douloureuse bientôt.

mise à jour:

comme sv_in souligne, vous pouvez utiliser event.originalEvent pour obtenir l'objet d'événement original et définir la propriété returnValue dans l'objet original. Mais je ne l'ai pas encore testé dans mon IE8.

11
répondu muffir 2017-05-23 12:18:18

Mootools redéfinit préventdefault dans les objets Event. Donc votre code devrait bien fonctionner sur chaque navigateur. 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 avoir à l'utiliser manuellement.

mais en si ce n'est pas le cas, vous pouvez essayer

new Event(event).preventDefault();
6
répondu Alsciende 2009-06-16 10:26:16
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

testé sur IE 9 et Chrome.

3
répondu RolandoCC 2013-07-20 22:25:51

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

pour désactiver une touche de clavier ordinaire sous IE7 / 8, utilisez: e.returnValue = false; ou return 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 seulement:

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

3
répondu JBE 2013-11-14 15:27:19

Voici une fonction que j'ai testé avec la version nocturne de jquery 1.3.2 et 09-18-2009. Laissez-moi savoir vos résultats avec elle. Tout s'exécute très bien à cette fin en Safari, FF, Opera sur OSX. Il est exclusivement destiné à 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();
}

Utilisation:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})
2
répondu Eliran Malka 2013-07-20 22:27:20

preventDefault est un standard répandu; utiliser un adhoc chaque fois que vous voulez être compatible avec les anciennes versions D'IE est encombrant, mieux d'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 caractéristique de javascript/DOM en général. Maintenant, vous pouvez utiliser e.preventDefault sans problème.

1
répondu EliuX 2017-05-26 21:05:22

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

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}
0
répondu daemon1981 2014-12-05 10:37:11

FWIW, dans le cas où quelqu'un revoit cette question plus tard, vous pouvez également vérifier ce que vous donnez à votre fonction de handler onKeyPress.

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

autre chose à vérifier.

0
répondu Kirby L. Wallace 2015-06-22 22:51:11

j'ai été aidé par une méthode avec un contrôle de fonction. Cette méthode fonctionne en IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
0
répondu Pablo 2018-01-16 11:37:15