2009-02-05 4 views

Antwort

23

In den Daten des Elements ist ein Ereigniselement enthalten. Dies sollte Ihnen den Start ermöglichen, Sie können Ihre Elemente lesen und die Handler in einem Array speichern, bevor Sie sie loslassen. Kommentar, wenn Sie mehr Hilfe benötigen. Ich habe diese Idee vom Lesen der $ .fn.Clone-Methode bekommen, also schauen Sie sich das auch an.

$(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. Das kann funktionieren. Ich werde dies überprüfen – glaz666

+1

Ich suchte auch nach der Lösung für dieses Problem, und diese Antwort funktioniert sehr. Um allgemeiner zu sein, können Sie auf events.click über einen Iterator zugreifen. – Achimnol

+3

In jQuery 1.4.2 änderten sie, wie Ereignisse gespeichert werden, so dass dies nicht funktioniert: http: // blog.jquery.com/2010/02/19/jquery-142-released/. Ich bin mir nicht sicher, was Sie stattdessen tun müssen. –

0

Um einen Event-Handler zu lösen, müssen Sie die Handler-Funktion in unbind() übergeben. Sie haben also bereits die Handler-Funktion, alles was Sie tun müssen, ist sich daran zu erinnern.

+0

Ich dachte, wenn Sie eine bestimmte Handler-Funktion nicht übergeben, gilt die Bindung für alle Ereignisse für dieses Objekt? – Helmut

+0

@Helmut ja "unbind" wird alle Handler lösen, wenn Sie es ohne Argumente aufrufen. Sie können sie später nicht mehr binden, es sei denn, Sie haben einen Verweis auf sie gespeichert. Sie können auch Ereignisse aufheben, die Ihnen nicht bekannt sind - z. B. durch ein anderes Skript gebunden. Es empfiehlt sich, die Bindung mit einem bestimmten Handler aufzurufen, damit Sie sicher sein können. – meouw

2

Es ist jetzt eine gute jQuery-Plugin copyEvents, die Kopien Ereignisse von einem Objekt zum anderes genannt. Dies könnte sehr einfach verwendet werden, um Ereignisse von einem Element zu "speichern" und sie später zurückzubringen. Nur noch eine Option :)

+0

Diese Verbindung ist tot. –

8

Hier ist, wie man das erreicht, bietet eine storeEvents und eine restoreEvents Methoden auf eine Auswahl. storeEvents erstellt eine Momentaufnahme der Ereignisse in dem Moment, in dem sie aufgerufen wird. restoreEvents stellt den letzten vorherigen Snapshot wieder her. Möglicherweise müssen Sie es ein wenig drehen, um die Entkopplung während der Wiederherstellung zu parametrisieren, vielleicht möchten Sie die gebundenen Ereignisse nach dem letzten Snapshot beibehalten.

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

Im obigen Beispiel:

(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

Da jQuery 1.4.2+ Änderungen, wie Event-Handler gespeichert sind, scheint dies relevant: Veranstaltung Namespacing zu verwenden

Der beste Weg, ich war gefunden , alle foobar-Ereignisse sind nicht gebunden. Beachten Sie, dass, wenn Sie feinere Kornsteuerung benötigt, können Sie jeden Klick-Handler Namespace konnte und korrelieren mit Ihrem Array von Handler:

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 die correct answer für jQuery 1.4.2+ zu haben scheint. Er enthält auch eine hilfreiche fiddle. Seine Lösung ermöglicht es Ihnen, alle Event-Handler, die an ein jQuery-Element angehängt sind, abzurufen und herauszufinden, an welchen Handler sie angehängt wurden.

+4

Leute, die abstimmen, sollten den Grund angeben, warum sie abstimmen. Hilft der Person zu lernen und bietet ein wenig Rechenschaftspflicht ... manchmal ist der Down Voter falsch. Jeder lernt. – traday

0

könnten Sie die event.handler Parameter verwenden:

$(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 gibt den aktuellen Handler, der das Ereignis empfangen hat, also durch das Weglassen der anderen Handler halten konnte.