6
votes

Calcul de la sélection de texte compensations dans les éléments de nid en JavaScript

Le problème

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 commentaires

Ce n'est pas clair pour moi. Qu'entendez-vous par «J'ai besoin du décalage à partir du

"? Voulez-vous dire un décalage dans le contenu du texte du

(comme représenté par innertext dans IE ou textContent dans les autres navigateurs)? Ou un décalage dans une représentation de chaîne du contenu HTML du

? 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 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 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?


5 Réponses :


-3
votes

Peut-être que vous pourriez utiliser les sélecteurs jQuery pour ignorer le rel = "INSERTED"?

$('a[rel!=inserted]').doSomething();


1 commentaires

J'utilise document.getselection () 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.



-1
votes

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');
}


1 commentaires

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.



3
votes

Qu'est-ce que ce compensé signifie réellement? Un décalage dans le 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.

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>

var range = window.getSelection().getRangeAt(0);


1 commentaires

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.



4
votes

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"


0 commentaires

0
votes

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);


1 commentaires

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