在Firefox中使用javascript/jQuery事件处理程序

在Firefox中使用javascript/jQuery事件处理程序,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我有一个jQuery函数,可以通过菜单导航功能提交表单: $(function () { $('#sidebarmenu1 a').on('click', function () { var url = $(this).attr('href'); $('#myform').attr('action', url); $("#myform").submit(); if (event.preventDefault) { event

我有一个jQuery函数,可以通过菜单导航功能提交表单:

$(function () {
    $('#sidebarmenu1 a').on('click', function () {
        var url = $(this).attr('href');
        $('#myform').attr('action', url);
        $("#myform").submit();
        if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; }
    })
});
本节:

if (event.preventDefault) 
{ event.preventDefault(); } 
else 
{ event.returnValue = false; }
防止侧边栏按钮的默认操作(我认为这仍然是新的),即简单地导航到页面

这样写是为了让IE开心,因为preventDefault没有为IE定义(可能使用了不正确的术语,但IE不喜欢preventDefault)

但是现在这在firefox中引发了一个错误,因为(正如我在其他堆栈问题上读到的)事件并不是为FF全局定义的!我得到以下错误:

ReferenceError:未定义事件

现在,根据这个堆栈问题:

在IE和Chrome中,事件解析为window.event。Firefox没有此属性,而是将事件作为参数传递给事件处理程序函数。jQuery通过在所有浏览器中提供一个事件对象参数,为您抽象了这种差异

但是我认为我在这里使用jQuery,并且仍然遇到了这个问题

对不起,如果我犯了一些基本的错误,请自学js和jQ。非常感谢您的帮助,谢谢

这应该可以

$(function() {
    $('#sidebarmenu1 a').on('click', function(e) {
        var evt = e || window.event;
        var url = $(this).attr('href');
        $('#myform').attr('action', url);
        $("#myform").submit();
        evt.preventDefault();
    })
});​
这应该可以

$(function() {
    $('#sidebarmenu1 a').on('click', function(e) {
        var evt = e || window.event;
        var url = $(this).attr('href');
        $('#myform').attr('action', url);
        $("#myform").submit();
        evt.preventDefault();
    })
});​

如果使用jQuery传递给事件处理程序的事件对象,则不会出现问题

$('#sidebarmenu1 a').on('click', function (event) {
    var url = $(this).attr('href');
    $('#myform').attr('action', url);
    $("#myform").submit();
    event.preventDefault();
})

如果使用jQuery传递给事件处理程序的事件对象,则不会出现问题

$('#sidebarmenu1 a').on('click', function (event) {
    var url = $(this).attr('href');
    $('#myform').attr('action', url);
    $("#myform").submit();
    event.preventDefault();
})

如果我还有几点,我会投票支持第二个答案(传递jQuery'event'参数)

我在不知不觉中依赖于由Firefox以外的浏览器定义的全局事件。我回顾了我的代码,并确保始终在所有单击事件上指定事件参数

例如

我还养成了在.on之前取消.off的习惯,因为我的大多数代码都使用单页,重用内容。如果没有.off,我会在对话框的后续步骤中无意中堆积事件(即使它们是相同的回调)


更改代码以将“事件”直接传递给处理程序的一个副作用是绑定到“this.”已更改。我选择重构代码以更改“this.”对“event.currentTarget”的引用。

如果我还有几点,我会投票支持第二个答案(传递jQuery“event”参数)

我在不知不觉中依赖于由Firefox以外的浏览器定义的全局事件。我回顾了我的代码,并确保始终在所有单击事件上指定事件参数

例如

我还养成了在.on之前取消.off的习惯,因为我的大多数代码都使用单页,重用内容。如果没有.off,我会在对话框的后续步骤中无意中堆积事件(即使它们是相同的回调)


更改代码以将“事件”直接传递给处理程序的一个副作用是绑定到“this.”已更改。我选择重构代码来更改“this”。对“event.currentTarget”的引用非常有效,谢谢。如果你有时间解释-这是什么?您已经将“e”定义为“e”或window.event,所以当Firefox检查e.preventDefault()时;它尝试使用“e”(事件的简写形式),发现它没有定义,但让它通过,因为它理解“window.event”?e | | | window.event..意味着如果未定义e,它将把它分配给window.event..为了澄清问题,我将在post中更改变量..e适用于所有现代浏览器,但IE 7我认为它不起作用..因此它将使用window.event,然后谢谢,我将阅读更多关于e的内容。感谢您用“evt”澄清您的帖子edit.Works非常好,谢谢。如果您有时间解释-这是什么?您已经将“e”定义为“e”或window.event,因此当Firefox检查e.preventDefault()时,它会尝试使用“e”(事件的缩写?发现它未定义,但让它通过,因为它理解“window.event”?e | | | window.event..意味着如果未定义e,它将把它分配给window.event..为了澄清问题,我将在post中更改变量..e适用于所有现代浏览器,但IE 7我认为它不起作用..因此它将使用window.event,然后谢谢,我将阅读更多关于e的内容。感谢您通过“evt”编辑澄清您的帖子。