2009-01-17 15 views
5

Bir grup bir kodun bir onkeydown etkinliğine bağlanması ile ilgili olarak nasıl gider, ancak metinleri textarea'un içine hızlı ve net girmeye devam ediyor? Bir kaç IF beyanından daha fazlası, onu oldukça yavaşlatıyor gibi görünüyor.Textarea, Javascript kullanarak `keydown` olaylarını kaydettikten sonra gecikme yaşatıyor

EDIT: Bunun, masaüstü tarayıcılarını etkilemeyeceğini eklemeliyim (unuttuğuma inanamıyorum!). Esas olarak iPhone Safari ile ilgili bir sorun. Diğer mobil tarayıcılar da etkilenebilir, ancak JS'yi en iyi (AFAIK)

cevap

0

yürüttüğünden bu yana iPhone Safari'ye odaklanıyoruz. Gitmenin tek yolu onkeydown kullanmamak, ancak bunun yerine bir zamanlayıcı kullanmaktı. TextArea'nın içeriğini kontrol etmek için bir fonksiyon çalıştıran bir aralık ayarlayabilir ve oradaki mantığınızı çalıştırabilirsiniz. Öyle görünüyor ki, genel giderlerin çoğunu geçebilirdi. Neyse, bir şans ver, sanırım yardımcı olabilir. İşte

Bunu kullanmak gibi olacaktır:

// First param is the function to call, second is 
// time interval in miliseconds 
var timer = setTimeout(checkTextArea(), 5000); 

function checkTextArea() { 
    var text = document.getElementById("textarea").value; 
    // logic... 
    timer = setTimeout(checkTextArea(), 5000); // we loop it back to 
               //the function with the timer 
} 
2

gerçekten sadece kendisine bu kadar güç yok bu iPhone erişimi odaklanmış etkinleştirilmesine ilişkin Düzenlemenizi ...

iPhone düşünürsek. Sadece onchange veya onblur yerine onkeydownkullanarak daha iyi olacak.

var textarea = document.getElementById('textarea'); 

function checkTextArea() { 
    if (textarea.value /* ... */) { 
    /* ... */ 
    } 
} 

textarea.keyDownTimeout = null; 
textarea.onkeydown = function() { 
    if (textarea.keyDownTimeout) clearTimeout(textarea.keyDownTimeout); 
    textarea.keyDownTimeout = setTimeout(checkTextArea, 5000); 
}; 

Bu durdurma ve yeniden birinci keydown ile sayacını ayarlamak gerekir: Kullanıcı (5 saniye örneğin) duraklatmak için



Dave'in cevap alternatifi bekliyor her bir tuş takımı için zamanlayıcı. Sonunda, kullanıcı yazmayı durdurduktan 5 saniye sonra. Ayrıca, checkTextArea'dan sonra parantez eksikliğine dikkat edin. Bu setTimeout fonksiyonunun referansını return'a verecektir.


Ayrıca daha kolay çoklu elemanlar için kullanılacak hale getirmek için bir fonksiyon içerisine ayarlayabilirsiniz: Belki "kod bir demet" sonrası olabilir

function setPauseTimer(element, timeout, callback) { 
    var timer = null; 
    element.onkeydown = function() { 
    if (timer) clearTimeout(timer); 
    timer = setTimeout(function(){ callback(element); }, timeout); 
    }; 
} 

function checkTextArea(textarea) { /* moved from global to argument */ 
    if (textarea.value /* ... */) { 
    /* ... */ 
    } 
} 

setPauseTimer(document.getElementById('textarea'), 5000, checkTextArea); 
1

ve bazı olup olmadığını tartışabiliriz orada refactoring (bir zamanlayıcı ile karmaşıklaştırmadan önce). İlk önce ikincil optimizasyonlara atlamak gibi görünüyor.

+0

Maalesef, şirket politikasının bir parçası olduğu için yapamıyorum. Bu çok önemli, evet, ama birilerinin genel bir çözüm bulmuş olabileceğini umuyorum. – aditya

+0

Cep telefonu uygulama kalitesinin mikrobağlı tuş vuruşu yönetimine çok kritik bir şekilde bağlı olduğu göz önüne alındığında, zamanlayıcılardan vb. Kaçınmaya çalışacağım - kullanıcının gözü sık sık ekran ve klavye arasındaki etkileşime sıkıca yapıştırılır. Bir şeyi genelleştirip yayınlayabilir misin? – dkretz

0

Zamanlayıcı yöntemlerini düşündüm. setTnterval'un setTimeout'dan daha iyi olacağına inanıyorum, ama bu pek de uygun bir çözüm değil, değil mi?

İlgili konular