2010-11-22 9 views
1

Sayfanın üstüne sabitlenmiş bir h2'yi temel olarak tutan bir işlev çubuğu() işlevine sahibim, siz sayfayı yeni bir h2'ye ulaştığınızda h2'deki metin değiştiğinde sayfayı aşağı kaydırırken, telefon rehberinin/telefon rehberinin iphone veya android telefon. A ile başlayan isimleriniz arasında gezinirken, A harfine sahip bir başlık üst üste gelecektir, ardından B adlarına ulaştığınızda, sayfanın üst kısmındaki başlıktaki metni B olarak değiştirir. .switch etiketi sınıf seçildiğinde bunu etkinleştirmek/devre dışı bırakmak istiyorum. Aşağıdaki kod sadece iyi çalışıyor, ama bu bunu yapmak için kötü bir yol olup olmadığını merak ediyorum? Fonksiyonumu defalarca yeniden yüklüyor muyum? Bunu yapmanın daha iyi bir yolu var mı?Jquery: bir işlevi etkinleştirme/devre dışı bırakma? Bunu yapmak için en iyi yol?

$('.switch').click(function() { 
if ($('.switch label').hasClass('selected')) { 
    stickyhead(); 
} else { 
    $(window).unbind('scroll'); 
} 
}); 

cevap

0
//Assuming I've understood the scenario correctly, wouldn't this work. 
$('.switch').delegate("label.selected", "click", function() { 
    if (stickyheadActive){ 
     //do your stuff here 
    } 
    else{ 
     return; 
    } 
}); 

Ama akılda tutulması mı, tahmin edilebileceği gerekli değildir unbinding değil işleyicileri hafıza kaybıdır. Bağlama/Kapatma, kaynaklar az olduğunda çirkin, ancak haklıdır.

Ayrıca, öğeler kaldırıldığında ve işleyiciler bağlı olduğunda ... Viola! Bellek sızıntıları için mükemmel bir durum. Bu konuyla alakasız görünebilir, ancak bunu mobil platformlar için yazıyor olmanız halinde, bundan bahsetmem gerektiğini hissettim.

0

binded işlevi tutmak daha verimli olabilir ama aslında bir şey yapar ya da değil stickyhead() olup olmadığını belirlemek için bir durum değişkeni kullanmaktır.

function stickyhead(){ 
    if (!stickyheadActive) return; //Guard clause to prevent action 

    //...Your current code...// 
} 

örn

Sonra ziyade işlevi unbinding daha Sadece kodunuzu görselleştirmek için hafifçe mücadele ediyorum stickyheadActive=false;

+0

Whoops. Yapışkan kafa = false 'kullanmak için söylendi ama tabii ki bu 'stickyheadActive = false' olmalıdır. Düzeltildi. –

0

kullanmak, ancak sürekli bağlayıcı ve unbinding olması gerektiğini düşüktür. Sen şartlı işleyicisindeki kodunu çalıştırır sizin kaydırma işleyicisindeki bir boolean olmalıdır:

var doStickyHead = true; 
$(window).scroll(function(){ 
    if (doStickyHead) { 
     // do your code 
    } 
}); 
$('.switch').click(function(){ 
    doStickyHead = !doStickyHead; // invert the value of doStickyHead 
}); 
İlgili konular