2011-09-14 16 views
8

kelimeleri Sayısı:jQuery: Ben gerçek zamanlı olarak kelimeleri saymak için aşağıdaki jQuery işlevini kullanıyorum gerçek zamanlı

$("input[type='text']:not(:disabled)").each(function(){ 
      var input = '#' + this.id; 
      word_count(input); 

      $(this).keyup(function(){ 
       word_count(input); 
      }) 

     }); 

var word_count = function(field) { 
     var number = 0; 
     var original_count = parseInt($('#finalcount').val()); 
     var matches = $(field).val().match(/\b/g); 
     if(matches) { 
      number = matches.length/2; 
     } 
     $('#finalcount').val(original_count + number) 
    } 

İçine çalıştırıyorum sorun olduğunu ben bir giriş alanına yazmaya başlayın sayım boşluklarda ve silme anahtarımda bile hemen iki kişi artar. Bunun neden olabileceği hakkında bir fikrin var mı? Bu öğretici takip ediyordu

: http://www.electrictoolbox.com/jquery-count-words-textarea-input/

Girdi: <input class="widest" id="page_browser_title" name="page[browser_title]" size="30" type="text" value="">

Ekran Girdi: <input class="widest" disabled="disabled" id="finalcount" name="page[word_count]" size="30" type="text" value="662">

+0

giriş ve ekran div için de html girebilir miyim? – willdanceforfun

+1

Bir [jsfiddle] (http://jsfiddle.net) var mı? –

+0

İşte jsfiddle bir bağlantıdır ... http://jsfiddle.net/M7Jny/ – dennismonsewicz

cevap

14

: ama 3 ile Tahminen,

$('#finalcount').val(original_count + number) 

Ve başka bir kelime eklerseniz, bunu 2 ile değil artırır olduğunu göreceksiniz, siz Sayfada birkaç giriş var ve son giriş girişinin her girişteki sözcük sayısını göstermesini amaçlıyorsunuz. Sayımları bir değişkende saklayın ve finalcount değerinizi almak için değişkenleri birlikte ekleyin. Ya da her girişte kelimeleri her seferinde sayın.

var wordCounts = {}; 

function word_count (field) { 
    var number = 0; 
    var matches = $(field).val().match(/\b/g); 
    if (matches) { 
     number = matches.length/2; 
    } 
    wordCounts[field] = number; 
    var finalCount = 0; 
    $.each(wordCounts, function(k, v) { 
     finalCount += v; 
    }); 
    $('#finalcount').val(finalCount) 
} 

Çalışma demo: http://jsfiddle.net/gilly3/YJVPZ/

Düzenleme: Bu arada, bazı fazlalık kaldırarak biraz kodunuzu basitleştirmek için bazı fırsatlar var. Sen JavaScript tüm yerini alabilir Bununla yayınlanmıştır:

var wordCounts = {}; 
$("input[type='text']:not(:disabled)").keyup(function() { 
    var matches = this.value.match(/\b/g); 
    wordCounts[this.id] = matches ? matches.length/2 : 0; 
    var finalCount = 0; 
    $.each(wordCounts, function(k, v) { 
     finalCount += v; 
    }); 
    $('#finalcount').val(finalCount) 
}).keyup(); 

http://jsfiddle.net/gilly3/YJVPZ/1/

+0

Teşekkür ederim SOOO çok !!!! – dennismonsewicz

+0

Kafamın karıştığı tek şey yedek anahtarlı ciltleme ... biraz açıklayabilir misin? – dennismonsewicz

+0

'.keyup()', bir işlev bağımsız değişkeni ile anahtarlama olayını bu işleve bağlar. Ancak, işlev argümanını atlarsanız, '.keyup()' anahtarlama olayını tetikleyerek bağlı işlevi çağırır. .trigger ("keyup") 'ın denkleyicisidir. Bunu, kodunuzda yer alan işlevsellikle eşleştirmek için "word_count()" ifadesinin olayın aynı anda çağrıldığı sırada eşleştiğini ekledim. – gilly3

4

Düzenleme

kontrol this example.


yerine neden eşleşen ve sonucu bölünmesi split(" ") kullanmıyorsun? Tüm kelimelerinizi içeren bir diziniz olacak, dizinin uzunluğu kelimelerin sayısı olacaktır.

var matches = $(field).val().split(" "); 

Ayrıca, her eşleşmeyi eski sonuçlara neden ekliyorsunuz?

$('#finalcount').val(original_count + number) 

Bu, tüm sözcükleri her seferinde iki kere eklemiyor mu? Birlikte bunu anlatıyorsun çünkü her tuşa basarak artırma edilir

+0

'Number = match.filter (function (word) {return word.length> 0}). Length;' kelimelerini birden fazla boşluk saymayı önlemek için kullanabilirsiniz. – Dennis

+0

@Jose - Yorum için teşekkürler! Eşleşmeyi (\ b \ g) yapmak tam olarak aradığım şeyle eşleşiyor, sadece bazı sebeplerden dolayı anahtarın üzerinde çalışmıyor.Her keyup işlemi sayılıyor – dennismonsewicz

+0

@Dennis: hoş bir dokunuş, cevabı ekledi! –

İlgili konular