Количество слов в Javascript отключено - PullRequest
4 голосов
/ 11 февраля 2011

У меня есть div с идентификатором "shortblogpost".Я хотел бы посчитать до 27-го слова, затем остановиться и добавить «...» в конце.

Я пробовал следующий код.Проблема, считая буквы, а не слова.Я думаю, что он использует jQuery и не ограничивает JavaScript?

Мне нужно использовать JavaScript только по разным серверным причинам

<script type="text/javascript">
var limit        = 100,
    text         = $('div.shortblogpost').text().split(/\s+/),
    word,
    letter_count = 0,
    trunc        = '',
    i            = 0;

while (i < text.length && letter_count < limit) {
  word         = text[i++];
  trunc       += word+' ';
  letter_count = trunc.length-1;

}

trunc = $.trim(trunc)+'...';
console.log(trunc);
</script>

Заранее всем за любую помощь.

Ответы [ 5 ]

7 голосов
/ 11 февраля 2011

Функция усечения.

Использование: truncate («Это проверка этой функции», 2);Возвращает: Это ...

Использование: truncate («Это тест этой функции», 5, «+++»);Возвращает: Это тест +++

function truncate (text, limit, append) {
    if (typeof text !== 'string')
        return '';
    if (typeof append == 'undefined')
        append = '...';
    var parts = text.split(' ');
    if (parts.length > limit) {
        // loop backward through the string
        for (var i = parts.length - 1; i > -1; --i) {
            // if i is over limit, drop this word from the array
            if (i+1 > limit) {
                parts.length = i;
            }
        }
        // add the truncate append text
        parts.push(append);
    }
    // join the array back into a string
    return parts.join(' ');
}

Редактировать: Быстрый и грязный инструмент по параметрам OP:

<script type="text/javascript">
// put truncate function here...

var ele = document.getElementById('shortblogpost');
ele.innerHTML = truncate(ele.innerHTML, 20);
</script>
5 голосов
/ 11 февраля 2011

Это можно сделать одной строкой кода:

myString.replace(/(([^\s]+\s+){27}).+/, "$1...");

Или вы можете сделать это функцией:

function truncateString(s, wordCount)
{
    var expr = new RegExp("(([^\\s]+\\s+){" + wordCount + "}).+");
    return s.replace(expr, "$1...");
}

Итак, чтобы сделать эту работу для вашего кода, вы можете сделать:

var post = $('div.shortblogpost').text();  // get the text
post = postText.replace(/(([^\s]+\s+){27}).+/, "$1...");  // truncate the text
$('div.shortblogpost').text(post);  // update the post with the truncated text
1 голос
/ 11 февраля 2011

Как насчет этого? jsfiddle

HTML:

<div id='shortblogpost'>test test test test test test test test test test test</div>

JavaScript:

alert(document.getElementById('shortblogpost').innerHTML);
var numWordToDisplay = 3; //how many words u want to display in your case 27
var newArray = document.getElementById('shortblogpost').innerHTML.split(' ');
if(newArray.length >= numWordToDisplay )
    newArray.length = numWordToDisplay;
console.log(newArray.join(' ') + '...'); //test test test...
1 голос
/ 11 февраля 2011

Цикл добавляет слово за словом, в то время как (есть слова &&, количество букв меньше предела).Единственное, что вам нужно сделать, это заменить второе условие на «&& количество слов меньше лимита».

Преобразование этого псевдокода в JS должно быть тривиальным ...

0 голосов
/ 11 февраля 2011

Это должно работать:

var words = $('div.shortblogpost').text().replace( /\s/g, ' ' ).split( ' ' );
var result = "";
for( var w = 0 ; w < 27 ; w++ ) {
    if( words[w].length > 0 ) {
        result += words[w] + ' ';
    }
}
result = result.trim() + "...";
...