Javascript event.preventDefault()函数在IE中不起作用

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

以下是我的JavaScript(mootools)代码:

$('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;
}