2016-10-04 1 views
0

J'imprime une chaîne <a href="..">some text</a>, <a href="..">some other text</a>.Tronquer le texte mais garder le html en javascript

Je souhaite tronquer le texte visible, tout en conservant le lien.

Si je viens de faire une sous-chaîne naïve, je gâcherais le html. Je veux m'assurer que seulement 100 caractères sont montrés, mais si la dernière partie de la chaîne est, par exemple, <a hre, alors ceci devrait également être dépouillé.

Modifier

J'ai essayé

arr = ['some text', 'some other text', 'some third text']; 
output = arr.map(el => '<a href="#">' + el + '</a>').join(', '); 

// print 
console.log(output.substr(0, 20)) 

mais qui coupera le code html et sortie

<a href="#">some tex 

Mais je veux qu'il compte le nombre de caractères affichés au lieu de combien les caractères ont été utilisés pour montrer la sortie. Donc, si la sortie affichée est some text, some other text, some third text, je veux qu'elle coupe le caractère 20 dans le texte de sortie plutôt que le caractère 20 dans la sortie html.

+1

Recommander montrant ce que vous avez essayé jusqu'à présent, car il vous tient nous demandez simplement de vous écrire du code. – chazsolo

+0

J'ai édité ma question – mortensen

+0

Vous allez devoir faire le nombre de caractères et la troncature avant de mapper chaque valeur dans le tableau. – chazsolo

Répondre

0

Set textContent d'éléments à tout ce que vous voulez:

(function() { 
 
    var links = document.getElementsByClassName("link"); 
 
    for(var i = 0; i < links.length; i++) { 
 
    links[i].textContent = "Link text changed"; 
 
    } 
 
})();
<a class="link" href="http://stackexchange.com">Stack Exchange</a> 
 
<a class="link" href="http://stackoverflow.com">Stack Overflow</a>

0

Vous pouvez le faire avec CSS simple.

var paragraph = document.querySelector('p#before'); 
 

 
    document.querySelector('p#after-text').innerHTML = truncateTEXT(paragraph, 20, true); 
 
    document.querySelector('p#after-html').innerHTML = truncateHTML(paragraph, 20, true); 
 

 
    function truncateHTML(html, limit, dots) { 
 
    holdCounter = false; 
 
    truncatedHTML = ''; 
 
    html = paragraph.innerHTML; 
 

 
    for(index = 0; index < html.length; index++) { 
 
     if(!limit) { 
 
     break; 
 
     } 
 
     if(html[index] == '<') { 
 
     holdCounter = true; 
 
     } 
 
     if(!holdCounter) { 
 
     limit--; 
 
     } 
 
     if(html[index] == '>') { 
 
     holdCounter = false; 
 
     } 
 
     truncatedHTML += html[index]; 
 
    } 
 
    truncatedHTML = correctHTML(truncatedHTML); 
 
    if(dots) { 
 
     truncatedHTML = truncatedHTML + '...'; 
 
    } 
 
    return truncatedHTML; 
 
    } 
 

 

 
    function truncateTEXT(string, limit, dots) { 
 
    string = string.innerText; 
 
    if(string.length > limit) { 
 
     return string.substring(0, limit) + (dots ? '...' : ''); 
 
    } else { 
 
     return string; 
 
    } 
 
    } 
 

 
    function correctHTML(html){ 
 
    container = document.createElement('div'); 
 
    container.innerHTML = html 
 

 
    return container.innerHTML; 
 
    }
<p id="before"><a href="#">Lorem</a> <strong>ipsum</strong> <a href="#">dolor</a> <strong>sit</strong> <a href="#">amet</a> <strong>consectetur</strong> <a href="#">adipiscing</a> <strong>elit</strong></p> 
 
<p id="after-text"></p> 
 
<p id="after-html"></p>

+1

Je ne pense pas que OP veut qu'il veut tronquer tout le texte dans votre cas, pas le lien. Et si le lien est le dernier dans devrait être tronqué. – jcubic

+0

Eh bien, vous avez raison. J'ai écrit un script simple et j'espère pouvoir l'aider. –