J'essaie de comprendre le décalage d'une sélection à partir d'un nœud particulier avec JavaScript. p>
Dites que j'ai le suivant HTML P>
<p>Hi there. <a href="#" rel="inserted">This <strong>is blowing</a> my mind</strong> with difficulty.</p>
5 Réponses :
Peut-être que vous pourriez utiliser les sélecteurs jQuery pour ignorer le rel = "INSERTED"?
$('a[rel!=inserted]').doSomething();
J'utilise document.getselection () code> pour obtenir l'objet de sélection. C'est une idée soignée, mais je dois toujours faire des choses avec ces nœuds, je dois juste les supprimer du calcul.
Vérifiez simplement si votre élément sélectionné est un paragraphe, et si vous n'utilisez pas quelque chose comme l'élément de prototype d'Element.Up () pour sélectionner le premier parent du paragraphe.
Par exemple: P>
if(selected_element.nodeName != 'P') {
parent_paragraph = $(selected_element).up('p');
}
Je ne suis pas sûr de suivre. Comment voyez-vous le «décalage de texte» d'un élément de donner à son parent. Dans mon exemple, comment trouver le texte décalé du premier au début du premier caractère au p.
Qu'est-ce que ce compensé signifie réellement? Un décalage dans le Je recommande vivement d'utiliser la prise en charge intégrée du navigateur pour cela sous la forme de DOM Gamme . Vous pouvez obtenir une gamme de la plage représentant la sélection actuelle comme suit: P> innerhtml code> d'un élément va être extrêmement fragile: toute insertion d'un nouveau nœud ou modifier à un attribut d'un élément précédant le point du document que le décalage représente va faire valoir que Décalseal invalide. var range = window.getSelection().getRangeAt(0);
Je conviens que la plage est la voie à suivre sur le côté JavaScript. La principale chose est que j'ai besoin d'extraire les données et de le stocker dans une base de données, puis de recréer la plage sur les charges suivantes. Après avoir examiné la documentation de la plage, je n'ai pas vu de bonne façon de le faire. Des idées? C'est ce que j'essaie de résoudre tout cela. Je ne suis pas défini de manière spécifique.
Je pense que j'ai résolu mon problème. J'ai fini par ne pas calculer le décalage comme je l'ai initialement planifié. Je stocke le "chemin" du morceau (aka code>). Voici le code: var p = document.getElementsByTagName('p')[0];
var piece = nodeAtPathFromChunk(p, "1/0"); // returns desired node
var path = pathToChunk(piece); // returns "1/0"
Vous pouvez utiliser le code JavaScript suivant:
var text = window.getSelection(); var start = text.anchorOffset; alert(start); var end = text.focusOffset - text.anchorOffset; alert(end);
Cela ne fonctionnera pas correctement, comme à l'intérieur du nœud texte.Ranchoroffset retournera décalé à partir du début du nœud actuel, et non du début du nœud racine où nous avons notre texte
Ce n'est pas clair pour moi. Qu'entendez-vous par «J'ai besoin du décalage à partir du
code>"? Voulez-vous dire un décalage dans le contenu du texte du
code> (comme représenté par
innertext code> dans IE outextContent code> dans les autres navigateurs)? Ou un décalage dans une représentation de chaîne du contenu HTML du
code>? Si ce n'est l'un d'entre eux, je suis intéressé de savoir pourquoi: Si vous traitez avec le DOM en tant que nœuds, les objets code> code> obtenus à partir d'une sélection sont parfaitement adéquats à quelque fin que ce soit.
J'ai précisé ci-dessus. La longueur de la chaîne avant la sélection de l'innerhtml de P.
Peut-être que je pourrais faire quelque chose qui traverse les nœuds des parents jusqu'à ce que je reçoive avec le
. Lorsque j'y arrive, je peux suivre le chemin de retour en utilisant
enfantNODES code> et construire la longueur. Il doit y avoir une meilleure façon cependant.C'est pourquoi vous voulez ce genre de décalage particulier qui me puzzle.
Je dois persister la sélection dans une base de données, puis être capable de le charger facilement. Recommanderiez-vous une autre méthode?