2011-11-05 124 views
2

对于我的生活,我似乎无法破解这一点。我是相当新手使用jQuery的,但我想简单地说:停止执行e.preventDefault();第二次点击?

我作用于引导到/mypagename

  1. 在a.nav_hidepanel的第一次点击,火动画链接#panel,但不要让链接照常运作。但是,添加一个替换类.nav_returnlink,以便我们可以在下一次定位它
  2. 现在,第二次单击该链接时,它具有不同的类,因此我们希望允许它像往常一样正常工作并向用户发送to/mypagename

禁用链接没有问题,但return true;似乎不工作!我错过了明显的东西吗?

jQuery(document).ready(function(){ 
    $("a.nav_hidepanel").click(function(e){ 
     e.preventDefault(); 
     $("#panel").animate({marginLeft:"-547px"}, 500); 
     $(this).removeClass('nav_hidepanel'); 
     $(this).addClass('nav_returnlink'); 
    }); 

    $("a.nav_returnlink").click(function(){ 
     return true; 
    }); 
}); 

回答

4

加入Click事件由于元素将首次点击后,有nav_returnlink类,只需检查它的存在:

jQuery(document).ready(function(){ 
    $("a.nav_hidepanel").click(function(e){ 
     //This will return true after the first click 
     //and preventDefault won't be called. 
     if(!$(this).hasClass('nav_returnlink')) 
      e.preventDefault(); 

     $("#panel").animate({marginLeft:"-547px"}, 500); 
     $(this).removeClass('nav_hidepanel'); 
     $(this).addClass('nav_returnlink'); 
    }); 
}); 
+0

肯定比我用来消除的代码更精简:)我明白为什么你已经更具体地了解何时防止默认操作。非常感谢! –

0

为什么不使用计数器呢?

var clickCount = 0; 
$("a.nav_hidepanel").click(function(e){ 
    if(clickCount == 0) { 
     e.preventDefault(); 
     $("#panel").animate({marginLeft:"-547px"}, 500); 
    } 
    clickCount++; 
}); 
+0

我认为使用计数器有点笨拙? –

+0

@ user9980是的,我想你可以使用布尔值,但似乎你已经找到了解决方案。 – Marko

1

尝试在现场functtion使用jQuery

$("a.nav_returnlink").live("click",function(){ 
    return true; 
}); 
+0

这也可以解决问题......但我仍然认为正确的做法是在完成使用后删除事件处理程序。 – rlemon

0

你总是可以解除事件处理程序...

var clickCancel = function(event) { 
    event.preventDefault(); 
    $(this).unbind("click",clickCancel); 
    $("#panel").animate({marginLeft:"-547px"}, 500);// you add your animation in this function, it will only be called on the first click.. 

}; 
$("a.nav_hidepanel").bind("click", clickCancel); 

see here

4

这里是为什么你的代码没有工作的简短说明:

  • 你a.nav_hidepanel click事件绑定在了preventDefault 这是确定
  • 你绑定点击事件到当时不存在的元素a.nav_returnlink。 这是一个问题
  • 在您第一次点击回调时,您会调用e.preventDefault(),因为此单击事件永远不会被解除绑定,所以此链接永远不会执行它的默认操作。 这又是一个问题

这里是一个可能的解决方案

jQuery(document).ready(function(){ 
    $("a.nav_hidepanel").click(function(e){ 
    e.preventDefault(); 
    $("#panel").animate({marginLeft:"-547px"}, 500); 
    $(this).removeClass('nav_hidepanel'); 
    $(this).addClass('nav_returnlink'); 
    $(this).unbind('click'); //unbind the click event so this is not called again 
    }); 
    $("a.nav_returnlink").live(function(){ //use a live event to bind to this element, that is available in the future 
     return true; 
    }); 
}); 

另一种解决办法是在第一个回调新的单击事件绑定:

jQuery(document).ready(function(){ 
    $("a.nav_hidepanel").click(function(e){ 
    e.preventDefault(); 
    $("#panel").animate({marginLeft:"-547px"}, 500); 
    $(this).removeClass('nav_hidepanel'); 
    $(this).addClass('nav_returnlink'); 
    $(this).unbind('click'); 

    $(this).click(function(){ 
     //do whatever you like to do 
    }); 
    }); 
});