I use the method shown in this answer to expand the selection of a webpage to the word boundary:
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 trailing space(s), // if necessary while (/\s$/.test(textRange.text)) { textRange.moveEnd("character", -1); } textRange.select(); } } }
So far so good. But if you call the snapSelectionToWord function more than once to choose from, it expands outward by one word in both directions with each call, which is not very good if you want to call it more than once when choosing text.
Here's a live jsFiddle example that allows you to repeatedly press the "Snap" button, which demonstrates the problem.
How can I fix the original solution so that it does not expand the selection if it is already at the word boundary?
- I would prefer to leave a comment on the original solution , but, unfortunately, I was not yet decorated with enough karma by the StackOverflow career team - otherwise, I would just ask there. And I'm not sure how to fix the problem, so I will not edit the original solution.
Edit: add code snippet for request
source share