2016-08-31 8 views
5

Próbuję zaimplementować funkcję przy użyciu jQuery, która przeskanuje cały mój blog i obliczy szacowany czas odczytu dla użytkownika.Używanie JQuery do liczenia wszystkich słów w poście na blogu

Obecnie zrobiłem następujące czynności, aby uzyskać ilość słów w każdym akapicie:

$('p').each(function(){ 
    var v = wordCount($(this).html()); 
    totalWords = totalWords + v.words; 
); 

function wordCount(val){ 
      var wom = val.match(/\S+/g); 
      return{ 
      charactersNoSpaces: val.replace(/\s+/g, '').length, 
      characters: val.length, 
      words: wom ? wom.length: 0, 
      lines: val.split(/\r*\n/).length 
    } 
} 

Dziękuję plakatu na to pytanie za wordCount funkcję: Word and Character Count using jQuery

Powyższy działa poprawnie i otrzymuję wynik, którego oczekuję od moich akapitów. Jednak mój blog post będzie składać się z kombinacji h1, h2, h3, h4, h5, h6, ul, ol, span, p, li.

Więc zmodyfikowane mój kod tak:

$('p, h1, h2, h3, h4, h5, h6, ul li, ol li, span').each(function(){ 
    var v = wordCount($(this).html()); 
    totalWords = totalWords + v.words; 
}); 

Ale teraz wyniki są przekrzywione. Na przykład Jeśli mam znacznik span w obrębie akapitu lub elementu listy lub cokolwiek innego, to jest on liczony dwukrotnie.

Tak na przykład ten Markup powinna wrócić 8, zamiast dostać 9.

<ul> 
     <li>This is a test</li> 
     <li>This is <span>another</span> text</li> 
</ul> 

Czy ktoś może mi doradzić w sprawie ewentualnej poprawki, nie jest oczywiście błąd w moim logiki i będę wdzięczny za każdą pomoc.

Dzięki

+0

Twój blog opis stanowiska zacząć każdy div posiadające dowolny unikalny identyfikator. –

+0

Cała zawartość mojego posta w blogu jest zawarta w opakowaniu z identyfikatorem "id", więc gdy moja logika zostanie naprawiona zamierzałem zaatakować wszystkie elementy w tym opakowaniu dla słowa liczba – Javacadabra

+3

Użyj 'text()' zamiast 'html () '. UŻYJ 'var v = wordCount ($ (this) .text());' – Tushar

Odpowiedz

6

Zastosowanie text() uzyskać textContent elementu.

var v = wordCount($(this).text()); 

html() Jeśli stosuje się elementy, na przykład <h1> i </h1> będzie liczony jako słowa.

+0

Cześć @Tushar dziękuję za odpowiedź, zaktualizowałem, jak wspomniałeś, ale nadal otrzymuję ten sam wynik - wydaje się, że moje zagnieżdżone elementy są liczone dwukrotnie – Javacadabra

+2

@Javacadabra Musisz podać jako selektor główny kontener artykułu , nie każdy element zagnieżdżony i btw, należy go przyciąć (w niektórych przypadkach): 'var v = wordCount ($ (this) .text(). trim());' –

+1

@Javacadabra Jako selektor 'p' jest używany , jeśli są zagnieżdżone elementy akapitu, kod zostanie uruchomiony dwukrotnie. Użyj specyficznego selektora elementów, jak podano w innych komentarzach. – Tushar

Powiązane problemy