2 回答
TA贡献1833条经验 获得超4个赞
TA贡献1828条经验 获得超3个赞
默认行为取决于浏览器,因此您需要进行一些检查才能给出一致的结果。
这是一个简单的示例,它将event.target
元素与parentElement
返回的文本节点的进行比较selection.focusNode
,如果不匹配,它会检查焦点节点的兄弟节点是否匹配并相应地调整偏移量。
您需要使其更加稳健。您还需要处理方向性(从左到右选择会产生反向焦点,并且选择从右到左的锚节点)。您也可以看看Selection.containsNode()
function handleSelection(e) {
const selection = window.getSelection();
const fNode = selection.focusNode;
const fElement = fNode.parentElement;
const tElement = e.target;
let word_index = tElement.dataset.index;
let char_index = selection.focusOffset;
if (!fElement.isEqualNode(tElement)
&& fElement.nextElementSibling.isEqualNode(tElement)) {
char_index=0;
}
console.log(
'fNode: ', fNode.parentElement.innerText,
' tNode: ', tElement.innerText,
' char: ', char_index,
' word: ', word_index
);
}
const words = document.querySelectorAll('.word');
words.forEach((w, i) => (
w.dataset.index = i+1,
w.addEventListener('click', handleSelection)));
.word {
border: 1px solid gray;
font-size: 2rem;
}
<p class="sentence">
<span class="word">Hello </span><span class="word">wonderful</span><span class="word"> world.</span>
</p>
添加回答
举报