J'ai un problème avec contenteditable
les sauts de ligne sur SAFARI/CHROME. Lorsque j'appuie sur "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>
Cela ressemble à (sur le DIV contentEditable) :
Something
Something
Mais après la désinfection (élimination <div>
), j'obtiens ceci :
SomethingSomething
Dans Firefox, le contenteditable
est :
Something
<br>
Something
Et qui, après désinfection, se ressemble :
Something
Something
Existe-t-il une solution pour "normaliser" cette situation entre les navigateurs ?
J'ai trouvé ce code sur Faire un <br>au lieu de <div></div> en appuyant sur Entrée 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 sur la touche "retour" pour obtenir une nouvelle ligne...
Une idée ?
Modifier : Avec le code que j'ai trouvé ( au bas de cette question), tout fonctionne bien, sauf la fonction qui "s'assure qu'un <br>
est toujours le dernier enfant... Une idée sur la façon de résoudre ce problème ?
Edit 2 : J'obtiens cette 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 l'avoir fait fonctionner dans FF/Safari/Chrome... Tout retour <br>
pour les nouvelles lignes...
Le problème est que maintenant, lorsque je suis à l'intérieur d'une liste ordonnée ou non ordonnée, je dois obtenir une nouvelle ligne sans <br>
...
Edit 4 : Si quelqu'un est intéressé par la solution de la dernière modification : Éviter la fonction createElement si elle se trouve à l'intérieur d'un élément <LI> (contentEditable)
0 votes
À quoi ressemble votre méthode de désinfection ?
0 votes
@mdmullinax Il supprime simplement toutes les <div>... J'utilise github.com/gbirke/Sanitize.js Le problème est que Safari/Chrome, lorsque j'appuie sur retour, ils créent simplement un nouveau DIV au lieu de faire un <BR> comme Firefox.
1 votes
Vous pouvez peut-être utiliser $("div:empty").replaceWith("<br/>") ;
0 votes
Avez-vous trouvé quelque chose d'utile pour le bug des deux touches de retour ? J'ai rencontré le même problème, la seule chose que je semble être en mesure de faire est un hack (ajouter un texte vide et le sélectionner de sorte que si vous continuez à écrire, il disparaîtra automatiquement), je vais poster dans ce fil juste au cas où. Ce n'est pas parfait mais ça marche.
0 votes
Firefox a maintenant une approche hybride : il enveloppe les <br>s à l'intérieur de <div>s. Cela le fait se comporter de manière similaire à Chrome, je suppose parce que react supprime entièrement les <div>s, y compris les <br>s.