Функция event.preventDefault() не работает в IE
-
05-07-2019 - |
Вопрос
Ниже приведен мой код 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', '');
}
});
});
Во всех браузерах, кроме IE, это работает нормально.Но в IE это вызывает ошибку.У меня IE8, поэтому, используя его отладчик JavaScript, я обнаружил, что event
объект не имеет preventDefault
метод, который вызывает ошибку, поэтому форма отправляется.Этот метод поддерживается в случае Firefox (что я выяснил с помощью Firebug).
Любая помощь?
Решение
в IE вы можете использовать
event.returnValue = false;
для достижения того же результата.
И чтобы не получить ошибку, вы можете проверить наличие функции protectDefault:
if(event.preventDefault) event.preventDefault();
Вы можете объединить их с:
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Другие советы
Если вы связываете событие через функцию mEtools 'addEvent, ваш обработчик событий получит фиксированное (дополненное) событие, переданное в качестве параметра. Он всегда будет содержать метод protectDefault ().
Попробуйте эту скрипку, чтобы увидеть разницу в привязке событий. 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>
Для всех jQuery пользователей вы можете при необходимости исправить событие. Скажем, вы использовали HTML onclick = " .. " и получите специфичное для IE событие, в котором отсутствует функция protectDefault (), просто используйте этот код, чтобы получить его.
e = $.event.fix(e);
После этого e.preventDefault (); работает отлично.
Я знаю, что это довольно старый пост, но я просто потратил некоторое время, пытаясь заставить это работать в IE8.
Похоже, что в версиях IE8 есть некоторые различия, поскольку решения, опубликованные здесь и в других темах, мне не помогли.
Допустим, у нас есть такой код:
$('a').on('click', function(event) {
event.preventDefault ? event.preventDefault() : event.returnValue = false;
});
В моем IE8 preventDefault()
метод существует из-за jQuery, но не работает (вероятно, из-за пункта ниже), поэтому это не удастся.
Даже если я установлю returnValue
свойство непосредственно в false:
$('a').on('click', function(event) {
event.returnValue = false;
event.preventDefault();
});
Это также не сработает, потому что я просто установил какое-то свойство объекта пользовательского события jQuery.
Единственное решение, которое работает для меня, - установить свойство returnValue
из глобальная переменная event
так:
$('a').on('click', function(event) {
if (window.event) {
window.event.returnValue = false;
}
event.preventDefault();
});
Просто чтобы облегчить задачу тем, кто попытается убедить IE8 работать.Я надеюсь, что IE8 скоро умрет мучительной смертью.
ОБНОВЛЯТЬ:
Как sv_in указывает, вы можете использовать event.originalEvent
чтобы получить исходный объект события и установить returnValue
имущество в оригинале.Но я еще не проверял это в своем IE8.
Mootools переопределяет warnDefault в объектах Event. Так что ваш код должен нормально работать на любом браузере. Если это не так, значит, есть проблема с поддержкой ie8 в mootools.
Вы тестировали свой код на ie6 и / или ie7?
Док говорит
Каждое событие, добавленное с помощью addEvent, получает метод mootools автоматически, без необходимости его ручного копирования.
но если это не так, вы можете попробовать
new Event(event).preventDefault();
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
Протестировано на IE 9 и Chrome.
Чтобы отключить клавиатуру после IE9, используйте: e.preventDefault ();
Чтобы отключить обычную клавиатуру в IE7 / 8, используйте: e.returnValue = false;
или return false;
Если вы попытаетесь отключить сочетание клавиш (с помощью Ctrl, например Ctrl + F
), вам нужно добавить эти строки:
try {
e.keyCode = 0;
}catch (e) {}
Вот полный пример только для 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;
}
});
Вот функция, которую я тестировал с помощью jquery 1.3.2 и ночной сборки от 18 сентября 2009 г.Сообщите мне о своих результатах.В этом плане все работает нормально в Safari, FF, Opera на OSX.Он предназначен исключительно для исправления проблемной ошибки IE8 и может иметь непредвиденные результаты:
function ie8SafePreventEvent(e) {
if (e.preventDefault) {
e.preventDefault()
} else {
e.stop()
};
e.returnValue = false;
e.stopPropagation();
}
Использование:
$('a').click(function (e) {
// Execute code here
ie8SafePreventEvent(e);
return false;
})
protectDefault
- широко распространенный стандарт; использование adhoc каждый раз, когда вы хотите быть совместимым со старыми версиями IE, обременительно, лучше использовать polyfill:
if (typeof Event.prototype.preventDefault === 'undefined') {
Event.prototype.preventDefault = function (e, callback) {
this.returnValue = false;
};
}
Это изменит прототип события и добавит эту функцию, отличную особенность javascript / DOM в целом. Теперь вы можете без проблем использовать e.preventDefault
.
return false
в вашем слушателе должен работать во всех браузерах.
$('orderNowForm').addEvent('submit', function () {
// your code
return false;
}
FWIW, если кто-нибудь еще вернется к этому вопросу, вы также можете проверить, что вы передаете в функцию-обработчик onKeyPress. Р>
Я столкнулся с этой ошибкой, когда по ошибке передал onKeyPress (this) вместо onKeyPress (event).
Просто что-то еще, чтобы проверить.
Мне помог метод с проверкой функции. Этот метод работает в IE8
if(typeof e.preventDefault == 'function'){
e.preventDefault();
} else {
e.returnValue = false;
}