为什么使用 a.click 时事件未定义

Why is event undefined when using a.click

我正在尝试为我的站点创建一个基本的 megamenu,但是我在单击一次打开和关闭菜单时遇到了问题。这是 HTML:

的基本版本
<ul class="menu">
    <li class="dropdown-toggle">
        <a href="#">Toggle Dropdown</a>
        <ul class="dropdown-wrap">
            <ul class="column">
                <li><a href="#">Link 1</a></li>
                <li><a href="#">Link 2</a></li>
                <li><a href="#">Link 3</a></li>
            </ul>
            <ul class="column">
                <li><a href="#">Link 4</a></li>
                <li><a href="#">Link 5</a></li>
                <li><a href="#">Link 6</a></li>
            </ul>
        </ul>
    </li>
</ul>

这是JavaScript的基本版本:

$menu = $('ul.menu');
$menu.find('li.dropdown-toggle').children('a').click(function(event) {
    var $wrap = $(this).siblings('.dropdown-wrap');
    if ($wrap.hasClass('open')) {
        closeDropdown($wrap);
    } else {
        openDropdown($wrap);
    }
    event.preventDefault().stopPropagation();
});
$('html').click(function() {
    console.log('HTML FIRED');
    if ($('.dropdown-wrap.open').length > 0) {
        closeDropdown($('.dropdown-wrap.open'));
    }
});

function closeDropdown($wrap) {
    $wrap.removeClass('open');
    console.log('Close');
}
function openDropdown($wrap) {
    $wrap.addClass('open');
    console.log('Open');
}

问题是当 运行 stopPropagation.

时我收到一个事件未定义的错误

Uncaught TypeError: Cannot read property 'stopPropagation' of undefined

这是操作错误的 jsfiddle:http://jsfiddle.net/styphon/0go9ukky/

我的问题是为什么在这种情况下事件未定义?如果事件未定义,为什么 event.preventDefault() 不抛出同样的错误?我怎样才能让它工作?

None 的搜索结果到目前为止已经解释了这种行为,我不明白为什么事件未定义。

event 已定义。但是 preventDefault 没有 return 事件。所以你必须分两行来做:

event.preventDefault();
event.stopPropagation();

您不能从 event 对象链接方法,例如:stopPropagationpreventDefault

代码来自 jQuery 来源:

preventDefault: function () {
    var e = this.originalEvent;

    this.isDefaultPrevented = returnTrue;

    if (e && e.preventDefault) {
        e.preventDefault();
    }
},

如您所见,preventDefault 没有明确 return 任何内容,因此默认情况下 undefined 是 returned。

你会得到错误

Uncaught TypeError: Cannot read property 'stopPropagation' of undefined

解决问题使用

event.preventDefault();
event.stopPropagation();

您也可以使用 return false; 作为这两种方法的替代方法。