Gérer les ruptures de ligne sur le divitable contented

j'ai un problème avec les sauts de ligne contenteditable sur SAFARI/CHROME. Quand j'appuie "return" sur un contentEditable <div> , au lieu de créer un <br> (comme Firefox), ils créent un nouveau <div> :

<div>Something</div>
<div>Something</div>

Qui ressemble (sur la contentEditable DIV):

Something
Something

mais après la désinfection (en enlevant <div> ), je reçois ceci:

SomethingSomething

dans Firefox, le contenteditable est:

Something
<br>
Something

et qu'après la désinfection ressemble le même:

Something
Something

y a-t-il une solution pour" normaliser " cela à travers les navigateurs?

j'ai trouvé ce code sur faire un
au lieu de

en appuyant sur Enter sur un contenteditable

$(function(){

  $("#editable")

  // make sure br is always the lastChild of contenteditable
  .live("keyup mouseup", function(){
    if (!this.lastChild || this.lastChild.nodeName.toLowerCase() != "br") {
      this.appendChild(document.createChild("br"));
     }
  })

  // use br instead of div div
  .live("keypress", function(e){
    if (e.which == 13) {
      if (window.getSelection) {
        var selection = window.getSelection(),
          range = selection.getRangeAt(0),
          br = document.createElement("br");
        range.deleteContents();
        range.insertNode(br);
        range.setStartAfter(br);
        range.setEndAfter(br);
        range.collapse(false);
        selection.removeAllRanges();
        selection.addRange(range);
        return false;
      }
    }
  });
});

cela fonctionne, mais (en SAFARI et CHROME) je dois appuyer deux fois le " retour" la clé pour obtenir une nouvelle ligne...

une idée?

Edit : avec le code que j'ai trouvé ( au bas de cette question) fonctionne bien sauf la fonction qui" s'assure qu'un élément <br> est toujours le dernier-né... Aucune idée sur comment résoudre ce problème?

Edit 2: je reçois ce message d'erreur sur la console: Uncaught TypeError: Object #<HTMLDocument> has no method 'createChild'

Modifier 3: Ok, j'ai changé le document.createChild("br"); en document.createElement("br"); et je pense que je l'ai fait travailler en FF/Safari/Chrome... Tous les retourner <br> pour les nouvelles lignes...

le problème est que maintenant que je suis dans une liste ordonnée ou Non, Je dois obtenir une nouvelle ligne sans <br> ...

Edit 4: Si quiconque s'intéresse à la solution de la dernière édition: Éviter createElement fonction si elle est à l'intérieur d'un élément

  • (contentEditable)

  • 47
    demandé sur Community 2011-05-17 00:54:49

    6 réponses

    cette technique semble éviter le bug Chrome qui montre BRs la première fois (avec le code que vous avez mentionné vous devez pousser deux fois la touche Entrée).

    ce n'est pas un hack parfait mais il fonctionne: il ajoute un espace blanc après votre BR afin de montrer correctement. Cependant, vous verrez que l'ajout de seulement un espace "" NE changera rien, il travaille avec d'autres lettres. Le navigateur ne sera pas le montrer, probablement parce que c'est comme un espace vide à l'intérieur d'une page html, il simplement ne veut rien dire. Pour me débarrasser de ce bogue, j'ai créé une div avec jQuery qui inclut une balise &nbsp; , et je prends la propriété text() pour la mettre dans le code textnode sinon ça ne marche pas.

    $editables = $('[contenteditable=true]');
    
    $editables.filter("p,span").on('keypress',function(e){
     if(e.keyCode==13){ //enter && shift
    
      e.preventDefault(); //Prevent default browser behavior
      if (window.getSelection) {
          var selection = window.getSelection(),
              range = selection.getRangeAt(0),
              br = document.createElement("br"),
              textNode = document.createTextNode("\u00a0"); //Passing " " directly will not end up being shown correctly
          range.deleteContents();//required or not?
          range.insertNode(br);
          range.collapse(false);
          range.insertNode(textNode);
          range.selectNodeContents(textNode);
    
          selection.removeAllRanges();
          selection.addRange(range);
          return false;
      }
    
       }
    });
    
    26
    répondu Micaël Félix 2013-10-14 14:21:04

    écouter des frappes semble être beaucoup de travail. Est-ce que quelque chose d'aussi simple que cela serait faisable:

    var html = $('.content').html().replace(/<div>/gi,'<br>').replace(/<\/div>/gi,'');
    

    JSFiddle démo ici .

    aussi, il ressemble à désinfectant.js permet une configuration personnalisée. Avez-vous essayé d'ajouter div comme un élément?

    Autoriser HTML / CSS est dangereux, donc assurez-vous d'être extrêmement prudent.

    EDIT: Retiré de côté de serveur de commentaires. La désinfection se produit au moment de l'utilisation, si le client veut contourner cette localement, il peut être fait à ses propres risques. Merci Vincent McNabb de l'avoir souligné.

    13
    répondu Kurt 2017-05-23 12:10:37

    , Vous pouvez simplement utiliser la commande suivante document.execCommand('insertHTML',false,'<br>');

    cette commande empêchera le comportement par défaut et ajoutera une balise que vous souhaitez. C'est tout, 1 ligne de code

    Et encore plus facile d'approche.

    CSS SEULEMENT.

    contenteditable élément appliquer display:inline-block règle et ceci ajoutera br S seulement

    4
    répondu Karb 2017-12-06 16:47:05
    Les Webkits

    ne rendront pas un seul br s'il s'agit du dernier enfant (non vide) d'un conteneur. Pour Safari, la touche native pour insérer un saut de ligne est Ctrl + Return. Si vous regardez attentivement, vous remarquez que Safari insère en fait deux br s tout en n'en rendant qu'un; cependant, il insérera un seul br s'il y a un texte traînant, ou se débarrassera du double br s Une fois que vous en entrez quelques-uns (s'il y avait des doubles).

    apparemment, il il semble qu'une solution pour Webkits est d'insérer double br s comme ils le font eux-mêmes, et les laisser gérer le reste.

    2
    répondu Klim Lee 2013-03-12 21:02:48

    vous pourriez vouloir consulter la propriété css white-space . Paramétrer le style à white-space: pre-wrap vous permet de vous débarrasser de tout ce javascript, parce qu'il change le comportement des espaces à afficher au lieu de s'effondrer.

    et voir cette réponse: HTML - newline char in DIV content editable?

    1
    répondu B T 2017-05-23 11:47:09