2011-09-14 19 views
8

Używam następujące funkcje jQuery policzyć słowa w czasie rzeczywistym:jQuery: Policz słowa w czasie rzeczywistym

$("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) 
    } 

Problem używam do jest to, że kiedy rozpocząć wpisywanie w polu wprowadzania, hrabia zwiększa się natychmiast o dwa, nawet w przypadku spacji i mojego klucza kasowania. Jakieś pomysły, dlaczego tak się stało?

byłem po ten poradnik: http://www.electrictoolbox.com/jquery-count-words-textarea-input/

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

Wyświetlacz Wejście: <input class="widest" disabled="disabled" id="finalcount" name="page[word_count]" size="30" type="text" value="662">

+0

można wprowadzić również dla html div wejściowego i wyświetlacza? – willdanceforfun

+1

Czy masz [jsfiddle] (http://jsfiddle.net)? –

+0

Oto link do jsfiddle ... http://jsfiddle.net/M7Jny/ – dennismonsewicz

Odpowiedz

14

jest zwiększany przy każdym naciśnięciu klawisza bo mówisz go z:

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

A jeśli dodać inne słowo, można zauważyć, że zwiększa to nie o 2, ale o 3. Można przypuszczać, że ty mieć kilka wejść na stronie, a ty zamierzasz, aby na wejściu finalcount wyświetlała się liczba słów na każdym wejściu. Zapisz wartości w zmiennej i dodaj zmienne razem, aby uzyskać wartość ostatecznego rachunku. Lub liczyć słowa w każdym wpisie za każdym razem.

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) 
} 

demo robocza: http://jsfiddle.net/gilly3/YJVPZ/

Edit: Przy okazji, masz kilka możliwości uproszczenia kodu nieco usuwając pewną nadmiarowość. Można wymienić cały JavaScript pan pisał o tym:

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

Dziękuję SOOO za dużo !!!! – dennismonsewicz

+0

Jedyne, czym się mylę, to zbyteczne wiązanie klawiszy. Czy możesz to trochę wyjaśnić? – dennismonsewicz

+0

'.keyup()' z przekazanym argumentem funkcji wiąże zdarzenie keyup z tą funkcją. Ale jeśli pominiesz argument funkcji, '.keyup()' wyzwala zdarzenie keyup, wywołując związaną funkcję. Jest to equivelant z '.trigger (" keyup ")'. Zawarłem to, aby dopasować funkcjonalność, którą posiadałeś w swoim kodzie, gdzie 'word_count()' jest wywoływane w tym samym czasie, co zdarzenie jest związane. – gilly3

4

Edit

Sprawdź this example.


Dlaczego nie używasz split(" ") zamiast dopasowywania i dzielenia wyniku? Będziesz miał tablicę zawierającą wszystkie twoje słowa, długość tablicy będzie liczbą słów.

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

Poza tym, dlaczego dodajesz za każdym razem, gdy dopasowania do starego wyniku?

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

Czy to nie jest za każdym razem dodawanie wszystkich słów?

+0

Możesz użyć 'number = matches.filter (function (word) {return word.length> 0}) length;' aby uniknąć liczenia wielu spacji jako słów. – Dennis

+0

@Jose - dzięki za komentarz! Dopasowanie (\ b \ g) pasuje dokładnie do tego, czego szukam, ale z jakiegoś powodu po prostu nie działa poprawnie z kluczowaniem.Jego liczenie każdej operacji kluczowania – dennismonsewicz

+0

@Dennis: miłym akcentem, dodano do odpowiedzi! –

Powiązane problemy