Truncar o texto de um objeto jQuery para um comprimento especificado, no espaço mais próximo

Eu amo o jQuery – não tenho nada contra o javascript puro, mas o nascimento do framework jQuery matou muitos dos meus pontos pessoais de javascript. Aqui está um problema que resolvemos recentemente no trabalho, em que queríamos truncar o texto para um determinado comprimento de caractere, mas voltar para o espaço mais próximo para não truncar no meio da palavra.

Para entender a solução mais fácil, primeiro é importante entender que com jQuery você pode passar uma função para métodos setter e retornar o valor que você deseja definir. Por exemplo :

$('#myText').text(function() {
return 'this is my new text'
});

Agora, tudo o que precisamos fazer é escrever uma função que, dada uma string, faz o trabalho. Bem, isso é bastante fácil:

function maxLength(maxLen)
{
return function truncateToNearestSpace(idx, text)
{
// this may chop in the middle of a word
var truncated = text.substr(0, maxLen);

if (/[^s]$/.test(truncated))
return truncated.replace(/s[^s]+$/, "");
else
return truncated.trim();
}
}

E como você usa isso?

// usage
$
('.selector').text(maxLength(50));

Alguma pergunta? A função maxLength retorna uma função truncadora personalizada que é construída com o maxLenvalor. A truncateToNearestSpacefunção primeiro trunca para o comprimento exato de, em maxLenseguida, faz um pequeno trabalho:

if (/[^s]$/.test(truncated))

Se suas habilidades regEx forem mais fracas, você pode não reconhecer isso, mas verifica se o último caractere não é um espaço. Se não for, substituímos o último espaço e tudo que vem depois dele e retornamos o resultado.

A outra opção é a string, depois de ser truncada, termina em um espaço, caso em que retiramos o espaço e o devolvemos, com .trim()– este método não é compatível com o IE antigo, mas há uma maneira fácil e barata de adicioná-lo para o IE :

''.trim||(String.prototype.trim=function(){
return this.replace(/^[suFEFF]+|[suFEFF]+$/g,'')
});

que encontrei com uma pesquisa rápida no Google .