2010-12-07 35 views
0

J'essaie d'obtenir la position du curseur pour un texte à l'intérieur d'un iframe en mode design, dans IE8. Le code que j'ai fonctionne, mais pour les textes longs, il fonctionne mal et moche, car il sélectionne tout le texte, puis commence à déplacer la fin de la plage d'un caractère à la fois.IE: Existe-t-il un moyen rapide d'obtenir la position du curseur dans une iframe sur designMode?

Je me demande s'il existe un moyen plus rapide et plus élégant d'obtenir la position actuelle du curseur dans IE? voici mon code actuel:

var r = doc.selection.createRange(); 
r.collapse(false); 
doc.execCommand("SelectAll") //this is ugly.. 
var r2 = doc.selection.createRange(); 
r2.select(); 
//..and this is slow 
while (r.compareEndPoints("EndToEnd", r2) < 0) { 
    r2.moveEnd("character", -1) 
    r2.select(); 
} 
pos = r2.text.length; 
+0

Cela ressemble à comment je l'ai fait dans le passé. Pardon. L'édition de texte est un cauchemar. – mwilcox

+0

@mwilcox: J'ai fait beaucoup de travail pour que ce soit moins un cauchemar. Vois ma réponse. –

Répondre

3

Oui, vous pouvez utiliser ma bibliothèque Rangy, ce qui vous donne un moyen simple de le faire dans tous les navigateurs utilisant l'interface DOM Level 2 Range. Ce qui suit suppose que vous avez window objet de l'iframe stocké dans une variable appelée iframeWin:

var sel = rangy.getSelection(iframeWin); 
if (sel.rangeCount > 0) { 
    var selectedRange = sel.getRangeAt(0); 
    alert(selectedRange.toString()); 
} 

Le processus utilisé pour convertir TextRange objets d'IE en objets DOM Range dans Rangy est plus sophistiqué et beaucoup plus rapide (pour les documents longs, au moins) que ce que vous avez déjà. Si vous êtes intéressé, le code approprié est près du haut de ce fichier: http://code.google.com/p/rangy/source/browse/trunk/src/js/core/wrappedrange.js

+0

C'est vraiment cool. Résout ceci et d'éventuels futurs problèmes à la fois. Merci. – rodbv

+0

Génial Tim. Si jamais j'ai besoin de faire ce travail encore, je vais être sûr de vérifier cela. – mwilcox