2011-01-21 14 views
7

Hey Guys, Sto provando a creare una playlist multimediale in grado di far avanzare i crediti, riprodurre il video e modificare il titolo su passaggio del mouse, la fine del video e il clic successivo/precedente . Quindi ho bisogno di scrivere alcune funzioni che possono essere chiamate insieme. Quindi:

function showBox() 
    { 
     $(this).parents('.container').find('.box').show(); 
    }; 

    function hideBox() 
    { 
     $(this).parents('.container').find('.box').hide(); 
    }; 

    $('a').hover(
     function() 
     { 
      showBox(); 
     }, 
     function() 
     { 
      hideBox(); 
     } 
    ); 

Il problema è che $ (questo) non viene trasferito alle funzioni da .hover. Come faccio a fare questo?

Grazie per l'aiuto!

risposta

3

Il this porterà attraverso se lo farete:

$('a').hover(showBox,hideBox); 

EDIT: di affrontare la questione nel commento, questo funzionerà per qualsiasi funzione si assegna come un evento handler. Non importa se si tratta di una funzione anonima o di un nome.

questo:

$('a').click(function() { 
    alert(this.tagName); 
}); 

... è lo stesso:

function alertMe() { 
    alert(this.tagName); 
} 

$('a').click(alertMe); 

...o questo:

function alertMe() { 
    alert(this.tagName); 
} 

$('a').bind('click', alertMe); 
+0

Realmente? Questo sarebbe il modo migliore che penso. Funzionerebbe anche per gli eventi .click e .bind? –

+0

@Drew: Assolutamente. : o) Assegna semplicemente le tue funzioni direttamente come gestori e ogni volta che viene chiamato un gestore, il valore di "this" nel gestore sarà l'elemento che ha ricevuto l'evento. – user113716

+0

Bene, allora questo è il modo migliore per fare quello che sto cercando di fare di sicuro! C'è qualche svantaggio di questo? Come mai tutte queste altre persone non hanno suggerito questo? Sembra così facile! –

7

Per la risposta di @ patrickdw, jQuery imposta lo scopo di un callback per un evento all'elemento DOM su cui è stato generato l'evento. Ad esempio, consultare il parametro eventObject nella documentazione per il gestore click().

La mia risposta originale (sotto) è utile quando si desidera creare un plug-in jQuery in modo che si può richiamare i propri metodi personalizzati su oggetti jQuery e hanno l'oggetto jQuery impostato come this durante l'esecuzione. Tuttavia, è non la risposta corretta e semplice alla domanda originale.

// Within a plug-in, `this` is already a jQuery object, not DOM reference 
$.fn.showBox = function(){ this.parents('.container').find('.box').show(); }; 
$.fn.hideBox = function(){ this.parents('.container').find('.box').hide(); }; 
$('a').hover(
    function(){ $(this).showBox() }, 
    function(){ $(this).hideBox() } 
); 

Edit: O, se (come suggerito) che si desidera aggiungere un solo nome al metodo ~ globale jQuery namespace:

$.fn.myBox = function(cmd){ 
    this.closest('.container').find('.box')[cmd](); 
}; 

$('a').hover(
    function(){ $(this).myBox('show') }, 
    function(){ $(this).myBox('hide') } 
); 

o più in generale:

$.fn.myBox = function(cmd){ 
    switch(cmd){ 
    case 'foo': 
     ... 
    break; 
    case 'bar': 
     ... 
    break; 
    } 
    return this; 
}; 

Per ulteriori informazioni, vedere jQuery Plugin Authoring Guide.

+0

+1 - Questo è un altro ottimo approccio che non richiede la chiusura. Buona risposta. –

+1

Il modo carino e jQuery di farlo. Sebbene per la cronaca, le linee guida per i plugin di solito richiedono una singola incursione nello spazio dei nomi. Quindi '.theBox ('open')/.theBox ('close')' sarebbe più di regs. – Orbling

+1

Punto eccellente, @Orbling. Penso che la linea guida sia del tutto ragionevole quando si impacchetta il proprio codice per un plugin, ma forse è violabile per una tantum in uno script autonomo. Ho aggiornato la mia risposta per mostrare un modo per farlo. – Phrogz

2

è necessario modificare il codice per qualcosa di simile:

function showBox(elem) 
{ 
    elem.parents('.container').find('.box').show(); 
}; 

function hideBox(elem) 
{ 
    elem.parents('.container').find('.box').hide(); 
}; 

$('a').hover(
    function() 
    { 
     var $this = $(this); 

     showBox($this); 
    }, 
    function() 
    { 
     var $this = $(this); 

     hideBox($this); 
    } 
); 
+0

Questo non funzionerà. 'hover (hoverOverFn, hoverOffFn)' - magari sposta la rilegatura all'esterno, ma non sono molto chiaro di cosa si stia ponendo la domanda :-) –

+0

@pst - l'ho preso mentre lo riletto, aggiornato per impostare correttamente la variabile . –

+0

@gddc Ora che non è necessario memorizzarlo nella cache, che dire solo di 'showBox ($ (this));' – Phrogz

1

Aggiungi parametri per showBox e hideBox in modo che possano accettare l'elemento, e quindi chiamare showBox($(this)) e hideBox($(this)).

2
$('a').hover(function() { 
    $(this).closest('.container').find('.box').show(); 
}, function() { 
    $(this).closest('.container').find('.box').hide(); 
}); 
+0

+1 per 'closest()' – Phrogz

3

in JavaScript è possibile utilizzare call() o apply() per eseguire una funzione e specificare esplicitamente this per esso:

$('a').hover(
    function() 
    { 
     showBox.call(this); 
    }, 
    function() 
    { 
     hideBox.call(this); 
    } 
); 

Il primo parametro dato alla call() Specifica l'oggetto che this farà riferimento a nella funzione. Eventuali ulteriori parametri vengono utilizzati come parametri nella chiamata di funzione.

Problemi correlati