【问题标题】:HTML: Text in block-element; get exact position of clickHTML:块元素中的文本;获取点击的确切位置
【发布时间】:2014-05-23 14:17:34
【问题描述】:

我现在需要 where 在一个仅包含文本的 html 块元素中发生点击:

<div>This is some awesome text</div>

我想获得被点击的字母的位置。 限制:无法向 div 添加其他子项。

有什么选择吗?

【问题讨论】:

  • 您忘记发布您尝试过但不起作用的 JavaScript。
  • @j08691 我还没有尝试过任何东西 - 我想知道如何做到这一点。而谷歌没有提供任何结果。在 mouseclick-handler 中,我只获得鼠标的位置,并且我知道哪个元素发出了事件(在我的情况下,到目前为止是 div) - 但仍然不知道与文本相关的确切位置。
  • @TimDown 感谢这个解决方案 - 范围是我要走的路。感谢您向我展示 contenteditable

标签: javascript html dom jquery-click-event


【解决方案1】:

感谢@TimDown,我采用的解决方案取自Mozilla

function insertBreakAtPoint(e) {

var range;
var textNode;
var offset;

if (document.caretPositionFromPoint) {    // standard
    range = document.caretPositionFromPoint(e.pageX, e.pageY);
    textNode = range.offsetNode;
    offset = range.offset;

} else if (document.caretRangeFromPoint) {    // WebKit
    range = document.caretRangeFromPoint(e.pageX, e.pageY);
    textNode = range.startContainer;
    offset = range.startOffset;
}

// do whatever you want here!
}

有一个限制(至少我在 Chromium 中有一个小问题)range.textNode 不一定与单击的那个相同。包含的文本可能比预期的要短。其原因仍然未知。 我只是通过 range.textNode.parentElement.firstChild 进行访问,因为在我的情况下 div 只有一个孩子。

【讨论】:

【解决方案2】:

减去当前元素的偏移量得到点击相对于该元素的位置(fiddle):

$(function () {
    $("#awesome").click(function (event) {
      var div = $(this);  
      var posX = event.pageX - div.offset().left;
      var posY = event.pageY - div.offset().top;

      alert("X: " + posX + " Y: " + posY);
    });
});

您必须进行其他计算才能确定点击了哪个字母。

【讨论】:

  • 这实际上并没有解决问题——这可能是一个有用的步骤,但是“渲染”(CSS)字符串长度的计算是有问题的。
  • 在如何遵循这种方法方面做了一些工作 - 第一个选择是使用等宽字体(相当限制)或使用 Canvas2D 计算实际字体大小(可能不是很有效)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2015-06-16
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
相关资源
最近更新 更多