event.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调试器时,我发现event对象没有preventDefault方法,这导致了错误,所以表单被提交。该方法在Firefox(我是使用Firebug发现的)的情况下得到支持。

任何帮助吗?

214913 次浏览

在IE中,你可以使用

event.returnValue = false;

达到同样的效果。

为了不得到一个错误,你可以测试是否存在preventDefault:

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

你可以将两者结合起来:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

Mootools在Event对象中重新定义了preventDefault。因此,您的代码应该在每种浏览器上都能正常工作。如果没有,那么mootools对ie8的支持有问题。

你在ie6和/或ie7上测试过你的代码吗?

医生说

使用addEvent添加的每个事件都会自动获得mootools方法,而不需要手动实例化它。

但万一它没有,你可能想试试

new Event(event).preventDefault();

下面是我用jquery 1.3.2和09-18-2009的夜间版本测试的一个函数。让我知道你的结果。在OSX上的Safari、FF、Opera中,一切都执行得很好。它专门用于修复一个有问题的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;
})

如果你通过mootools的addEvent函数绑定事件,你的事件处理程序将得到一个固定的(增强的)事件作为参数传递。它将始终包含preventDefault()方法。

试试这个小提琴,看看事件绑定的区别。 http://jsfiddle.net/pFqrY/8/ < / p >

// 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();工作很好。

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

参考:如何禁用IE7 / IE8的快捷键

我知道这是一个相当老的帖子,但我只是花了一些时间试图使这个工作在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中测试它。

return false在你的监听器应该工作在所有浏览器。

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

FWIW,如果有人重新审视这个问题以后,你也可以检查你正在处理你的onKeyPress处理函数。

当我错误地传递onKeyPress(this)而不是onKeyPress(event)时,我遇到这个错误。

只是要查点别的。

preventDefault是一个广泛使用的标准;每次你想要兼容旧的IE版本时都使用adhoc是很麻烦的,最好使用polyfill:

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

这将修改Event的原型并添加此函数,这是javascript/DOM的一个很好的特性。现在你可以毫无问题地使用e.preventDefault了。

一个带有函数检查的方法帮助了我。该方法适用于IE8

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