获取选中文字所在的元素?如果跨多个元素呢?

获取选中文字所在的元素?如果跨多个元素呢?

在 JavaScript 中获取选中文字所在的元素可以通过 window.getSelection()​ 方法来实现。此方法返回一个 Selection​ 对象,该对象提供了有关当前文档中选定文本的信息。

如果选中的文本跨越了多个元素,可以通过 Selection​ 对象的 getRangeAt()​ 方法来获取选定范围的信息。getRangeAt()​ 方法返回一个 Range​ 对象,该对象描述了选定文本的范围。

下面是一个详细的示例,展示了如何获取选中文字所在的元素,包括跨越多个元素的情况:

示例代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>获取选中文字所在的元素</title>
</head>
<body>

<p id="p1">选择一些文本来试试看。</p>
<p id="p2">这段文本也是可以被选中的。</p>
<p id="p3">最后一段文本。</p>

<script>
    document.addEventListener('mouseup', function() {
        var selection = window.getSelection();
    
        if (selection.rangeCount > 0) {
            var range = selection.getRangeAt(0);
        
            // 获取选中范围的起点和终点所在的元素
            var startContainer = range.startContainer.parentElement;
            var endContainer = range.endContainer.parentElement;
        
            console.log("起点元素:", startContainer);
            console.log("终点元素:", endContainer);
        
            // 如果选中的范围跨越了多个元素
            if (startContainer !== endContainer) {
                console.log("选中的文本跨越了多个元素");
            }
        
            // 获取所有包含选中文本的元素
            var allElements = [];
            var currentElement = range.startContainer.parentElement;
            while (currentElement !== null) {
                if (allElements.includes(currentElement)) break; // 防止无限循环
                allElements.push(currentElement);
                currentElement = currentElement.nextElementSibling;
            }
        
            console.log("所有包含选中文本的元素:", allElements);
        }
    });
</script>
</body>
</html>

解释:

  1. HTML 部分

    • 页面中有三个 <p>​ 标签,用户可以选择其中的文本。
  2. JavaScript 部分

    • 监听 mouseup​ 事件,这是用户完成文本选择的标志。
    • 获取当前的 Selection​ 对象。
    • 检查 selection.rangeCount​ 是否大于 0,以确保有选定的范围。
    • 使用 selection.getRangeAt(0)​ 获取选定的第一个范围。
    • 获取选中范围的起点和终点所在的元素。
    • 如果起点元素和终点元素不同,说明选中的文本跨越了多个元素。
    • 使用循环遍历所有包含选中文本的元素,并将它们存储在一个数组中。

获取所有包含选中文本的元素

在上述代码中,我们使用了一个循环来遍历所有包含选中文本的元素。这种方法适用于大多数情况,但在极端情况下(例如非常复杂的 DOM 结构),可能会遇到性能问题或陷入无限循环。因此,确保在实际应用中进行适当的测试和优化。

处理跨越多个元素的情况

如果选中的文本跨越了多个元素,可以通过检查 startContainer​ 和 endContainer​ 是否属于同一个元素来判断。如果它们不属于同一个元素,那么就可以认为选中的文本跨越了多个元素。

总结

通过上述方法,你可以获取选中文本所在的元素,并且处理跨越多个元素的情况。这种方法适用于大多数常见的网页布局和文本选择场景。

image.png

留下你的脚步
推荐阅读