1

我有一个通过菜单导航功能提交表单的 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 满意,因为没有为 IE 定义 preventDefault(可能在那里使用了不正确的术语,但 IE 不喜欢 preventDefault。)

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

ReferenceError:未定义事件

现在根据这个堆栈问题: event is not defined in FireFox, but ok in Chrome and IE

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

但我以为我在这里使用的是 jQuery,但仍然遇到问题。

抱歉,如果我犯了基本错误,请自学 js 和 jQ。非常感谢任何帮助,谢谢!

4

3 回答 3

3

这应该做..

$(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();
    })
});​
于 2012-11-30T23:48:07.090 回答
2

如果您使用 jQuery 传递给事件处理程序的事件对象,您将不会遇到问题

$('#sidebarmenu1 a').on('click', function (event) {
    var url = $(this).attr('href');
    $('#myform').attr('action', url);
    $("#myform").submit();
    event.preventDefault();
})
于 2012-11-30T23:49:16.560 回答
0

如果我有更多的观点,我会投票赞成第二个答案(传递 jQuery 'event' 参数)。

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

例如

            $('#situationTextInput')
                .val('')
                .fadeTo(1000, 1.0)
                .focus()
                .off('keydown')
                .on('keydown', function (event) {
                    VsUtils.handleSpanishTextKeydown(event);
                });

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

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

于 2013-11-18T16:57:08.450 回答