2016-03-22 23 views
-1

Herkese iyi akşamlar, burada yine çok özel bir soruyla cevap alamadım. Aşağıdaki durumu düşünün: Bir jQuery Nesnim var, $wrapper = $(this);. Bu,gibi bir init çağrısında olur. Tahmin edebileceğiniz gibi initWrapper(), jQuery.fn'daki bir işlevdir. jQuery nesneye nesne ekleme, sonra olay tetikleme

Şimdi kıpırdamadan initWrapper() çağrısında ben $wrapper.trigger('change') diyoruz sargı içinde bir elemanın tıklayarak üzerine yürütülen bir geri arama, o zaman bu

$wrapper.getValue = function() { /* typical wrapper function */}

ve benzeri $wrapper işlev eklemek. Diğer tarafta normal jQuery değişiklik olayını dinliyorum ve işte artık çalışmıyor.

$('#unique-wrapper-id').change(function() { 
    var $wrapper = $(this); 
    $wrapper.getValue(); // $wrapper.getValue() is not a function 
}); 

Tamam, bir yerde kaybolursa getValue() jQuery değişim olayı sürecinde. Sorun değil, ben sadece beklenen ve ben dinleme ucunda jQuery Nesne arkasında DOMElement üzerinde getValue() yöntemi yürütebileceği gibi çalışır

$wrapper[0].getValue = function { /* typical wrapper function */ }

ile init çağrısında DOMElement kendisi ekleyin edeceğiz.

Ancak iki şey o canımı vardır:

jQuery nesne üzerinde getValue() yapar değişim olayı sürecinde kaybolmak Neden
  • ?
  • Neden jQuery kurucusu (var $wrapper = $(this);), DOMElement öğesinin getValue() işlevini jQuery Nesnesine kopyalamıyor? $wrapper ise

Şimdiden teşekkürler, talep edilmesi halinde bir jsfiddle yapmaya çalışacağım

+0

Eğer $ (eleman) 'arasam içinde getValue saklamak mümkün olmalıdır' bu c DOM öğesini düzelten ** yeni ** jQuery nesnesini yeniden çalıştırır. Bu nedenle, orijinal jQuery nesnesine eklediğiniz özellikler kaybolur. – Barmar

+0

@Barmar İyi nokta. '$ Wrapper':' $ ('# unique-wrapper-id') '' .change() 'olayından önce tanımlanmışsa,' jQuery() 'tekrar çağrılmadan işleyici içinde' $ wrapper' kullanabilmelidir. Ayrıca, '$ (document) .on ("change", "# unique-wrapper-id") 'veya' $ wrapper.change (handler) ', sonra' $ (this) .data() olay delegasyonunu da ayarlayabiliriz. 'İşleyicinin' getValue() 'içinde – guest271314

+0

Evet, bunu yapabilirsiniz. Ancak, birden çok öğeye ölçeklendirilmez. – Barmar

cevap

1

(-.- beklendiği gibi veya jQuery ile daha kolay kullanılabilir bir şey, ben sadece çalışmak için jsfiddle alınamıyor) aynı öğesi .data()

var getValue = function() { /* typical wrapper function */}; 
$wrapper.data("getValue", getValue); 

$("#unique-wrapper-id").change(function() { 
    var $wrapper = $(this); 
    $wrapper.data().getValue(); 
}); 
+0

teşekkürler, yarın bunu deneyeceğim, ancak bu benim için DomElement'e fonksiyon ekleyerek geçici bir çözüm olarak benim için sezgisel.ama iyi bir poing, tamamen veri hakkında unuttum. –