2012-02-03 4 views
9

Tworzę menu, które otwiera się i zamyka za pomocą jQuery. W prostych słowach, to działa tak:

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; 
    } 
} 

Jeśli wezmę zawartość open_menu() i umieścić go w miejscu open_menu() w przypadku .click(), co działa zgodnie z oczekiwaniami. Jeśli użyję kodu jak pokazano powyżej, $(this) nie może dowiedzieć się, że .click() wystrzelił, a kod nie działa.

Czy jest coś, co mogę zrobić, aby selektor $(this) wynegocjował, co zostało uruchomione, zachowując go w open_menu()?

Odpowiedz

15

this które znajdują się w open_menu jest kontekst funkcji open_menu, a nie obsługi kliknięcia łącza. Musisz zrobić coś takiego:

open_menu(this); 

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

Dlaczego po prostu nie przekazać go jako parametru?

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

Próbowałem tego, ale być może nie zrobiłem tego poprawnie. Dodałem 'test = $ (this);' tuż przed przełącznikiem i przekazałem to. Dźwięk w prawo? – Combobreaker

+0

Gotowy do pracy. Musiał użyć 'this', a nie' $ (this) '. Dzięki. – Combobreaker

5

Można użyć zastosować, aby ustawić wartość this w funkcji.

open_menu.apply(this) 
+0

+1 Odpowiedzi na pytanie ... * "Czy jest coś, co mogę zrobić, aby selektor' $ (this) 'wynegocjował to, co go rozpali, zachowując go w' open_menu() '" * –