2009-03-10 9 views
20

Ich habe diese Funktionen:jQuery .click Ereignis überschrieben innerhalb Klick

TargetWorksheet.toggle_child_locations = function(id){ 
    $("#location-children-"+id).slideToggle("slow"); 
} 

TargetWorksheet.get_child_locations = function(id, lvl){ 
    //Ajax grab all children and targets, and display children 
    $.get('child_locations',{ location_id: id, level: lvl}, function(data){ 
    $("#location-children-"+id).append(data); 
    TargetWorksheet.toggle_child_locations(id); 
    }); 

    //Change onClick to just toggle since child data will now be loaded 
    $("#location-toggle-"+id).click(function(){ 
    TargetWorksheet.toggle_child_locations(id); 
    }); 
} 

und diesen Aufruf:

$(function(){ 
    TargetWorksheet.toggle_child_locations(2); 
    $("#location-toggle-2").click(function(){ 
    TargetWorksheet.get_child_locations(2,1); 
    }); 
}); 

So lege ich ein Click-Ereignis auf meine '+' Link (# location-Toggle -2), die untergeordnete Daten schaltet. Beim ersten Klick möchte ich einen Ajax-Aufruf durchführen, um die Kinddaten abzurufen, aber dann möchte ich einfach den .click auf # location-toggle-2 überschreiben, so dass er jetzt einfach umschaltet und den Ajax-Anruf nicht ausführt . Der obige Code funktioniert nicht, er scheint den .click nicht zu überschreiben und macht den Ajax jedes Mal.

Weiß jemand, wie ich das .click Ereignis eines Artikels überschreiben kann? Ich habe auch versucht, $("#location-toggle-"+id).click(TargetWorksheet.toggle_child_locations(id)); Und es einfach schaukelte immer wieder rekursiv aus irgendeinem Grund.

Gedanken?

Antwort

62

Das einzige, was Sie dort fehlt sind, ist, dass jedes Mal, es heißt, nicht überschreibt eine vorhandene .click()fügt einen neuen Handler.

Sie können $("#location-toggle-"+id).unbind() verwenden, um Handler auf diesem Element zu löschen, bevor Sie das neue hinzufügen, und es sollte wie erwartet funktionieren.

+8

Es wäre besser, 'unbind (" click ");' zu verwenden, dies löst nur den Ereignistyp 'click'. Dies ist besonders nützlich, wenn Sie JQueryUI-Widgets wie 'button()' verwenden. In diesem Fall möchten Sie nur den Klick loslassen und andere Ereignisse wie 'Hover' usw. beibehalten. –

+5

Vergessen Sie nicht die Verkettung. Normalerweise mache ich das: '$ (" # myElement "). Off (" click "). On (" click ", handler);' Dies macht den Code ein wenig sauberer – Nick

Verwandte Themen