2010-03-31 3 views
2

Im essayant de faire une fonction de résumé de petit nom en fonction de la taille du conteneur d'éléments, voici ce que j'ai;javascript Résumé fonction

function shorten_text(str, size){ 
    size = size.match(/[0-9]*/); 
    var endValue = Math.floor(Number(size)/10); 
    var number; 
    var newStr; 
    for (number = 0; number <= endValue; number++) { 
     if(str[number].length != 0) { 
      newStr += str[number]; 
     } 
    } 
    return newStr + '...'; 

} 
shorten_text('Phil Jackson', '94px'); 
// output should be 'Phil Jack...' 

Ce que je semble obtenir est undefinedundef ... quelqu'un peut voir où je me trompe?

EDIT:

code révisé en fonction des commentaires ci-dessous pour tous ceux qui googler pour cette fonction:

function shorten_text(str, size){ 
    size = parseInt(size); 
    var endValue = Math.floor(size/10); 
    if(str.length > endValue) { 
     return str.substring(0, endValue) + '...'; 
    }else{ 
     return str; 
    } 
} 

PLAN ÉCRAN:

screenshot http://www.freeimagehosting.net/uploads/4639663b52.gif

+0

Supposez-vous que chaque personnage a un pixel de large? Comment cela marche-t-il? – Nir

+0

J'ai ajouté une capture d'écran pour montrer. –

+0

Merci. Je ne comprends toujours pas comment ajouter un caractère pour chaque pixel de la largeur, car chaque personnage a une largeur variable qui est sûrement supérieure à 1 pixel. – Nir

Répondre

3

Vous devez initialiser votre newStr variable avec une chaîne vide, sinon cette variable contiendra la valeur undefined, wh ich sera convertie en chaîne lorsque vous concaténer, par exemple:

var test; // at this moment the variable contains the undefined value 
test += 'foo'; 
// now test contains "undefinedfoo" 

Dans votre fonction:

function shorten_text(str, size){ 
    size = size.match(/[0-9]*/); 
    var endValue = Math.floor(Number(size)/10); 
    var number; 
    var newStr = ''; 
    for (number = 0; number <= endValue; number++) { 
     if(str[number].length != 0) { 
      newStr += str[number]; 
     } 
    } 
    return newStr + '...'; 
} 

shorten_text('Phil Jackson', '94px'); // outputs "Phil Jacks..." 

Quelques commentaires:

  • Vous n'avez pas besoin d'appeler Number(size), depuis l'opérateur de division fait coercition de type. implicitement
  • Vous pouvez utiliser la méthode substring pour obtenir une partie de votre chaîne d'origine.
  • caractères Accès d'une chaîne avec l'accesseur propriété de crochets ne peuvent pas être pris en charge par certaines implémentations, vous pouvez utiliser la méthode charAt norme (str.charAt(i))

Une autre approche pour faire la même chose:

function shorten_text(str, size){ 
    var endValue = Math.floor(parseInt(size)/10); 
    return str.substring(0, endValue) + '...'; 
} 

shorten_text('Phil Jackson', '94px'); // outputs "Phil Jack..." as expected 
+0

Merci beaucoup, très instructif. Je suis ici pour apprendre! (et fonctionne comme un charme) –

+0

tuche, fait gagner du temps et de l'espace! –

+0

Le shorten_text plus court produit une réponse légèrement différente ('Jack' au lieu de 'Jacks') - nécessite un "+1" si vous voulez le même. Je vais supprimer ma propre réponse maintenant redondante. –