2012-02-03 14 views
9

Sto creando un menu che si apre e si chiude usando jQuery. In termini semplici, funziona così:

function open_menu() { 
    $(this).next('ul.sub-menu').css('display', 'block').stop(true, false).animate({ 
     width: '235px', 
    }, 500); 
} 

function close_menu() { 
    // close code here 
} 

status = 'closed'; // set the default menu status 

$('a').click(function() { 
    switch(status) { 
     case 'closed': 
      open_menu(); 
      break; 
     case 'open': 
      close_menu(); 
      break; 
    } 
} 

Se prendo il contenuto di open_menu() e metterlo al posto del open_menu() in caso .click(), ogni funziona come previsto. Se utilizzo il codice come mostrato sopra, $(this) non è in grado di capire che .click() lo ha generato e il codice non viene eseguito.

C'è qualcosa che posso fare per avere il selettore $(this) negoziare cosa ha sparato mentre lo teneva in open_menu()?

risposta

15

Il this che si fa riferimento al open_menu è il contesto della funzione open_menu, non il gestore di clic del collegamento. Hai bisogno di fare qualcosa di simile:

open_menu(this); 

function open_menu(that) { 
    $(that).next(... 
2

Perché non accettarlo come parametro?

function open_menu($this) { 
    $this.next('ul.sub-menu').css('display', 'block').stop(true, false).animate({ 
     width: '235px', 
    }, 500); 
} 

function close_menu() { 
    // close code here 
} 

status = 'closed'; // set the default menu status 

$('a').click(function() { 
    switch(status) { 
     case 'closed': 
      open_menu($(this)); 
      break; 
     case 'open': 
      close_menu(); 
      break; 
    } 
} 
+0

Ho provato questo, ma potrebbe non averlo fatto correttamente. Ho aggiunto 'test = $ (questo);' subito prima dell'interruttore e l'abbiamo passato. Suono giusto? – Combobreaker

+0

L'ho fatto funzionare. Ho dovuto usare 'this', non' $ (this) '. Grazie. – Combobreaker

5

È possibile utilizzare applicare per impostare il valore della this nella funzione.

open_menu.apply(this) 
+0

+1 risponde alla domanda ... * "C'è qualcosa che posso fare per fare in modo che il selettore' $ (this) 'negozi il fuoco mentre lo tiene in' open_menu() '" * –

Problemi correlati