2012-03-27 2 views

Antwort

2

Wenn Sie ein Click-Ereignis an einen Link binden, müssen Sie die Click-Handler-Funktion einschließen.

$(this).bind('click'); 

tut nichts, weil es keine Handler-Funktion gibt. Sie müssten die Click-Handler-Funktion erneut übergeben, wenn Sie sie erneut binden möchten. Sie können dies tun, indem Sie den Click-Handler in seine eigene lokale Funktion aufbrechen und diese Funktion dann jedes Mal verwenden, wenn Sie das click-Ereignis binden. Könnte man so tun, wie folgt:

function bindA1(force) { 
    var a1 = $('.a1'); 
    if (force || a1.hasClass("disabled")) { 
     a1.click(function() { 
      $(this) 
       .addClass("disabled") 
       .unbind("click") 
       .animate({"top": "+=50px"}, "slow"); 
      return(false); 
     }).removeClass("disabled"); 
    } 
} 

bindA1(true); 

$('.a2').click(function() { 
    bindA1(); 
    return(false); 
}); 

Arbeiten Demo hier: http://jsfiddle.net/jfriend00/3kjaR/

Wenn Sie wirklich beabsichtigen, die Handler für Links wie diese zu aktivieren und zu deaktivieren, kann es einfacher sein, nur eine Eigenschaft, die Sie überprüfen anstatt die Event-Handler tatsächlich zu entfernen.

Sie könnten ein Flag wie folgt verwenden:

$('.a1').click(function(){ 
    if (!$(this).data("disabled")) { 
     $('.a1').animate({"top": "+=50px"}, "slow"); 
     $(this).data("disabled", true); 
    } 
}); 

$('.a2').click(function(){ 
    $(".a1").data("disabled", false); 
}); 
​ 

Arbeiten Demo hier: http://jsfiddle.net/jfriend00/NSZ8P/

+0

ich denke, das man einfach zu bedienen ist. Ich wähle u jfriend00 – test

2
  • Verwendung .off() der Handler
  • Verwendung .on() zu entfernen, es zu binden wieder
  • Verwendung ein wiederverwendbare Funktion zum Binden

demo:

$(function() { 

    function clickHandler() { 
     $(this).animate({ 
      "top": "+=50px" 
     }, "slow").off('click'); 
     return false; 
    } 

    $('.a1').on('click', clickHandler); 

    $('.a2').on('click',function() { 
     $('.a1').on('click', clickHandler); 
     return false; 
    }); 
});​ 
+3

Man muss vorsichtig mit diesem sein, da aufeinanderfolgende Klicks auf 'a2' Ihnen doppelte Klick-Handler auf' a1' geben. – jfriend00

+0

@ jfriend00 guter Punkt. – Joseph

0

ich mit Ihrer Geige gespielt, und gab dir eine andere Option, statt mit den Speicherplätzen für die bind Fall durcheinander und mit allen verwirrt zu bekommen ... versuchen Sie dies:

http://jsfiddle.net/4WyPq/2/

$('.a1').click(function(){ 
    if(!$(this).hasClass("disabled")){ 
     $(this).addClass("disabled"); 
     $('.a1').animate({"top": "+=50px"}, "slow"); 
    } 
}); 

$('.a2').click(function(){ 
    $(".a1").removeClass("disabled"); 
}); 
+0

Sie können auch .data() des Elements verwenden, aber ich vermeide das, weil IE mit diesem Zeug irgendwie wählerisch ist. Allerdings hat jfriend00 ein gutes Beispiel in einer anderen Antwort. – Relic