2011-01-21 10 views
7

Hey Guys, Kredi almak, video oynatmak ve başlığın üzerinde, videonun sonunda ve sonraki/önceki tıklatmalarda başlığı değiştirmek için medya oynatma listesi oluşturmaya çalışıyorum . Bu yüzden birlikte çağrılabilecek bazı fonksiyonlar yazmam gerek. Yani böyle:

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

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

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

sorun $ (this) .hover gelen fonksiyonlara barındırmaz olmasıdır. Bunu nasıl yaparım?

Yardımın için teşekkürler!

cevap

3

this sadece yaparsanız taşımayacak:

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

DÜZENLEME: yorumda soruyu ele almak için, bu bir olay olarak atamak herhangi bir işlev için çalışacak işleyicisi. Anonim bir işlev mi yoksa adlandırılmış bir işlev mi olduğu önemli değil.

Bu:

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

... aynıdır:

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

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

...ya bu:

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

call() verilen ilk parametre this anacağımızdan nesneyi belirtir:

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

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

Gerçekten mi? Düşündüğüm en iyi yol bu olurdu. Bu .click ve .bind olayları için de çalışır mı? –

+0

@Drew: Kesinlikle. : o) Sadece işleyicileriniz olarak doğrudan işlevlerinizi atamaktır ve bir işleyici çağrıldığında, işleyicide "bu" değeri olayı alan öğe olacaktır. – user113716

+0

Peki o zaman bu kesinlikle yapmaya çalıştığım şeyi yapmanın en iyi yolu! Bunun için herhangi bir olumsuzluk var mı? Diğer tüm insanlar bunu nasıl önermediler? Çok kolay görünüyor! –

7

@@ patrickdw'nin yanıtına göre, jQuery, etkinliğin geri çağrıldığı DOM öğesine bir olay için geri arama kapsamını ayarlar. Örneğin, click() işleyicisinin belgelerinde eventObject parametresine bakın. Eğer bir jQuery eklentisi, jQuery nesneler üzerinde kendi özel yöntemleri çağırmak, böylece oluşturmak istiyorum ve jQuery nesne yürütme sırasında this olarak ayarlanmış olduğunda

Benim asıl cevap (aşağıda) yararlıdır. Ancak, değil orijinal soruya doğru ve basit bir cevaptır.

// 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() } 
); 

Düzenleme: Ya (önerilen gibi) ~ küresel jQuery yöntemi ad alanına sadece bir ismi eklemek istiyorsanız: daha genel

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

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

Veya:

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

Daha fazla bilgi için, bkz. jQuery Plugin Authoring Guide.

+0

+1 - Bu, kapanmayı gerektirmeyen başka bir harika yaklaşım. İyi cevap. –

+1

Bunu yapmanın güzel, jQuery yolu. Kayıtlara rağmen, eklentiler için yönergeler genellikle tek bir ad alanı saldırısı talep eder. Yani. TheBox ('open')/.theBox ('close') 'reg'lere daha çok olurdu. – Orbling

+1

Mükemmel nokta, @Orbling. Kılavuzun, bir eklenti için kendi kodunu sildikten sonra, tek başına bir komut dosyasında bir defaya mahsus olmak üzere ihlal edildiğinde tamamen mantıklı olduğunu düşünüyorum. Bunu yapmanın bir yolunu göstermek için cevabımı güncelledim. – Phrogz

2

Böyle bir şey için kodunuzu değiştirmeniz gerekir:

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

Bu işe yaramaz. hover (hoverOverFn, hoverOffFn) '- belki de bağlamayı dışarıda taşıyın, ama sorunun ne olduğunu gerçekten net olarak anlamadım :-) –

+0

@pst - yeniden okurken onu değiştirdim, değişkeni doğru şekilde ayarlamak için güncellendi . –

+0

@gddc Artık önbelleğe gerek yok, sadece showBox ($ (this)), ' – Phrogz

1

onlar elemanı kabul edebilmesi için showBox ve hideBox için parametreler ekleyin ve sonra showBox($(this)) ve hideBox($(this)) arayın.

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

+1' closest() ' – Phrogz

3

JavaScript yılında bunun için this belirtmek açıkça bir işlevi yürütmek ve call() veya apply() kullanabilirsiniz işlevde. Diğer çağrılar, işlev çağrısında parametreler olarak kullanılır.