2011-09-14 41 views
8

estoy usando la siguiente funcionalidad jQuery para contar las palabras en tiempo real:jQuery: Contar palabras en tiempo real

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

El problema que estoy funcionando con en es que cuando empieza a escribir en un campo de entrada, el recuento aumenta inmediatamente en dos, incluso en espacios y mi tecla de borrar. ¿Alguna idea de por qué esto sucedería?

Estaba siguiendo este tutorial: http://www.electrictoolbox.com/jquery-count-words-textarea-input/

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

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

+0

¿Puede entrar en su html también para la entrada y visualización div? – willdanceforfun

+1

¿Tiene un [jsfiddle] (http://jsfiddle.net)? –

+0

Aquí hay un enlace a jsfiddle ... http://jsfiddle.net/M7Jny/ – dennismonsewicz

Respuesta

14

Se está incrementando con cada pulsación de tecla, porque le está diciendo que con:

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

Y si se añade otra palabra, se encuentra que no se incrementa en 2, pero por 3. Es de suponer, que tiene varias entradas en la página, y tiene la intención de que la entrada de recuento final muestre el número de palabras en cada entrada. Guarde los recuentos en una variable y agregue las variables para obtener su valor de recuento final. O cuente las palabras en cada entrada cada vez.

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

demostración de trabajo: http://jsfiddle.net/gilly3/YJVPZ/

Editar: Por cierto, tienes algunas oportunidades para simplificar su código un poco quitando algo de redundancia. Puede reemplazar todo el JavaScript informado con esto:

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

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Muchísimas !!!! – dennismonsewicz

+0

Lo único en lo que estoy confundido es en el enlace redundante de keyup ... ¿puede explicar eso un poco? – dennismonsewicz

+0

'.keyup()' con un argumento de función pasado en vincula el evento keyup a esa función. Pero, si omite el argumento de la función, '.keyup()' desencadena el evento keyup, llamando a la función enlazada. Es el equivalente de '.trigger (" keyup ")'. Incluí eso para que coincida con la funcionalidad que tenía en su código donde 'word_count()' se llama al mismo tiempo que el evento está obligado. – gilly3

4

Editar

Comprobar this example.


¿Por qué no usar split(" ") lugar de juego y dividiendo el resultado? Tendrás una matriz que contiene todas tus palabras, la longitud de la matriz será el número de palabras.

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

Además, ¿por qué agrega cada vez que las coincidencias con el resultado anterior?

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

¿No es esto agregar cada vez todas las palabras dos veces?

+0

Puede usar 'number = matches.filter (function (word) {return word.length> 0}). Length;' para evitar contar espacios múltiples como palabras. – Dennis

+0

@Jose - ¡gracias por el comentario! Hacer la coincidencia (\ b \ g) coincide exactamente con lo que estoy buscando, simplemente no funciona bien en la tecla por alguna razón.Está contando cada operación de teclado – dennismonsewicz

+0

@Dennis: toque agradable, agregado a la respuesta! –

Cuestiones relacionadas