2009-03-10 18 views
20

ho queste funzioni:jQuery sovrascrivere evento .Click entro click

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); 
    }); 
} 

e questa chiamata:

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

Così ho allegare un evento click al mio link '+' (# location-ginocchiera -2), che commuta i dati figlio. Al primo clic, desidero effettuare una chiamata ajax per recuperare i dati secondari, ma poi voglio semplicemente sovrascrivere il file .click in # posizione-toggle-2 in modo che ora si attivi e non effettui la chiamata ajax . Il codice sopra non funziona, non sembra sovrascrivere il .click e fa ogni volta la chiamata ajax.

Qualcuno sa come posso sovrascrivere l'evento .click di un elemento? Ho anche provato $("#location-toggle-"+id).click(TargetWorksheet.toggle_child_locations(id)); E ha continuato a passare e ricorsivamente in modo ricorsivo per qualche motivo.

Pensieri?

risposta

62

L'unica cosa che ti manca non è che l'utilizzo .click()aggiunge un nuovo gestore ogni volta che viene chiamato, non sovrascrive uno esistente.

È possibile utilizzare $("#location-toggle-"+id).unbind() per cancellare i gestori su quell'elemento prima di aggiungerne uno nuovo e dovrebbe funzionare come previsto.

+8

Sarebbe meglio usare 'unbind (" click ");', questo non vincolerà il tipo di evento 'click'. Ciò è particolarmente utile quando si usano i widget di JQueryUI come 'button()', in questo caso si vuole semplicemente smantellare il click e mantenere altri eventi come 'hover' e così via .. –

+5

Non dimenticare il concatenamento. Di solito faccio questo: '$ (" # myElement "). Off (" click "). On (" click ", gestore);' Questo rende il codice un po 'più pulito – Nick