html - 选择所有跨区文本时如何获取元素?
问题描述
在内容可编辑的 div 中,我想用 包围所选文本<span>
,或者在选择其中的所有文本时修改现有<span>
文本。我可以做第一个,但不能做第二个。
在第二种情况下,如果我A<span>B</span>C
选择了 B,则选择显示anchorNode
as A
、focusNode
asC
和toString()
return B
。父节点是封闭段落,而不是<span>
. 我找不到任何方法来区分选择B
inA<span>B</span>C
和 in ABC
,因为我找不到任何方法来发现在第一种情况下<span>
包围的元素的存在。B
肯定有办法做到这一点,对吧?有人可以告诉我该怎么做吗?
这是代码:
var sel = window.getSelection();
var range = sel.getRangeAt(0);
var selected = range.compareBoundaryPoints(range.START_TO_END, range);
if (selected > 0) { // some text is selected
var el = range.commonAncestorContainer;
//
// would expect to find el == <span> if selection is B
// in <p>A<span>B</span>C<p>, but find <p> instead!
//
//... code to surround selection with new span or to process
// existing span... but there is never an existing span!
}
解决方案
Range.commonAncestorContainer有一个名为parentElement的属性。它是所选文本的父级。
在代码片段中,伦敦和巴黎都被一个span元素包裹。
const text = "<p>Hello from <span>London</span> and <span>Paris</span></p>"
const parser = new DOMParser();
const html = parser.parseFromString(text, "text/html").body.innerHTML
const editor = document.querySelector('div[contenteditable]')
editor.innerHTML = html
function getParent() {
var selection = window.getSelection();
if (selection.rangeCount) {
const range = selection.getRangeAt(0);
const parent = range.commonAncestorContainer.parentElement;
document.querySelector("#result").innerText = parent instanceof HTMLSpanElement
if (parent instanceof HTMLSpanElement) {
console.log(parent)
}
}
}
document.querySelector("button").onclick = getParent;
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" />
<div class="container py-5">
<div class="row align-items-center">
<div class="col">
<div class="w-100 p-5 border" contenteditable>
</div>
</div>
<div class="col">
<button class="btn btn-primary">Get Text</button>
</div>
</div>
<div class="row align-items-center">
<div class="col">
<p>Is Is parent instanceof HTMLSpanElement? <span id="result"></span> </p>
</div>
</div>
</div>
推荐阅读
- ios - 如何自定义 SwiftUI SegmentedPicker
- python - OpenCV 文档中的嵌套变量语法应该暗示什么?
- asp.net-core - ASP.NET Core 3.1 SignalR:OnReconnected 方法
- unity3d - 调用 api 并在其后设置数据的统一问题
- javascript - Javascript 1.1 / HTML 3.0 音频播放器
- c - 用c中的另一个临时堆栈对堆栈进行排序会产生分段错误
- laravel - FP_route 上的 Laravel Route 未定义错误
- c# - Winforms DataGridView 无法选择正确的 Id 和 IndexOutOfRangeException
- airflow - 有没有办法知道气流传感器正在进行什么迭代?
- sql - 父子关系错误:关卡的源属性标记为“父”