2010-05-13 6 views
0

J'ai un peu de code qui retourne le texte d'une sélection et je peux assigner cette chaîne à une variable, mais maintenant j'ai besoin de deux variables, une pour le texte avant la sélection et une pour le texte après la sélection. Voici le code pour obtenir la sélection:Javascript: Je peux obtenir le texte d'une sélection, comment puis-je obtenir le texte en dehors de la sélection?

function findSelection(){ //returns the selection object. 
    var userSelection; 
    if (window.getSelection) {userSelection = window.getSelection();} // Mozilla Selection object. 
     else if (document.selection){userSelection = document.selection.createRange();} //gets Microsoft Text Range, should be second b/c Opera has poor support for it. 
    if (userSelection.text){return userSelection.text} //for Microsoft Objects. 
     else {return userSelection} //For Mozilla Objects. 
    } 

Puis-je trouver les positions pour trouver les carets anchorOffset et focusOffset. J'ai essayé de les utiliser pour modifier un objet de gamme, comme ceci:

var range = document.createRange(); 
range.setStart(textdiv,0); 
range.setEnd(textdiv,5); 

textdiv est une variable qui contient la dernière div l'utilisateur a cliqué sur. Le problème est firefox me donne juste un "Security error" code: "1000" à la ligne range.setStart(textdiv,0);.

Existe-t-il un moyen plus facile de faire cela? J'ai vraiment juste besoin du texte et rien de plus.

+0

Cette fonction 'findSelection' est défectueuse, comme je l'ai expliqué dans mon (apparemment ignoré) réponse à votre question sur ce morceau de code: http://stackoverflow.com/questions/2820650/javascript-functions-return-lines-of-function-code-or-national-code-what-am/2825473#2825473 –

Répondre

-1

est ici une expression pour la première valeur (version non-Evil-Empire uniquement):

window.getSelection().anchorNode.textContent.substring(0, 
       window.getSelection().anchorOffset) 
+0

C'est OK si le 'anchorNode' est un nœud de texte, mais si le' anchorNode' est un élément (ce qui pourrait bien être le cas) 'anchorOffset' sera un décalage de nœud plutôt qu'un décalage de caractère, donc cela donnera soit une erreur soit une erreur valeur. –

-1

Les réponses se trouvent dans la documentation pour les DOM Range. Il y a le spec officiel, ou si vous préférez, il y a un MDN article.

Le problème est que votre code tente de définir les limites de début et de fin de la plage au 0e et au 5e nœud enfant du div respectivement. Si vous devez travailler sur des décalages de caractères dans le texte, vous devez travailler avec des nœuds de texte. En supposant que votre textdiv contient un nœud de texte unique, vous pouvez faire quelque chose comme ce qui suit pour les navigateurs non-IE:

var textNode = textdiv.firstChild; 
range.setStart(textNode, 0); 
range.setEnd(textNode, 0); 

Dans les anciennes versions d'IE (< = 8), il n'y a pas de plage DOM et vous ll doit utiliser TextRange propriétaire d'IE à la place. seulement pour le cas spécifique d'un élément contenant un nœud de texte unique, cela devrait fonctionner:

var range = document.body.createTextRange(); 
range.moveToElementText(textdiv); 
range.collapse(); 
range.moveStart("character", 0); 
range.moveEnd("character", 5); 
0
//returns the selection object. 
function findSelection(){ 
    var userSelection; 
    if (window.getSelection) { 
    userSelection = window.getSelection(); 
    } // Mozilla Selection object. 
    else if (document.selection){ 
    userSelection = document.selection.createRange(); 
    } //gets Microsoft Text Range, should be second b/c Opera has poor support for it. 
    if (userSelection.text){ 
    return userSelection.text 
    } //for Microsoft Objects. 
    else { 
    return userSelection 
    } //For Mozilla Objects. 
} 

//get strings before and after selection 
function getOuterRange(selection) { 
    var rangeBefore = document.createRange(); 
    var rangeAfter = document.createRange(); 
    var r = selection.getRangeAt(0); 

    rangeBefore.setStart(r.startContainer,0); 
    rangeBefore.setEnd(r.startContainer,r.startOffset); 

    rangeAfter.setStart(r.endContainer,r.endOffset); 
    rangeAfter.setEnd(r.endContainer,r.endContainer.length); 

    return { 
    before: rangeBefore.toString(), 
    after: rangeAfter.toString() 
    } 
} 

console.log(getOuterRange(findSelection())); 
Questions connexes