javascript - How to truncate text with jQuery but keep the HTML formatting? -


how can truncate text jquery keep html? tried following code unfortunately doesn't return html formatting.

var truncate = function() {   $('p.truncated').text(function(index, oldtext) {     if (oldtext.length > 20) {       return '...' + oldtext.substr(-25);     }     return oldtext;   }); } 

if run snippet see seeking.

var truncate = function() {    $('p.truncated').text(function(index, oldtext) {      if (oldtext.length > 20) {        return '...' + oldtext.substr(-25);      }      return oldtext;    });  }    truncate();          var truncate2 = function() {    $("p.truncated2").each(function() {      //var thecontent = $(this).text();      var thecontent = $(this).html();      var n = thecontent.substr(-25);      $(this).html( '...' +n );    });    }    truncate2();
p {    margin: 0 0 30px 0;    display: block;    padding: 5px;  }  streak {    color: green;  }  double {    color: orange;  }  p span {    color: grey;  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>  how make this...  <p class="sheet">    <streak>start</streak>    <streak>1</streak>    <streak>2</streak>    <double>3</double>    <double>4</double>    <span>5</span>    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  ...becomes jquery?  <p>    ...    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  <hr />here try jquery return text without html elements.  <p class="truncated">    <streak>start</streak>    <streak>1</streak>    <streak>2</streak>    <double>3</double>    <double>4</double>    <span>5</span>    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  second try  <p class="truncated2">    <streak>start</streak>    <streak>1</streak>    <streak>2</streak>    <double>3</double>    <double>4</double>    <span>5</span>    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  how can keep html elements?

if want keep counting character count, can use range object also. set range want delete , it'll delete nodes well. manipulate text keep html tags.

var truncate = function() {    var range_all = document.createrange();    range_all.selectnodecontents(document.getelementsbyclassname('truncated')[0]);    if (range_all.endoffset > 20) {      range_all.setend(document.getelementsbyclassname('truncated')[0], range_all.endoffset - 12);      range_all.deletecontents();      $('p.truncated').html('... ' + $('p.truncated').html());    }    }    truncate();          var truncate2 = function() {    $("p.truncated2").each(function() {      //var thecontent = $(this).text();      var thecontent = $(this).html();      var n = thecontent.substr(-25);      $(this).html('...' + n);    });    }    truncate2();
p {    margin: 0 0 30px 0;    display: block;    padding: 5px;  }  streak {    color: green;  }  double {    color: orange;  }  p span {    color: grey;  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>  how make this...  <p class="sheet">    <streak>start</streak>    <streak>1</streak>    <streak>2</streak>    <double>3</double>    <double>4</double>    <span>5</span>    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  ...becomes jquery?  <p>    ...    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  <hr />if text longer 25 character, select until 12th , delete selection. add '...' @ beginning.  <p class="truncated">    <streak>start</streak>    <streak>1</streak>    <streak>2</streak>    <double>3</double>    <double>4</double>    <span>5</span>    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  second try  <p class="truncated2">    <streak>start</streak>    <streak>1</streak>    <streak>2</streak>    <double>3</double>    <double>4</double>    <span>5</span>    <span>6</span>    <streak>7</streak>    <streak>8</streak>    <double>9</double>    <double>10</double>    <streak>end</streak>  </p>  how can keep html elements?


Comments