代码之家  ›  专栏  ›  技术社区  ›  Calvin

Dojo dnd:化身定位

  •  4
  • Calvin  · 技术社区  · 16 年前

    是否可以使用dojo toolkit的DNDAPI更改化身的位置?此时,当拖动时,被拖动项目的化身出现在鼠标光标的右侧和下方。我希望它与鼠标光标处于相同的位置。我在我的应用程序上运行了一些可用性测试,大多数人似乎试图尝试将化身拖到放置区域,而不是将光标移动到放置区域上。任何输入都很好。谢谢

    1 回复  |  直到 16 年前
        1
  •  6
  •   Eugene Lazutkin    16 年前

    对不起,由于技术原因不可能。

    更新:根据大众需求,以下是技术原因:

    • 当鼠标正下方有一个节点时,该节点将获取所有鼠标事件。
    • 现在,假设您使用鼠标移动此节点-此节点将始终获取所有鼠标事件。

    但我知道其他人也能做到!这应该是可能的!是的,这是可能的……原则上:

    • 让我们注册所有目标节点。
    • 让我们直接在最顶端的父对象(文档)上捕获相关的鼠标移动事件。
    • 当我们检测到拖动操作时,让我们执行以下操作:
      1. 计算所有目标的几何图形(边界框)。
      2. 如果当前鼠标位置与目标重叠,让我们启动“可能放下”操作,例如,显示一些提示,以便最终用户知道她现在可以放下。

    为什么Dojo不这么做?出于一些技术原因(我们终于做到了!):

    • 众所周知,在大多数浏览器中,节点的几何计算存在缺陷。一旦涉及到表或任何其他非平凡的放置方式,您就无法100%确保边界框是正确的。
    • 几何体计算是一项昂贵的操作,我们必须在所有目标的每次拖动操作中至少进行一次,前提是在拖动操作期间不能进行任何更改(并非总是如此)。浏览器可能会因多种原因回流节点,因为它可以移动/调整现有目标的大小,因此我们必须保持警惕。
    • 通常,计算框保存在一个列表中,检查交叉点列表是否为O(n)(线性)不会随着目标数量的增加而扩展。
    • 所有鼠标事件处理程序都应该快速,否则浏览器的鼠标事件处理功能可能会“损坏”,导致不可预知的副作用。有关鼠标事件处理可能较慢的原因,请参见前面的几点。
    • 改进线性搜索是可能的,例如,可以使用2D空间树,但这会导致更多(更多)JavaScript代码,更多的东西需要在客户端下载,这通常是不值得的。

    当前实现不使用鼠标移动事件,也不计算几何体。相反,它依赖于目标在开始拖动后检测到的鼠标移动/移出事件。它工作可靠,伸缩性好。

    这个故事中的另一个缺点是:Dojo将目标视为容器——这是一个非常常见的用例(购物车、重新排列项目、编辑层次结构)。线性容器和通用树目前已经实现,定制容器是可能的。拖放时,您可以在目标容器内的适当位置看到并拖放拖动的项目,例如,将它们插入现有项目之间。使用几何计算和检查实现此功能的成本将高得令人望而却步。