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

2020/10/16 12:41 · javascript ·  · 0评论

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

有帮助吗?

在IE中,您可以使用

event.returnValue = false;

达到相同的结果。

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

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

您可以将两者结合使用:

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

如果通过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(); 工作良好。

我知道这是一篇很旧的文章,但我只是花了一些时间尝试在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中对其进行测试。

Mootools在事件对象中重新定义了preventDefault。因此,您的代码应该在每种浏览器上都能正常工作。如果不是,则说明mootools中的ie8支持存在问题。

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

医生说

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

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

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

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

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

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

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

这是我一直在使用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;
})

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

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

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

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

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

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

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

只是其他检查。

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

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
本文地址:http://javascript.askforanswer.com/event-preventdefaulthanshuzaiiezhongbuqizuoyong.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!