Sto usando la tecnica mostrata in this answer per estendere la selezione di una pagina web per un limite di parola:Come estendere la selezione al limite della parola utilizzando JavaScript, una sola volta?
function snapSelectionToWord() {
var sel;
// Check for existence of window.getSelection() and that it has a
// modify() method. IE 9 has both selection APIs but no modify() method.
if (window.getSelection && (sel = window.getSelection()).modify) {
sel = window.getSelection();
if (!sel.isCollapsed) {
// Detect if selection is backwards
var range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
var backwards = range.collapsed;
range.detach();
// modify() works on the focus of the selection
var endNode = sel.focusNode, endOffset = sel.focusOffset;
sel.collapse(sel.anchorNode, sel.anchorOffset);
if (backwards) {
sel.modify("move", "forward", "word");
sel.extend(endNode, endOffset);
sel.modify("extend", "backward", "word");
} else {
sel.modify("move", "backward", "word");
sel.extend(endNode, endOffset);
sel.modify("extend", "forward", "word");
}
}
} else if ((sel = document.selection) && sel.type != "Control") {
var textRange = sel.createRange();
if (textRange.text) {
textRange.expand("word");
// Move the end back to not include the word's trailing space(s),
// if necessary
while (/\s$/.test(textRange.text)) {
textRange.moveEnd("character", -1);
}
textRange.select();
}
}
}
Fin qui, tutto bene. Ma se chiami la funzione snapSelectionToWord
più di una volta sulla selezione, è espansa verso l'esterno di una parola in entrambe le direzioni su ogni chiamata, il che non va bene se vuoi chiamarlo più di una volta mentre il testo è selezionato.
Ecco uno live jsFiddle example che consente di fare ripetutamente clic su un pulsante 'Snap', che dimostra il problema.
In che modo è possibile correggere la soluzione originale in modo che non espanda la selezione se si trova già su un limite di parole?
- Preferirei lasciare un commento sul original solution ma, purtroppo, non ho ancora stato abbellito con sufficiente karma karma vigili StackOverflow - altrimenti, avevo appena chiedere lì. E non sono sicuro di come risolvere il problema, quindi non modificherò la soluzione originale.
Edit: L'aggiunta di frammento di codice per richiesta
Si prega di inserire tutto il codice rilevante in questo post, invece di collegare ad esso. –
Fatto. Ancora imparando l'etichetta StackOverflow. – Inactivist
Ho aggiornato la soluzione originale con il cambiamento di Matt M. –