在IE浏览器中,event.preventDefault()函数无法正常工作。

207

以下是我的 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发现的)。

有人能够提供帮助吗?


根据文档(http://mootools.net/docs/core/Native/Event#Event:preventDefault),它是可以的;他所拥有的应该可以工作:"Event Method: preventDefault - 跨浏览器阻止事件默认行为的方法。" - Paolo Bergantino
我的错,我删除了我的评论,它是“mootools没有停止事件的方法吗?”。所以在ie8上有一个问题与mootools... - Alsciende
2
无法重现此问题。此fiddle“在我的ie 8上可以正常工作”。您能否设置一个简化的fiddle以显示错误?http://jsfiddle.net/ - eerne
11个回答

480

在IE中,你可以使用

event.returnValue = false;
为了达到相同的结果。
为了避免出错,您可以测试preventDefault是否存在:
if(event.preventDefault) event.preventDefault();

你可以使用以下代码将它们合并:

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

48
以下代码对我有效:如果(event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } - sv_in
229
event.preventDefault ? event.preventDefault() : event.returnValue = false; - mortiy
31
值得注意的是,在IE8中,“event”必须是全局事件对象。你不能使用传递到事件处理程序中的事件,如e.preventDefault,为了使其在IE8中正常工作,必须使用event.preventDefault。 - jamesmortensen
这个解决方法真的需要吗?自 jQuery v1.3 以来,它似乎已经正常工作了。请参见源代码责任人 - Kevin Kuszyk
8
为了澄清@jmort253评论中的内容:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; }); - Luke
显示剩余4条评论

23
如果您通过mootools的addEvent函数绑定事件,您的事件处理程序将会收到一个固定的(增强的)事件作为参数。它将始终包含preventDefault()方法。
尝试这个fiddle,查看事件绑定的区别。 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),但没有成功 :( - Beatles1692
它可能已经从jquery 2中删除了?但是IE10不需要修复。 - oldwizard
你又把固定事件分配给了变量e吗? - oldwizard

12

我知道这是一个相当古老的帖子,但我刚花了一些时间尝试使其在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自定义事件对象的一些属性。

对我来说唯一可行的解决方案就是像这样设置全局变量eventreturnValue属性:

$('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 获取原始的浏览器事件对象。更多信息请参考:https://dev59.com/4GQn5IYBdhLWcg3wpYf0#16675056 - sv_in

6

Mootools重新定义了Event对象中的preventDefault方法。因此,您的代码应该在每个浏览器上都可以正常工作。如果不能正常工作,则可能是Mootools中ie8支持存在问题。

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

文档中说:

使用addEvent添加的每个事件都会自动获得Mootools方法,无需手动实例化。

但如果没有,您可能需要尝试:

new Event(event).preventDefault();

1
这样包装时,在IE中也出现了一些问题。天哪!为什么是IE? - sv_in
她并不想停止事件,只是防止其默认行为。 - 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+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中禁用键盘快捷键


这篇文章解释了如何通过注册表编辑器禁用IE7和IE8的键盘快捷键。它提供了详细的步骤,并建议备份注册表以防止意外错误。

你是唯一一个一针见血的答案提供者。这里的任何人之所以谈论早期 IE,仅仅是因为他们需要跨平台功能。在早期 IE 中,"e.keyCode = 0;" 可以抵消任何默认操作。 - www-0av-Com

3

这是一个我一直在使用jquery 1.3.2和2009年9月18日的夜间构建版本进行测试的函数。请告诉我您的结果。在我的Safari、FF、Opera上,所有操作都很正常。它专门用于修复一个问题严重的IE8 bug,并可能产生意外结果:

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
1
.stop() 抛出异常,因为它不存在。任何异常都会产生期望的效果。 - Jay Bazuzi
1
你为什么要抛出异常呢?如果你想抛出异常,你可以直接调用 e.preventDefault(),因为它本身就会抛出异常。 - Matthias Burger

2

preventDefault 是一个广泛使用的标准;每次想要兼容旧版IE时都使用临时解决方案是很麻烦的,最好使用 polyfill:

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

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

0

我使用了一个带有检查函数的方法来获得帮助。这个方法可以在IE8中工作。

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

0

return false 在你的监听器中应该在所有浏览器中都有效。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接