é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?
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);
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.
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.
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();
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
testé sur IE 9 et Chrome.
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
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;
})
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.
return false
dans votre écouteur devrait fonctionner dans tous les navigateurs.
$('orderNowForm').addEvent('submit', function () {
// your code
return false;
}
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.
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;
}