2012-05-17 12 views
6

Wie gehe ich über die Kombination dieser alten jQuery-Code in die v1.7 .on()?jQuery - konvertieren .live() zu .on()

v1.3 .live():

$('#results tbody tr').live({ 
    mouseenter: 
     function() { $(this).find('.popup').show(); }, 
    mouseleave: 
     function() { $(this).find('.popup').hide(); } 
    }); 

v1.7 .on():

$('#results tbody').on('mouseenter', 'tr', function() { 
    $(this).find('.popup').show(); 
}); 
$('#results tbody').on('mouseleave', 'tr', function() { 
    $(this).find('.popup').hide(); 
}); 

Ich möchte ein .on() Anruf beide Event-Handler übergeben, aber halten Sie die brillante Veranstaltung Delegation .on() ermöglicht es mir zu machen.

Vielen Dank!

+2

Was falsch mit Ihrem zweiten Beispiel? Sie können beide 'on()' Aufrufe von einem Selektor abketten, aber ansonsten sehe ich keine Probleme. –

+0

Nein, es gibt keine Probleme, ich möchte nur beide Ereignishandler in einem Objekt übergeben, wie im ersten Beispiel. Danke für die super schnelle Antwort, nebenbei bemerkt. – pilau

+2

TJ. beantwortet die eigentliche Frage, aber Rory hat Recht, dass man in einem solchen Fall einfach eine einzige, dyanische Handler-Methode verwenden könnte. – JMM

Antwort

10

Sie können ein Ereignis-Karte als ersten Parameter übergeben:

$('#results tbody').on({ 
    'mouseenter' : function() { 
     $(this).find('.popup').show(); 
    }, 
    'mouseleave' : function() { 
     $(this).find('.popup').hide(); 
    } 
}, 'tr'); 

jQuery documentation:

.on (events-map [Selektor] [Daten]),
events-Karte Eine Karte, in der die Zeichenfolge Tasten repräsentieren einen oder mehrere Leerzeichen getrennte Ereignistypen und optional Namensraum, und die Werte repräsentieren eine Handler-Funktion, die für das Ereignis (die Ereignisse) aufgerufen werden soll.

+0

Dies ist der eine, danke TJ. – pilau

1

Die Formate werden für live

$(document).on({...events...}, selector, data); 

-oder

$(document).on(event, selector, data, callback); 

Der Code für die live Funktion in 1.7+ in der Dokumentation angegeben ist jetzt nur noch eine Passthrough-Funktion:

live: function(types, data, fn) { 
    jQuery(this.context).on(types, this.selector, data, fn); 
    return this; 
} 
3

I Ich möchte nur beide Event-Handler in einem Objekt übergeben, wie im ersten Beispiel.

In diesem Fall können Sie zusammen die beiden Ereignisse anhängen könnten, unterscheiden sie dann in der Prozedur selbst, wie folgt aus:

$('#results tbody').on('mouseenter mouseleave', 'tr', function (e) { 
    if (e.type == "mouseenter") { 
     $(this).find('.popup').show(); 
    } 
    else { 
     $(this).find('.popup').hide(); 
    } 
}); 
+0

Das ist schön!Ich denke, es würde sich als nützlich erweisen, wenn Sie viele Event-Handler für dasselbe Element binden - und Sie könnten einen Select-Schalter verwenden, um alles zu erfassen. – pilau

0

Ihr erstes Beispiel und Ändern live zu on sollte alles sein, was Sie brauchen,

$('#results tbody tr').on({ 
mouseenter: 
    function() { $(this).find('.popup').show(); }, 
mouseleave: 
    function() { $(this).find('.popup').hide(); } 
}) 

See: http://api.jquery.com/on/#example-6

+0

Aber dann werden Sie die Ereignisdelegierung vermissen. Schau dir TJ's Antwort an :) – pilau