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


202

以下是我的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发现)的情况下支持该方法。

有帮助吗?


确实如此;根据文档(mootools.net/docs/core/Native/Event#Event:preventDefault),他应该起作用:“事件方法:preventDefault-跨浏览器方法,以防止事件的默认操作。”
Paolo Bergantino,2009年

不好的是,我删除了我的评论,即“ mootools没有停止事件的方法吗?”。因此,ie8上的mootools存在问题...
Alsciende

2
无法重现此问题。这个小提琴 “在8上对我有用 ”,您能设置一个减少的小提琴来显示错误吗?jsfiddle.net
eerne 2011年

Answers:


472

在IE中,您可以使用

event.returnValue = false;

达到相同的结果。

为了不出错,您可以测试一下preventDefault的存在:

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

您可以将两者结合使用:

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

48
以下代码为我工作:if(event.preventDefault){event.preventDefault(); } else {event.returnValue = false; }
sv_in

229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mortiy 2011年

31
值得注意的是,“事件”必须是IE8中的全局事件对象。您不能使用传递到事件处理程序中的事件,例如e.preventDefault,它必须是event.preventDefault才能在IE8中起作用。
jmort253

event.preventDefault();由于某种原因,我停止了在FireFox中为我工作的想法。使用了mority的代码,效果很好。谢谢〜
詹姆斯

8
只是为了使@ jmort253的评论更加清楚:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
路加福音

23

如果通过mootools的addEvent函数绑定事件,则事件处理程序将获得作为参数传递的固定(增强)事件。它将始终包含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 =“ ..”并获得了一个缺少preventDefault()的IE特定事件,只需使用此代码即可获取它。

e = $.event.fix(e);

之后e.preventDefault(); 工作良好。


2
不幸的是,这个技巧对我没有用。我正在使用IE 10,并且在调用e.preventDefault()之前;我可以打电话给$ .event.fix(e); 没有成功:(
披头士乐队1956年

它可能已经从jquery 2中删除了?但是IE10不需要修复。
oldwizard,2015年

您是否再次将固定事件分配给e变量?
oldwizard,2015年

11

我知道这是一篇很老的文章,但是我只是花了一些时间尝试在IE8中进行这项工作。

似乎IE8版本存在一些差异,因为此处发布的解决方案和其他主题中的解决方案对我不起作用。

假设我们有以下代码:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

在我的IE8 preventDefault()方法中,由于jQuery而存在,但无法正常工作(可能是由于以下几点),所以这将失败。

即使我将returnValueproperty直接设置为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中对其进行测试。


1
您还可以从获取原始浏览器事件对象event.originalEvent。更多信息:stackoverflow.com/a/16675056/22550
sv_in 2013年

6

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

您是否在ie6和/或ie7上测试过代码?

医生说

每个添加了addEvent的事件都会自动获取mootools方法,而无需手动实例化它。

但是如果没有,您可能想尝试

new Event(event).preventDefault();

1
在IE中像这样包装时也存在一些问题。哦,我的上帝!为什么是IE?
sv_in 2009年

但是,她不想停止该事件,只是阻止其默认操作。
Alsciende

5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

在IE 9和Chrome上进行了测试。


2
在IE 11中不起作用(e.preventDefault是一个函数,尽管它似乎什么也没做)
GreySage

4

要在IE9之后禁用键盘键,请使用: e.preventDefault();

要禁用IE7 / 8下的常规键盘按键,请使用:e.returnValue = false;return false;

如果您尝试禁用键盘快捷键(使用Ctrl之类的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中禁用键盘快捷键


您是唯一一个打在头上的答题者。这里任何人谈论早期IE的唯一原因是他们需要跨平台功能。“ e.keyCode = 0;” 将杀死早期IE中的任何默认操作。
www-0av-Com

3

这是我一直在用jquery 1.3.2和2009年9月18日的夜间版本测试的功能。让我知道您的结果。为此,在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;
})

1
我以前从未见过这种stop方法,而且在msdn中找不到它。它有什么作用?
Oriol 2013年

1
.stop()抛出异常,因为它不存在。任何异常都会产生预期的效果。
杰伊·巴祖兹

为什么要抛出异常?我的意思是,如果您想引发异常,则可以简单地调用e.preventDefault()一下,因为它仍然会引发异常……
Matthias Burger

2

preventDefault是一个普遍的标准;每次要与旧版IE兼容时都使用即兴命令比较麻烦,最好使用polyfill:

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

这将修改Event的原型并添加此功能,这通常是javascript / DOM的一项强大功能。现在您可以e.preventDefault毫无问题地使用了。


0

return false 在您的侦听器中应该可以在所有浏览器中使用。

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

0

FWIW,以防万一以后有人再问这个问题,您还可以检查传递给onKeyPress处理函数的内容。

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

只是其他检查。


0

一种功能检查方法帮助了我。此方法在IE8中有效

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.