206

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

有什么帮助吗?

4

11 回答 11

480

在 IE 中,您可以使用

event.returnValue = false;

达到同样的效果。

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

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

您可以将两者结合起来:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);
于 2009-06-16T10:10:20.707 回答
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(); 工作正常。

于 2012-11-21T14:29:52.503 回答
12

我知道这是一篇很老的帖子,但我只是花了一些时间试图在 IE8 中完成这项工作。

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

假设我们有以下代码:

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

在我的 IE8preventDefault()方法中,由于 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 中测试过它。

于 2013-12-13T13:55:36.313 回答
6

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

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

医生说

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

但如果没有,你可能想试试

new Event(event).preventDefault();
于 2009-06-16T10:26:16.090 回答
5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

在 IE 9 和 Chrome 上测试。

于 2013-04-09T22:52:54.940 回答
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 中禁用键盘快捷键

于 2013-11-14T15:27:19.907 回答
3

这是我一直在使用 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;
})
于 2009-09-18T05:29:01.527 回答
2

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

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

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

于 2016-11-11T18:57:49.777 回答
0

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

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}
于 2014-12-05T10:37:11.590 回答
0

FWIW,如果以后有人重新讨论这个问题,你也可以检查你正在传递给你的 onKeyPress 处理函数的内容。

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

只是要检查其他东西。

于 2015-06-22T22:51:11.990 回答
0

我得到了一种功能检查方法的帮助。此方法适用于 IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
于 2018-01-16T11:37:15.313 回答