为什么我的jQuery preventDefault()工作不正确?


Why is my jQuery preventDefault() working incorrectly?

我正在开发一个Wordpress主题,使用自建的jQuery手风琴导航:

// jQuery Footer Navigation Slide
jQuery('#footer-accordion > li > a').on('click', function(e){
    if(jQuery(this).parent().has('ul')) {
        e.preventDefault();
        if(!jQuery(this).hasClass('open')) {
            jQuery('#footer-accordion li ul').slideUp(350);
            jQuery('ul li a').removeClass('open');
            jQuery(this).next('ul').slideDown(350);
            jQuery(this).addClass('open');
        } else if(jQuery(this).hasClass('open')) {
            jQuery(this).removeClass('open');
            jQuery(this).next('ul').slideUp(350);
        }
    }
});

当我在裸HTML中构建它时,这工作得很好,但是我现在有麻烦将它集成到我的Wordpress主题中。似乎我在那里得到的e.preventDefault()也阻止了菜单项(ul li a)上的默认(点击链接),里面没有ul。我认为我的选择器很好,因为它在我的HTML中工作。

所以简而言之:如果我单击li没有嵌套ulul li a,我希望被定向到一个页面。然而,当我这样做的时候,什么也没有发生。.slideUp()函数工作得很好,我可以单击嵌套ul中的链接。我的选择器错了吗?我给wp_nav_menu()函数错误的变量?

这是footer.php的相关部分:

    <?php wp_nav_menu( array(
        'container_class'   => 'footer-navigation clearfix',
        'menu_id'           => 'footer-accordion' 
)); ?>

Wordpress是这样处理的:http://jsfiddle.net/vKmfu/

jQuery(this).parent().has('ul')部分是罪魁祸首。与大多数jQuery函数一样,这个调用总是返回一个jQuery对象。当JavaScript对象在booelan上下文中使用时,它被计算为true,除非它是null。你需要的是if(jQuery(this).parent().has('ul').length > 0) { ... }

顺便说一下,选择器'#footer-accordion > li > a'不会影响第二级或更多级的链接。>children选择器。您可能需要一个descendant选择器。