这是一个无需向文档添加大量跨度即可工作的解决方案(适用于 Webkit 和 Mozilla 以及 IE9+):
https://jsfiddle.net/Vap7C/15/
$(".clickable").click(function(e){
s = window.getSelection();
var range = s.getRangeAt(0);
var node = s.anchorNode;
// Find starting point
while(range.toString().indexOf(' ') != 0) {
range.setStart(node,(range.startOffset -1));
}
range.setStart(node, range.startOffset +1);
// Find ending point
do{
range.setEnd(node,range.endOffset + 1);
}while(range.toString().indexOf(' ') == -1 && range.toString().trim() != '');
// Alert result
var str = range.toString().trim();
alert(str);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p class="clickable">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris rutrum ante nunc. Proin sit amet sem purus. Aliquam malesuada egestas metus, vel ornare purus sollicitudin at. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer porta turpis ut mi pharetra rhoncus. Ut accumsan, leo quis hendrerit luctus, purus nunc suscipit libero, sit amet lacinia turpis neque gravida sapien. Nulla facilisis neque sit amet lacus ornare consectetur non ac massa. In purus quam, imperdiet eget tempor eu, consectetur eget turpis. Curabitur mauris neque, venenatis a sollicitudin consectetur, hendrerit in arcu.
</p>
在 IE8 中,由于 getSelection,它有问题。此链接(是否有 getSelection() 的跨浏览器解决方案?)可能有助于解决这些问题。我还没有在 Opera 上测试过。
我从类似的问题中使用https://jsfiddle.net/Vap7C/1/作为起点。它使用了Selection.modify函数:
s.modify('extend','forward','word');
s.modify('extend','backward','word');
不幸的是,他们并不总能得到完整的信息。作为一种解决方法,我获得了选择范围并添加了两个循环来查找单词边界。第一个不断向单词添加字符,直到它到达一个空格。第二个循环到单词的末尾,直到它到达一个空格。
这也将抓住单词末尾的任何标点符号,因此请确保在需要时将其修剪掉。