【问题标题】:How to get a selection.range before mousedown event?如何在 mousedown 事件之前获取 selection.range?
【发布时间】:2012-12-14 21:34:46
【问题描述】:

我不明白为什么我无法获得正确的范围对象。我很难解释这个问题。

例如:我有五个 div,每个 div 包含一个短语。从逻辑上讲,如果我在其中一个 div 中触发 mousedown 事件,我可以获得事件目标。好的,这是基本的。

但是,如果我在 mousedown 事件上使用范围对象,则事件目标始终是我点击的,但 range.startContainer 指向前一个 div;

看看这个fiddle


 1 LineLineLine
 2 LineLineLineLineLine
 3 LineLineLineLine
 4 LineLineLine
 5 LineLineLineLine

重现问题的步骤(参见控制台):

  1. 在第一行按住鼠标按钮(控制台说“未定义”[*]
  2. 松开鼠标按钮(Range 现在安全地指向第一行)
  3. 在第四行按住鼠标按钮(控制台说“第一行”)
  4. 控制台显示上一个点击的行

[*] 未定义,因为文档没有范围 然而,但这无关紧要,因为我可以在飞行中创建一个并将他注入到文档中。

我可以推断出mousedown事件是在范围之前执行的..还是没有?

【问题讨论】:

  • 只是一个问题:您的目标是检测选择了哪一行?
  • 显然不是:D。我想在 mousedown 上获得正确的范围
  • 那么,您想在这里做什么,只是确认在正确检测到范围之前触发了 mousedown?
  • 不,我只想在鼠标按下时获得正确的“行范围”
  • 显然是的,范围是在鼠标按下 之后创建的。你不能只使用 mouseup 吗?

标签: javascript jquery selection jquery-events rangy


【解决方案1】:

我不认为你可以在 mousedown 上获得正确的范围,触发器比范围检测更快。你可以使用 mouseup (demo):

$("div.line").mouseup(setPos);

或者添加一个小延迟(demo):

$("div.line").mousedown(function() {
    setTimeout(setPos, 4);
});

【讨论】:

  • 感谢 setTimeout 的想法。你认为这种“方式”会导致一些问题吗?像多重触发或类似的东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多