Traiter avec des Sauts de ligne sur contentEditable DIV

J'ai un problème avec contenteditable les sauts de ligne sur SAFARI/CHROME. Lorsque j'appuie sur "retour" 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 nettoyage (suppression de <div>), j'obtiens ceci:

SomethingSomething

Dans Firefox, la contenteditable est:

Something
<br>
Something

Et qu'après assainissement de l'air d'être le même:

Something
Something

Est-il une solution pour "normaliser" cette manière sur tous les navigateurs?

J'ai trouvé ce code sur Faire un <br> au lieu de <div></div> 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 (dans SAFARI et CHROME) je dois appuyer sur deux fois la touche "retour" pour obtenir une nouvelle ligne...

Une idée?

Modifier: Avec le code que j'ai trouvé ( en bas de cette question) fonctionne bien sauf la fonction "permet de s'assurer un <br> élément est toujours lastChild... une 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'

Edit 3: Ok, j'ai changé le document.createChild("br"); à document.createElement("br"); et je pense que je l'ai eu à travailler dans FF/Safari/Chrome... Tout retour <br> pour les nouvelles lignes...

Le problème est que quand je suis à l'intérieur d'un ordre ou d'une Liste non triée, j'ai besoin d'obtenir une nouvelle ligne sans <br>...

Edit 4: Si quiconque s'intéresse à la solution de la dernière modification: Éviter createElement fonction de si c'est à l'intérieur d'un <LI> élément (contentEditable)

  • quelle est votre méthode de désinfection ressembler?
  • Il supprime juste tous les <div>... je suis en utilisant github.com/gbirke/Sanitize.js Le problème, c'est que Safari/Chrome, lorsque j'appuie sur le retour, ils suffit de créer un nouveau DIV au lieu de faire un <BR> comme Firefox
  • Peut-être que vous pouvez utiliser $("div:vide").remplaceavec("<br/>");
  • Avez-vous trouvé quelque chose d'utile pour le bug des deux clefs de retour? J'ai tombé sur le même problème, la seule chose que je semble être en mesure de faire, c'est un hack (ajouter une zone de texte vide et sélectionnez-le donc, si vous continuez à écrire il disparaîtra automatiquement), je vais poster sur ce thread juste au cas où. Il n'est pas parfait, mais il fonctionne.
  • Firefox dispose maintenant d'une approche hybride: elle enveloppe l' <br>s à l'intérieur <div>s. Cela lui permet de se comporter de la même manière pour google Chrome, j'imagine, parce que réagir enlève le <div>s entièrement, y compris les <br>s.
InformationsquelleAutor Santiago | 2011-05-16