Javascript event.preventDefault()函数在IE中不起作用
以下是我的JavaScript(mootools)代码:Javascript event.preventDefault()函数在IE中不起作用,javascript,internet-explorer,events,mootools,preventdefault,Javascript,Internet Explorer,Events,Mootools,Preventdefault,以下是我的JavaScript(mootools)代码: $('orderNowForm')。添加事件('submit',函数(事件){ event.preventDefault(); allFilled=false; $$(“.required”)。每个(函数(inp){ 如果(inp.getValue()!=“”){ allFilled=true; } }); 如果(!全部填充){ $$(“.errormsg”).setStyle('显示',''); 返回; }否则{ $$('.defaul
$('orderNowForm')。添加事件('submit',函数(事件){
event.preventDefault();
allFilled=false;
$$(“.required”)。每个(函数(inp){
如果(inp.getValue()!=“”){
allFilled=true;
}
});
如果(!全部填充){
$$(“.errormsg”).setStyle('显示','');
返回;
}否则{
$$('.defaultText')。每个(函数(输入){
if(input.getValue()==input.getAttribute('title')){
input.setAttribute('值','');
}
});
}
这个,发送({
onSuccess:函数(){
$('page_1_table')。设置样式('display','none');
$('page_2_table')。设置样式('display','none');
$('page_3_table').setStyle('display','');
}
});
});
在除IE之外的所有浏览器中,这都可以正常工作。但在IE中,这会导致错误。我有IE8,所以在使用它的JavaScript调试器时,我发现事件
对象没有导致错误的preventDefault
方法,因此表单被提交。Firefox支持这种方法(我是用Firebug发现的)
有什么帮助吗?在IE中,您可以使用
event.returnValue = false;
达到同样的效果
为了避免出现错误,您可以测试preventDefault是否存在:
if(event.preventDefault) event.preventDefault();
您可以将两者结合使用:
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Mootools在事件对象中重新定义默认值。因此,您的代码应该可以在每个浏览器上正常工作。如果没有,那么mootools中的ie8支持就有问题 您是否在ie6和/或ie7上测试了代码 医生说 使用addEvent添加的每个事件都会自动获取mootools方法,而无需手动实例化它 但如果不行,你可能想试试
new Event(event).preventDefault();
这是我用jquery1.3.2和09-18-2009的夜间构建测试的一个函数。让我知道你的结果。在Safari、FF和OSX上的Opera中,一切都执行得很好。它专门用于修复有问题的IE8错误,可能会产生意外结果:
功能ie8SafePreventEvent(e){
如果(如默认){
e、 预防默认值()
}否则{
e、 停止()
};
e、 returnValue=false;
e、 停止传播();
}
用法:
$('a')。单击(函数(e){
//在这里执行代码
IE8安全事件(e);
返回false;
})
如果通过mootools的addEvent函数绑定事件,则事件处理程序将获得一个固定(增强)事件作为参数传递。它将始终包含preventDefault()方法
试试这个小把戏,看看事件绑定的区别。
在那之后,e.preventDefault();工作正常。if(如默认){
e、 预防默认值();
}否则{
e、 returnValue=false;
}
在IE9和Chrome上测试。要在IE9之后禁用键盘键,请使用:
e.preventDefault()代码>
要禁用IE7/8下的常规键盘键,请使用:e.returnValue=false
或返回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;
}
});
参考资料:我知道这是一篇很老的文章,但我只是花了一些时间尝试在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
,如下所示:
$('a').on('click', function(event) {
if (window.event) {
window.event.returnValue = false;
}
event.preventDefault();
});
只是为了让那些试图说服IE8工作的人更容易。我希望IE8能很快在痛苦的死亡中死去
更新:
如前所述,您可以使用event.originalEvent
获取原始事件对象,并在原始对象中设置returnValue
属性。但是我还没有在IE8中测试它。在监听器中返回false
应该可以在所有浏览器中使用
$('orderNowForm').addEvent('submit', function () {
// your code
return false;
}
FWIW,如果以后有人再问这个问题,您还可以检查您正在向onKeyPress处理程序函数传递什么
当我错误地传递了onKeyPress(this)而不是onKeyPress(event)时,我遇到了这个错误
只是一些需要检查的东西。preventDefault
是一个广泛使用的标准;每次您想要与旧IE版本兼容时,都要使用临时填充,这很麻烦,最好使用polyfill:
if (typeof Event.prototype.preventDefault === 'undefined') {
Event.prototype.preventDefault = function (e, callback) {
this.returnValue = false;
};
}
这将修改事件的原型并添加此函数,这通常是javascript/DOM的一个重要特性。现在您可以毫无问题地使用e.preventDefault
。我得到了一个函数检查方法的帮助。这种方法在IE8中有效
if(typeof e.preventDefault == 'function'){
e.preventDefault();
} else {
e.returnValue = false;
}
是的;根据文档(),他所拥有的应该是有效的:“事件方法:preventDefault-跨浏览器方法以防止事件的默认操作。”糟糕的是,我删除了我的评论,它是“mootools没有停止事件的方法吗?”。所以ie8上的mootools有个问题…无法重现这个问题。“在ie 8上对我有效”你能设置一个简化的小提琴来显示错误吗?以下代码对我有效:if(event.preventDefault){event.preventDefault();}else{event.returnValue=false;}event.preventDefault?event.preventDefault():event.returnValue=false代码>值得注意的是,“事件”必须是全局eve
if (typeof Event.prototype.preventDefault === 'undefined') {
Event.prototype.preventDefault = function (e, callback) {
this.returnValue = false;
};
}
if(typeof e.preventDefault == 'function'){
e.preventDefault();
} else {
e.returnValue = false;
}