2009-02-05 6 views

risposta

23

C'è un elemento di eventi nei dati dell'articolo. Questo dovrebbe iniziare, puoi leggere i tuoi elementi e archiviare i gestori in un array prima di slegare. Commenta se hai bisogno di più aiuto. Ho avuto questa idea leggendo il metodo $ .fn.clone, quindi dai un'occhiata anche a questo.

$(document).ready(function() { 
    $('#test').click(function(e) { 
     alert('test'); 
     var events = $('#test').data("events"); 
     $('#test').unbind('click', events.click[0]); 
    }); 
}); 

<a id="test">test</a> 
+0

Super. Questo può funzionare. Controllerò questo – glaz666

+1

Anche io stavo cercando la soluzione per questo problema, e questa risposta funziona molto. Per maggiore generalità, è possibile accedere a events.click tramite un iteratore. – Achimnol

+3

In jQuery 1.4.2, hanno cambiato il modo in cui sono archiviati gli eventi, quindi non funzionerà: http: // blog.jquery.com/2010/02/19/jquery-142-released/. Non sono sicuro di cosa devi fare invece. –

0

Per dissipare un gestore di eventi è necessario passare la funzione di gestione in unbind(). Quindi hai già la funzione di gestore, tutto ciò che devi fare è ricordarlo.

+0

Ho pensato che se non si passa una funzione di gestione specifica, unbind si applica a tutti gli eventi per quell'oggetto? – Helmut

+0

@Helmut yes 'unbind' annulla tutti i gestori se lo chiami senza argomenti. Non potrai più legarli in seguito, a meno che tu non abbia tenuto un riferimento a loro. Puoi anche separare eventi di cui non sei consapevole, ad esempio vincolati da un altro script. È meglio chiamare unbind con un gestore specifico in modo da poter essere sicuro. – meouw

2

V'è ora un buon plugin jQuery chiamato copyEvents, che copia gli eventi da un oggetto all'altro. Questo potrebbe essere facilmente utilizzato per "salvare" eventi da un elemento e riportarli in un secondo momento. Solo un'altra opzione :)

+0

Questo link è morto. –

8

Ecco come ottenere ciò, fornisce un metodo storeEvents e un restoreEvents su una selezione. storeEvents scatta un'istantanea degli eventi nel momento in cui viene chiamata. restoreEvents ripristina l'ultima istantanea precedente. Potrebbe essere necessario ruotarlo un po 'per parametrizzare lo slegamento durante il ripristino, forse ti piacerebbe mantenere gli eventi associati dopo l'ultima istantanea.

(function($){ 

    function obj_copy(obj){ 
      var out = {}; 
     for (i in obj) { 
      if (typeof obj[i] == 'object') { 
       out[i] = this.copy(obj[i]); 
      } 
      else 
       out[i] = obj[i]; 
     } 
     return out; 
    } 


    $.fn.extend({ 

     storeEvents:function(){ 
      this.each(function(){ 
       $.data(this,'storedEvents',obj_copy($(this).data('events'))); 
      }); 
      return this; 
     }, 

     restoreEvents:function(){ 
      this.each(function(){ 
       var events = $.data(this,'storedEvents'); 
       if (events){ 
        $(this).unbind(); 
        for (var type in events){ 
         for (var handler in events[type]){ 
          $.event.add(
           this, 
           type, 
           events[type][handler], 
           events[type][handler].data); 
         } 
        } 
       } 
      }); 
      return this; 
     } 

    }); 
})(jQuery); 
7

Dal jQuery 1.4.2+ modifiche come gestori di eventi sono memorizzati, questo sembra rilevante:

Il modo migliore che ho trovato è stato quello di utilizzare namespacing evento:

var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ]; 
for (idx = 0; idx < ary_handlers.length; idx++){ 
    $('#test').bind('click.foobar',ary_handlers[idx]); 
} 

// and then later: 
$('#test').unbind('.foobar'); 

Nell'esempio di cui sopra , tutti gli eventi di fobob non sono associati. Si noti che se si ha bisogno di controllo grana più fine, si potrebbe namespace ogni gestore clic e correlare alla vostra gamma di gestori:

var ary_handlers = [ fn_highlight, fn_onpress, fn_cleanup ]; 
for (idx = 0; idx < ary_handlers.length; idx++){ 
    $('#test').bind('click.ns_' + String(idx), ary_handlers[idx]); 
} 

// and then later you could pick off a specific one to unbind 
$('#test').unbind('.ns_2'); 
-2

Nick Craver sembra avere la correct answer per jQuery 1.4.2+. Include anche un utile fiddle. La sua soluzione consente di recuperare tutti i gestori di eventi collegati a un elemento jQuery e di determinare a quale gestore sono stati assegnati.

+4

Le persone che hanno votato per il voto dovrebbero fornire il motivo per cui hanno votato. Aiuta la persona a imparare e fornisce un po 'di responsabilità ... a volte l'elettore ingiusto è sbagliato. Tutti imparano. – traday

0

È possibile utilizzare il parametro event.handler:

$(document).ready(function() { 
    $('#test').click(function(e) { 
     e.preventDefault(); 
     alert('test'); 
     $('#test').unbind('click', e.handler); 
     //Do Something... 
     $('#test').click(); 
    }); 
}); 

<a id="test">test</a> 

event.handler restituisce il gestore di corrente che ha ricevuto l'evento, così omettendo che si potrebbe tenere gli altri gestori.