You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript从点击坐标获取含ruby标签文本的目标字符

问题描述

原本为每个字符添加<span>并绑定onClick事件的方法,在处理包含<ruby>、加粗等嵌套标签的文本时会失效。比如下面的HTML代码:

<p>
    <ruby>漆黒<rt>しっこく</rt></ruby>の<ruby>闇<rt>やみ</rt></ruby>だった。
</p>

当前使用的JavaScript代码会直接移除<p>标签内的所有嵌套标签,将内容转换成纯文本:<p>漆黒しっこくの闇やみだった。</p>,代码如下:

document.querySelectorAll('p').forEach(el => {
    let elContent = el['innerText'];
    let characters = el['innerText'].split('');
    el.innerHTML = '';
    characters.forEach(char => {
        let span = document.createElement('span');
        span.innerText = char;
        span.addEventListener('click', function () {
            let position = 0;
             let el = this;
             while (el.previousSibling !== null) {
                 position++;
                 el = el.previousSibling;
             }
             console.log(elContent + ' : ' + this.innerHTML + ' : ' + position);
        });
        el.appendChild(span);
    });
});

现在想确认:能不能仅通过屏幕点击坐标(如下方代码中的event.clientX和event.clientY)获取对应位置的文本字符?

function click(event) {
  console.log("x:" + event.clientX + "y:" + event.clientY)
  // 如何获取点击坐标对应的文本字符(假设确实点击到了文字)
}

document.addEventListener("click", click);

补充说明:已知可以用Range实现,但认为这并非Range的设计用途,且精度不足,对应的代码示例如下:

document.onclick = (evt) => {
  const sel = getSelection();
  if (sel.rangeCount) {
    const range = sel.getRangeAt(0);
    const targetedNode = range.startContainer;
    const clickedLetter = targetedNode.textContent.substr(range.startOffset, 1);
    console.log(clickedLetter);
  }
};

内容的提问来源于stack exchange,提问作者Noah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:36:00