2011-01-21 16 views
7

Hey Guys, Próbuję utworzyć playlistę multimediów, która może przesuwać kredyty, odtwarzać wideo i zmieniać tytuł po kciuku, po zakończeniu filmu i po następnym/kliknięciu prev . Muszę więc napisać kilka funkcji, które można następnie nazwać razem. Więc tak:

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

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

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

Problem polega na tym, że $ (this) nie przenosi się do funkcji z .hover. Jak mam to zrobic?

Dzięki za pomoc!

Odpowiedz

3

this przeprowadzi poprzez jeśli po prostu zrobić:

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

EDIT: Aby odpowiedzieć na pytanie w komentarzu, to będzie pracować dla dowolnej funkcji przypisanej jako zdarzenie treser. Nie ma znaczenia, czy jest to funkcja anonimowa czy nazwana.

to:

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

... jest taki sam jak:

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

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

...albo to:

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

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

Naprawdę? To byłby najlepszy sposób, w jaki myślę. Czy to też działa w przypadku wydarzeń .click i .bind? –

+0

@Drew: Absolutnie. : o) To jest po prostu przypisywanie twoich funkcji bezpośrednio jako handlerów, a za każdym razem, gdy wywoływany jest handler, wartość 'this' w procedurze obsługi będzie elementem, który otrzymał zdarzenie. – user113716

+0

To jest najlepszy sposób, aby zrobić to, co próbuję zrobić na pewno! Czy jest w tym jakiś minus? Dlaczego wszyscy inni ludzie tego nie sugerowali? Wydaje się to takie proste! –

7

Odpowiedź per @ patrickdw, jQuery ustawia zakres wywołania zwrotnego zdarzenia na element DOM, w którym zostało wywołane zdarzenie. Na przykład zobacz parametr eventObject w dokumentacji dla programu obsługi click().

Mój oryginalny odpowiedzi (poniżej) jest przydatna, gdy chcemy utworzyć jQuery plug-in, dzięki czemu można wywołać własne niestandardowe metody na obiektach jQuery i jQuery mieć obiekt ustawiony jako this podczas wykonywania. Jednak jest to poprawna i prosta odpowiedź na oryginalne pytanie.

// 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: Albo, jeśli (jak sugerowano), który chcesz dodać tylko jedno nazwisko do ~ globalny jQuery metody nazw:

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

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

lub bardziej ogólnie:

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

Aby uzyskać więcej informacji, zobacz jQuery Plugin Authoring Guide.

+0

+1 - To kolejne świetne podejście, które nie wymaga zamknięcia. Dobra odpowiedź. –

+1

Ładny, jQuery sposób robienia tego. Chociaż dla zapisu, wytyczne dla wtyczek zwykle wymagają wtargnięcia pojedynczego obszaru nazw. Tak więc '.theBox ('open')/.theBox ('close')' byłoby bardziej regs. – Orbling

+1

Doskonały punkt, @Orbling. Myślę, że ta wytyczna jest całkowicie sensowna, gdy zawijamy własny kod dla wtyczki, ale być może jest to łamliwe dla jednorazowych scen w samodzielnym skrypcie. Zaktualizowałem swoją odpowiedź, aby pokazać jeden sposób na zrobienie tego. – Phrogz

2

trzeba zmodyfikować kod do czegoś takiego:

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

To nie zadziała. 'hover (hoverOverFn, hoverOffFn)' - być może przeniesie wiązanie na zewnątrz, ale nie jestem do końca pewien, o co pyta :-) –

+0

@pst - złapałem go, gdy go ponownie przeczytałem, zaktualizowałem, by poprawnie ustawić zmienną . –

+0

@ gddc Teraz, gdy nie ma potrzeby buforowania go, a może po prostu 'showBox ($ (this));' – Phrogz

1

Dodaj parametry showBox i hideBox tak, że mogą przyjmować element, a następnie zadzwonić showBox($(this)) i hideBox($(this)).

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

+1 dla 'closest()' – Phrogz

3

W JavaScript można użyć call() lub apply() do wykonywania funkcji i wyraźnie określić this do niego:

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

Pierwszy parametr podany do call() określa obiekt, który this będzie odnosić się do w funkcji. Wszelkie dalsze parametry są używane jako parametry w wywołaniu funkcji.

Powiązane problemy