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

sv_*_*_in 202 javascript events internet-explorer 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', '');
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

在IE以外的所有浏览器中,这都可以.但在IE中,这会导致错误.我有IE8所以在使用它的JavaScript调试器时,我发现该event对象没有preventDefault导致错误的方法,因此表单已经提交.在Firefox(我发现使用Firebug)的情况下支持该方法.

任何帮助?

Als*_*nde 467

在IE中,你可以使用

event.returnValue = false;
Run Code Online (Sandbox Code Playgroud)

达到同样的效果.

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

if(event.preventDefault) event.preventDefault();
Run Code Online (Sandbox Code Playgroud)

你可以将两者结合起来:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Run Code Online (Sandbox Code Playgroud)

  • `event.preventDefault?event.preventDefault():event.returnValue = false;` (228认同)
  • 以下代码适用于我:if(event.preventDefault){event.preventDefault(); } else {event.returnValue = false; } (48认同)
  • 值得注意的是,"event"必须是IE8中的全局事件对象.你不能使用传递给事件处理程序的事件,比如e.preventDefault,它必须是*event.preventDefault,以便在IE8中工作. (30认同)
  • 只是为@ jmort253的评论添加一些清晰度:`$('.something').click(function(e){e.preventDefault?e.preventDefault():event.returnValue = false;});` (8认同)

old*_*ard 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>
Run Code Online (Sandbox Code Playgroud)

对于所有jQuery用户,您可以在需要时修复事件.假设您使用HTML onclick =".."并获取缺少preventDefault()的IE特定事件,只需使用此代码即可获取它.

e = $.event.fix(e);
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,这个技巧对我不起作用.我在使用IE 10并在调用e.preventDefault()之前; 我调用$ .event.fix(e); 没有成功:( (2认同)

小智 11

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

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

假设我们有这个代码:

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

在我的IE8 preventDefault()方法存在因为jQuery,但是不起作用(可能是因为下面的要点),所以这将失败.

即使我将returnValue属性直接设置为false:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

这也行不通,因为我只是设置了jQuery自定义事件对象的一些属性.

只有对我有用的解决方案是设置全局变量的属性returnValue,如下所示: event

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

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

更新:

正如sv_in指出的那样,您可以使用event.originalEvent原始事件对象并returnValue在原始对象中设置属性.但是我还没有在我的IE8中测试它.


Als*_*nde 6

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

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

医生说

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

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

new Event(event).preventDefault();
Run Code Online (Sandbox Code Playgroud)


Rol*_*oCC 5

if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在IE 11中不起作用(e.preventDefault是一个函数,尽管它似乎无能为力) (2认同)