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

时间:2009-06-16 10:09:04

标签: javascript internet-explorer events mootools preventdefault

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

任何帮助?

11 个答案:

答案 0 :(得分:460)

在IE中,您可以使用

event.returnValue = false;

获得相同的结果。

为了不出错,你可以测试是否存在preventDefault:

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

您可以将两者结合使用:

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

答案 1 :(得分: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 :(得分:11)

我知道这是一个很老的帖子,但我花了一些时间试图在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的属性event,如下所示:

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

只是为了让那些试图说服IE8工作的人更容易。我希望IE8很快会在痛苦的死亡中死去。

<强>更新

sv_in所述,您可以使用event.originalEvent获取原始事件对象,并在原始事件对象中设置returnValue属性。但我还没有在我的IE8中测试它。

答案 3 :(得分:6)

Mootools重新定义了Event对象中的preventDefault。所以你的代码应该适用于每个浏览器。如果没有,则mootools中的ie8支持存在问题。

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

医生说

  

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

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

new Event(event).preventDefault();

答案 4 :(得分:4)

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

在IE 9和Chrome上测试过。

答案 5 :(得分:3)

要在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;
    }
});

参考:How to disable keyboard shortcuts in IE7 / IE8

答案 6 :(得分:2)

这是我用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;
})

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:0)

您的监听器中的

return false应该适用于所有浏览器。

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

答案 9 :(得分:0)

FWIW,如果以后有人再次访问此问题,您也可以检查您正在处理的onKeyPress处理函数。

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

还有别的东西要检查。

答案 10 :(得分:0)

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

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