событие.функция preventDefault () не работает в IE
Ниже приведен мой код 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, я узнал, что
11 ответов
в IE, вы можете использовать
event.returnValue = false;
для достижения того же результата.
и чтобы не получить ошибку, вы можете проверить наличие preventDefault:
if(event.preventDefault) event.preventDefault();
вы можете объединить два с:
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Если вы свяжете событие с помощью функции addEvent mootools, обработчик событий получит фиксированное (дополненное) событие, переданное в качестве параметра. Он всегда будет содержать метод preventDefault ().
попробуйте эту скрипку, чтобы увидеть разницу в связывании события. 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 конкретное событие, которое не хватает preventDefault (), просто используйте этот код для его получения.
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
of глобальная переменная event
такой:
$('a').on('click', function(event) {
if (window.event) {
window.event.returnValue = false;
}
event.preventDefault();
});
просто, чтобы сделать его проще для тех, кто будет пытаться убедить IE8 работать. Я надеюсь, что IE8 умрет ужасно мучительной смертью скоро.
обновление:
As sv_in указывает, что вы можете использовать event.originalEvent
чтобы получить исходный объект события и установить returnValue
свойство в исходном. Но я еще не тестировал его в своем IE8.
Mootools переопределяет preventDefault в объектах событий. Таким образом, ваш код должен отлично работать в каждом браузере. Если это не так, то есть проблема с поддержкой ie8 в mootools.
вы тестировали свой код на ie6 и / или ie7?
врач говорит
каждое событие, добавленное с addEvent, получает метод mootools автоматически, без необходимости вручную его копировать.
но если это не так, вы можете захотеть попробуй!--2-->
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 и 09-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;
})
preventDefault
является широко распространенным стандартом; использование 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;
}