preventDefault()不起作用

时间:2014-04-08 13:57:34

标签: jquery redirect preventdefault

我通过一些jQuery函数进行动画导航。这一切都很好,但有一件事让我发疯。最后一项(项目nb.5)应该将您重定向到新页面但不会发生。我在下面的前几行代码中有条件

$(document).ready(function(){
    $('li > a').on('click', function(e) {
        if ($(this).parent().has('p')) {        
            e.preventDefault();
        }

        if (!$(this).hasClass('active')) {
            $('li a').next('p').stop().slideUp();
            $(this).next('p').stop().slideDown();
            $('li a').removeClass('active');
            $(this).addClass('active');
        }
        else if ($(this).hasClass('active')) {
            $(this).next('p').stop().slideUp();
            $(this).removeClass('active');
        }

    })

}) 

DEMO:http://jsfiddle.net/SQTcN/2/

3 个答案:

答案 0 :(得分:4)

has(selector)

  

描述:将匹配元素集减少到具有与选择器或DOM元素匹配的后代的元素。

     

返回:jQuery

.has()返回一个jQuery对象。

使用.find('p').length.has('p').length代替.has('p')

$(document).ready(function(){
    $('li > a').on('click', function(e) {

        if ($(this).parent().find('p').length) {
            e.preventDefault();
        }

        if (!$(this).hasClass('active')) {
            $('li a').next('p').stop().slideUp();
            $(this).next('p').stop().slideDown();
            $('li a').removeClass('active');
            $(this).addClass('active');
        }
        else if ($(this).hasClass('active')) {
            $(this).next('p').stop().slideUp();
            $(this).removeClass('active');
        }
    });
}); 

JSFIDDLE

答案 1 :(得分:1)

.has()返回一个jQuery对象而不是布尔值

只需改变你的if:

if (!($(this).hasClass("odkaz"))) { 
    e.preventDefault();
}

CODE:

$(document).ready(function(){
    $('li > a').on('click', function(e) {
        if (!($(this).hasClass("odkaz"))) { 
            e.preventDefault();
        }

        if (!$(this).hasClass('active')) {
            $('li a').next('p').stop().slideUp();
            $(this).next('p').stop().slideDown();
            $('li a').removeClass('active');
            $(this).addClass('active');
        }
        else if ($(this).hasClass('active')) {
            $(this).next('p').stop().slideUp();
            $(this).removeClass('active');
        }

    })

}) 

DEMO

答案 2 :(得分:1)

.has()没有返回布尔值。它返回一个jQuery对象。来自文档:

  

将匹配元素集减少到具有与选择器或DOM元素匹配的后代的元素。

所以,你需要做类似的事情:

if($(this).parent().has('p').length)

或者更好的是,您不需要遍历父母来追溯。只需简单地做:

if($(this).siblings('p').length)