Mon application nécessite une utilisation intensive des plages (https://developer.mozilla.org/en/DOM/range). En particulier, les utilisateurs mettent fréquemment le texte en surbrillance puis le manipulent. Parfois, les utilisateurs mettent accidentellement en surbrillance un texte contenant un fragment de mot, ce qui produit des résultats bizarres. J'aimerais pouvoir, en fonction d'une plage, vérifier si elle commence ou se termine au milieu d'un mot, puis, si c'est le cas, l'agrandir pour qu'elle comprenne le mot entier qu'elle a commencé/terminé au milieu de.Assurez-vous qu'un objet range ne commence pas ou ne se termine pas au milieu d'un mot
Répondre
Je n'ai pas travaillé avec des plages, mais il semble que la surbrillance doit commencer immédiatement après un caractère espace blanc et se terminer immédiatement avant un caractère espace blanc. Vous auriez à écrire une fonction qui effectue cet événement check onmouseup. La réponse à cette fonction devrait être une auto-correction de la surbrillance à l'endroit où elle devrait être, à la fin d'un mot. Je voudrais également le faire fonctionner au début d'une mise en évidence afin qu'un utilisateur puisse cliquer au milieu d'un mot et avoir la surbrillance correcte pour capturer depuis le début du mot afin d'augmenter l'accessibilité pour les utilisateurs avec des interfaces avec des troubles du mouvement. Vous souhaiterez également vous assurer que les caractères espace blanc sont définis en utilisant la méthode de test par rapport à une variable regex de:
/\s+/
Que pensez-vous de cela? Kinda hacky, mais je l'ai testé dans Firefox et il a semblé fonctionner. Peut-être qu'il va vous aider à démarrer:
function fixRange(range)
{
var rangeString = range.toString();
try
{
while (rangeString[0] != " ")
{
range.setStart(range.startContainer, range.startOffset - 1);
rangeString = range.toString();
}
range.setStart(range.startContainer, range.startOffset + 1);
} catch (e) {}
try
{
while (rangeString[rangeString.length - 1] != " ")
{
range.setEnd(range.endContainer, range.endOffset + 1);
rangeString = range.toString();
}
range.setEnd(range.endContainer, range.endOffset - 1);
} catch (e) {}
return range;
}
Exemple d'utilisation (resélectionne la plage sélectionnée):
var selection = window.getSelection();
selection.addRange(fixRange(selection.getRangeAt(0)));
- 1. La macro EnvironmentEvent ne se termine pas
- 2. MFC DockablePane ne flotte pas ou ne se cache pas
- 3. Ajax timeout mais le côté serveur ne se termine pas
- 4. Le script PHP ne se termine pas lorsqu'il est terminé
- 5. "vertical-align: middle" ne s'aligne pas au milieu dans Firefox
- 6. Le fichier ne commence pas par '% PDF-'
- 7. Log4Net ne se connecte pas ou erreur
- 8. navigationItem.title ne se rafraîchit pas
- 9. DebugBreak ne se casse pas
- 10. App.PrevInstance ne se rafraîchit pas
- 11. ne se soucient pas scanf
- 12. Silverlight ne se charge pas
- 13. VB + IntelliSense ne fonctionne pas (ne se présente pas) + dans les fichiers ASPX ou html
- 14. Contexte fonctionne ne termine pas sur le fil IUG
- 15. Le client Flash XMLSocket ne se connecte pas au serveur
- 16. Services Windows ne se connectant pas au journal des événements
- 17. Pourquoi DataViewManager ne procède pas au tri?
- 18. java - pourquoi graphics.drawString() ne se redessine pas?
- 19. Le rappel getJSON ne se déclenche pas
- 20. PHP n'explose une chaîne que si la ligne ne se termine pas par '!'
- 21. sIFR 2.0: Mon texte sIFR ne se termine pas sur un design liquide
- 22. L'exécution de la fonction d'écriture mysql results-to-csv ne se termine pas en production
- 23. Le modèle d'entité ne se charge pas
- 24. Le processus Windows exécuté à partir de Java ne se termine pas
- 25. Python exception backtrace me dit où la ligne se termine, où commence-t-elle?
- 26. Type.IsSubclassOf ne se comporte pas comme prévu
- 27. jQuery ne se charge pas sur l'iPhone
- 28. Objet d'automatisation InternetExplorer + PerformanceCounter = ne fonctionne pas?
- 29. Les douilles Apache ne se ferment pas?
- 30. Mon code fuit et fonctionne, ou ne fuit pas et ne se bloque pas. Cela ne semble pas être un problème d'autorelease
Ceci est très proche - je devais changer la deuxième 'while' à' (rangeString [rangeString .length - 1]! = "" && rangeString [rangeString.length - 1]! = "\ n") ', et cela fonctionne presque, mais il y a encore un comportement erratique (par exemple, cliquez une fois près de la fin d'une ligne sélectionnez tout avant ce point). –
Oui, j'ai oublié de mentionner que vous devriez également vérifier les sauts de ligne. Peut-être aussi des onglets. Hmm .. N'hésitez pas à poster votre code jusqu'à présent. Nous pouvons y jeter un coup d'oeil. Des sons comme vous pourriez avoir besoin de vérifier une plage réduite (vide) avant d'exécuter ce code? – InvisibleBacon