【问题标题】:Custom text editor layout engine in javascriptjavascript中的自定义文本编辑器布局引擎
【发布时间】:2013-07-02 04:33:51
【问题描述】:

我正在用 javascript 构建一个自定义输入字段。 (即使用内容可编辑、输入、文本区域或 iframe)。

我需要它来支持 textarea 字段中的基本选项,例如:

  • 鼠标点击光标位置
  • 选择
  • 复制/粘贴
    ...

此时我正在侦听底层输入字段上的按键。 当一个键被按下时:
1.键String.fromCharCode(event.keyCode)的值被传递给一个tmp span。
2. 测量跨度的宽度,并存储在一个数组中。
3. 插入符号的位置是使用大小数组计算的

这在 chrome 中或多或少有效,但在使用 internet explorer 9 时,插入符号似乎偏离了位置。

似乎是单个容器的容器宽度,与该字符插入字符串时的宽度不匹配。

我猜这与步骤 2 中字母大小的计算方式有关。但我不太清楚如何解决这个问题。

有没有人有这个问题的经验,或者用一些文献、博客 API 等为我指明正确的方向? - 那太好了!

编辑: Here is a link to what i've got so far;

注意:在 chrome 中工作,并且在 ie: 9 和 10 中有提到的缺陷 它在Firefox中坏了:)

【问题讨论】:

  • 您确定除了计算插入符号的位置之外没有其他方法可以放置插入符号吗?你为什么不写一些代码?例如,您的 DOM 看起来如何?
  • 一些脏代码的链接已附加到原始帖子中。'您还建议使用哪些其他方式来定位插入符号

标签: javascript cross-browser layout-engine


【解决方案1】:

如果你想知道每个字符在字段中的位置可以尝试获取前面子串的宽度:

var text = $content.text(),
    positions = [0],
    $ghost = $("<span class='ghost'>").appendTo($content);
for (var i = 1; i < text.length; i++) {
    $ghost.text(text.substring(0, i));
    positions.push($ghost.width());
}
$ghost.remove();

这是您需要的 CSS:

.ghost {
    visibility: hidden;
    position: absolute;
    bottom: 0;
    right: 0;
}

请记住,每次获取元素的大小时,都会导致文档重排。不过,对于绝对定位的元素来说,这应该不是问题。

【讨论】:

  • 这不能回答问题,我正在寻找的是一种确定 ie 中字符大小的方法。如果我寻求您的解决方案,我将无法进行鼠标交互,因为我不知道在哪里放置插入符号。
  • @TauSand 如果您不详细发布您想做的事情,请不要指望完美的答案。请记住,由于浮点精度大小的舍入,测量单个字符不能精确。用户交互根本不容易复制。这就是 Web 开发人员使用 &lt;input&gt; 字段或最多使用 contenteditable 元素的原因。
  • 是的,我知道你用浮点数去哪里了。我尝试在屏幕上添加几个 l,发现连续四个 l 需要的像素比单个 l 少一个。然而,在 chrome 中,尺寸是正确的,可能是因为它对每个字符都有一个 int px,或者可能是因为我对我使用的尺寸很幸运?是否可以强制字体的宽度为精确整数?也许使用 css?
  • @TauSand 不幸的是,这完全由浏览器控制。您可以做的最好的事情是从开头而不是单个字符开始计算整个子字符串的女巫,以减少近似值的影响。我已经更改了答案以说明这项技术。
  • 感谢您的尝试,我试了一下实际的实现,但它在字符数超过 40 个时效果不佳。并且扼杀了实时感觉。我知道这是可以做到的,因为来自 google docs 的 google 团队做到了,我只是想知道怎么做。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
相关资源
最近更新 更多