ContentEditable div – tout le HTML après les premiers «x» caractères

Je travaille sur une div par consentante, dans laquelle je mets en surbrillance le texte quand il dépasse une longueur maximale définie.

Codepen ici: http://codepen.io/doublesidedstickytape/pen/NqBMXR

Cela fonctionne bien – à moins qu’un utilisateur n’appuie sur Entrée – alors ça casse!

Je pense que je pourrais obtenir tout le contenu HTML après le premier [x] nombre de caractères, puis parcourir chacun des éléments (qui constituent de nouvelles lignes) – pour envelopper une classe de surbrillance autour d’eux dans mon div caché.

Je ne sais pas comment y parvenir.

HTML

JS

 $(document).on("keyup", "div.editable", function(event) { // GOOD TO STORE THIS IN A VAR // PREVENTS THE BROWSER HAVING TO // FIGURE OUT WHAT $(this) IS // EACH TIME YOU CALL IT var element = $(this); // KEYUP if (event.type == "keyup") { var maximumLength = element.attr("data-maxlength"); var currentLength = element.text().length; var content = element.text(); // CURRENT LENGTH IS GREATER THAN // THE SPECIFIED MAXIMUM LENGTH if (currentLength > maximumLength) { var over = element.html().substr(maximumLength); over = "" + over + ""; content = element.html().substr(0, maximumLength) + over; } $("div.readonly").html(content); } }); 

CSS

 body { margin: 0 auto; font-family: Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.4em; color: #444; } div.wrapper { position: relative; margin-top: 15px; } div.editable, div.readonly { width: 300px; white-space: wrap; position: absolute; top: 0; left: 0; } div.editable { border-bottom: 1px solid #00aeed; outline: none; } div.readonly { z-index: -99; color: transparent; background: transparent; } span.highlight { background: #fcc !important; } 
 $(document).on("keyup", "div.editable", function(event) { // GOOD TO STORE THIS IN A VAR // PREVENTS THE BROWSER HAVING TO // FIGURE OUT WHAT $(this) IS // EACH TIME YOU CALL IT var element = $(this); // KEYUP if (event.type == "keyup") { var maximumLength = element.attr("data-maxlength"); var currentLength = element.text().length; var content = element.text(); // CURRENT LENGTH IS GREATER THAN // THE SPECIFIED MAXIMUM LENGTH if (currentLength > maximumLength) { var over = element.html().substr(maximumLength); over = "" + over + ""; content = element.html().substr(0, maximumLength) + over; } $("div.readonly").html(content); } }); 
 body { margin: 0 auto; font-family: Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.4em; color: #444; } div.wrapper { position: relative; margin-top: 15px; } div.editable, div.readonly { width: 300px; white-space: wrap; position: absolute; top: 0; left: 0; } div.editable { border-bottom: 1px solid #00aeed; outline: none; } div.readonly { z-index: -99; color: transparent; background: transparent; } span.highlight { background: #fcc !important; } 
  

J’ai élaboré une solution, voir: http://jsfiddle.net/alan0xd7/6o1sr5fg/

  • S’il y a du texte qui doit être surligné, nous allons d’abord copier le contenu HTML dans div.readonly pour un traitement ultérieur. Si aucune mise en évidence n’est requirejse, nous viderons simplement la div .

  • La fonction collectTextNodes() parcourt tous les nœuds DOM du contenu HTML et collecte tous les nœuds de texte. Les nœuds collectés ne contiendraient que du texte et aucun nœud enfant.

  • Pour tous les nœuds de texte que nous avons collectés, nous les exécutons via la fonction highlight() pour surligner le texte.

  • highlight() fonctionne en ignorant tout d’ maximumLength nombre maximumLength de caractères, puis en enveloppant tout dans .