Je suis à la recherche d'une solution définitive et multi-navigateurs pour définir la position du curseur / curseur sur la dernière position connue lorsqu'un contentEditable = 'on' <div> reprend le focus. Il semble que la fonctionnalité par défaut d'un contenu div modifiable consiste à déplacer le curseur / curseur au début du texte dans le div à chaque fois que vous cliquez dessus, ce qui n'est pas souhaitable.
Je crois que je devrais stocker dans une variable la position actuelle du curseur lorsqu'ils quittent le focus du div, puis le redéfinir lorsqu'ils se sont à nouveau concentrés à l'intérieur, mais je n'ai pas été en mesure de rassembler ou de trouver un travail échantillon de code encore.
Si quelqu'un a des idées, des extraits de code de travail ou des échantillons, je serais heureux de les voir.
Je n'ai pas encore vraiment de code mais voici ce que j'ai:
<script type="text/javascript">
// jQuery
$(document).ready(function() {
$('#area').focus(function() { .. } // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>
PS. J'ai essayé cette ressource mais il semble qu'elle ne fonctionne pas pour une <div>. Peut-être uniquement pour textarea ( Comment déplacer le curseur à la fin de l'entité contenteditable )
contentEditable
travaillais dans des navigateurs non IE o_oRéponses:
Ceci est compatible avec les navigateurs basés sur des standards, mais échouera probablement dans IE. Je le donne comme point de départ. IE ne prend pas en charge la plage DOM.
la source
cursorStart.appendChild(document.createTextNode('\u0002'));
est un remplacement raisonnable que nous pensons. pour le - char. Merci pour le codeCette solution fonctionne dans tous les principaux navigateurs:
saveSelection()
est attaché aux événementsonmouseup
etonkeyup
du div et enregistre la sélection dans la variablesavedRange
.restoreSelection()
est attaché à l'onfocus
événement du div et resélectionne la sélection enregistrée danssavedRange
.Cela fonctionne parfaitement à moins que vous ne souhaitiez que la sélection soit restaurée lorsque l'utilisateur clique sur le div également (ce qui est un peu peu intuitif car normalement vous vous attendez à ce que le curseur aille là où vous cliquez mais le code inclus pour l'exhaustivité)
Pour ce faire, les événements
onclick
etonmousedown
sont annulés par la fonctioncancelEvent()
qui est une fonction de navigateur croisé pour annuler l'événement. LacancelEvent()
fonction exécute également larestoreSelection()
fonction car lorsque l'événement de clic est annulé, le div ne reçoit pas le focus et par conséquent rien n'est sélectionné du tout à moins que cette fonction ne soit exécutée.La variable
isInFocus
stocke si elle est dans le focus et est remplacée par "false"onblur
et "true"onfocus
. Cela permet d'annuler les événements de clic uniquement si le div n'est pas sélectionné (sinon vous ne pourrez pas du tout modifier la sélection).Si vous souhaitez que la sélection soit modifiée lorsque le div est focalisé par un clic, et ne pas restaurer la sélection
onclick
(et uniquement lorsque le focus est donné à l'élément par programme en utilisantdocument.getElementById("area").focus();
ou similaire, supprimez simplement les événementsonclick
etonmousedown
. L'onblur
événement et les fonctionsonDivBlur()
etcancelEvent()
peut également être retiré en toute sécurité dans ces circonstances.Ce code devrait fonctionner s'il est déposé directement dans le corps d'une page html si vous souhaitez le tester rapidement:
la source
if (window.getSelection)...
testera pas seulement si le navigateur prend en chargegetSelection
, pas s'il y a ou non une sélection?getSelection
API standard ou l'anciennedocument.selection
API utilisée par les anciennes versions d'IE. L'getRangeAt (0)
appel ultérieur sera renvoyénull
s'il n'y a pas de sélection, ce qui est vérifié dans la fonction de restauration.else if (document.createRange)
) est ce que je regarde. Il ne sera appelé que s'ilwindow.getSelection
n'existe pas, mais utilise encorewindow.getSelection
window.getSelection
mais pasdocument.createRange
- ce qui signifie que le deuxième bloc ne serait jamais utilisé ...Mettre à jour
J'ai écrit une gamme de navigateurs et une bibliothèque de sélection appelée Rangy qui intègre une version améliorée du code que j'ai publié ci-dessous. Vous pouvez utiliser le module de sauvegarde et de restauration de sélection pour cette question particulière, même si je serais tenté d'utiliser quelque chose comme la réponse de @Nico Burns si vous ne faites rien d'autre avec des sélections dans votre projet et que vous n'avez pas besoin de la majeure partie d'un bibliothèque.
Réponse précédente
Vous pouvez utiliser IERange ( http://code.google.com/p/ierange/ ) pour convertir la TextRange d'IE en quelque chose comme une plage DOM et l'utiliser en conjonction avec quelque chose comme le point de départ de l'illiduité. Personnellement, je n'utiliserais que les algorithmes d'IERange qui effectuent les conversions Range <-> TextRange plutôt que d'utiliser le tout. Et l'objet de sélection d'IE n'a pas les propriétés focusNode et anchorNode, mais vous devriez pouvoir utiliser simplement le Range / TextRange obtenu à partir de la sélection à la place.Je pourrais mettre quelque chose ensemble pour faire ceci, posterai de nouveau ici si et quand je le fais.
ÉDITER:
J'ai créé une démo d'un script qui fait cela. Cela fonctionne dans tout ce que j'ai essayé jusqu'à présent, à l'exception d'un bogue dans Opera 9, que je n'ai pas encore eu le temps d'examiner. Les navigateurs avec lesquels il fonctionne sont IE 5.5, 6 et 7, Chrome 2, Firefox 2, 3 et 3.5 et Safari 4, tous sous Windows.
http://www.timdown.co.uk/code/selections/
Notez que les sélections peuvent être effectuées à l'envers dans les navigateurs de sorte que le nœud de focus soit au début de la sélection et appuyer sur la touche curseur droite ou gauche déplacera le curseur vers une position par rapport au début de la sélection. Je ne pense pas qu'il soit possible de reproduire cela lors de la restauration d'une sélection, donc le nœud de focus est toujours à la fin de la sélection.
J'écrirai ceci complètement à un moment donné bientôt.la source
J'ai eu une situation connexe, où j'avais spécifiquement besoin de définir la position du curseur sur la fin d'un div contenteditable. Je ne voulais pas utiliser une bibliothèque à part entière comme Rangy, et de nombreuses solutions étaient beaucoup trop lourdes.
En fin de compte, j'ai créé cette simple fonction jQuery pour définir la position carat à la fin d'un div contenteditable:
La théorie est simple: ajoutez une plage à la fin de la variable modifiable, sélectionnez-la, puis supprimez la plage - nous laissant avec un curseur à la fin de la division. Vous pouvez adapter cette solution pour insérer la travée où vous le souhaitez, plaçant ainsi le curseur à un endroit précis.
L'utilisation est simple:
C'est tout!
la source
<span>
, ce qui cassera accidentellement la pile d'annulation intégrée du navigateur. Voir stackoverflow.com/a/4238971/96100J'ai pris la réponse de Nico Burns et l'ai faite en utilisant jQuery:
div contentEditable="true"
Vous aurez besoin de jQuery 1.6 ou supérieur:
Afficher l'extrait de code
la source
Après avoir joué, j'ai modifié la réponse de eyelidlessness ci-dessus et en ai fait un plugin jQuery afin que vous puissiez simplement faire l'un de ceux-ci:
Excusez le long code postal, mais cela peut aider quelqu'un:
la source
Vous pouvez tirer parti de selectNodeContents qui est pris en charge par les navigateurs modernes.
la source
Dans Firefox, vous pouvez avoir le texte du div dans un nœud enfant (
o_div.childNodes[0]
)la source