跳到内容

处理事件

为了交互,选择允许监听和分发事件。

selection.on(typenames, listener, options)

源代码 · 为每个选定元素添加或删除指定事件 typenameslistener

js
d3.selectAll("p").on("click", (event) => console.log(event))

typenames 是一个字符串事件类型,例如 clickmouseoversubmit;您的浏览器支持的任何 DOM 事件类型 都可以使用。该类型可以可选地后跟一个点 (.) 和一个名称;可选名称允许注册多个回调以接收相同类型的事件,例如 click.fooclick.bar。要指定多个类型名,请用空格分隔类型名,例如 input changeclick.foo click.bar

当选定元素上分发指定的事件时,将针对该元素评估指定的 listener,并将当前事件 (event) 和当前数据 (d) 传递给它,其中 this 是当前 DOM 元素 (event.currentTarget)。侦听器始终会看到其元素的最新数据。注意:虽然您可以直接使用 event.pageXevent.pageY,但通常使用 d3.pointer 将事件位置转换为接收该事件的元素的本地坐标系会比较方便。

如果以前在选定元素上为同一个 typename 注册了事件侦听器,则会在添加新侦听器之前删除旧侦听器。要删除侦听器,请将 null 作为 listener 传递。要删除给定名称的所有侦听器,请将 null 作为 listener 传递,并将 .foo 作为 typename 传递,其中 foo 是名称;要删除没有名称的所有侦听器,请将 . 作为 typename 指定。

可选的 options 对象可以指定事件侦听器的特性,例如它是捕获的还是被动的;请参阅 element.addEventListener

如果未指定 listener,则返回当前分配给第一个(非空)选定元素上的指定事件 typename 的侦听器(如果有)。如果指定了多个类型名,则返回第一个匹配的侦听器。

selection.dispatch(type, parameters)

源代码 · 按顺序将指定 type自定义事件 分发到每个选定元素。

js
d3.select("p").dispatch("click")

可以指定一个可选的 parameters 对象来设置事件的附加属性。它可以包含以下字段

  • bubbles - 如果为 true,则将事件按相反的树顺序分发给祖先。
  • cancelable - 如果为 true,则允许 event.preventDefault。
  • detail - 与事件关联的任何自定义数据。

如果 parameters 是一个函数,则会按顺序针对每个选定元素对其进行评估,并将当前数据 (d)、当前索引 (i) 和当前组 (nodes) 传递给它,其中 this 是当前 DOM 元素 (nodes[i])。它必须返回当前元素的参数。

pointer(event, target)

源代码 · 返回一个包含两个数字 [x, y] 的数组,表示相对于指定 target 的指定 event 的坐标。

js
const [x, y] = d3.pointer(event);

event 可以是 MouseEventPointerEventTouch 或一个包含 UIEvent 作为 event.sourceEvent 的自定义事件。

如果未指定 target,则默认情况下它将设置为源事件的 currentTarget 属性(如果可用)。如果 target 是 SVG 元素,则使用 屏幕坐标变换矩阵 来转换事件的坐标。如果 target 是 HTML 元素,则相对于 target边界客户区域矩形 的左上角来转换事件的坐标。(因此,坐标系只能相对于客户坐标进行转换。另请参阅 GeometryUtils。)否则,将返回 [event.pageX, event.pageY]。

pointers(event, target)

源代码 · 返回一个包含 [[x0, y0], [x1, y1]…] 的数组,表示指定 event 的指针位置相对于指定 target 的坐标。

js
const points = d3.pointers(event);

对于触摸事件,返回的位置数组对应于 event.touches 数组;对于其他事件,返回一个单元素数组。

如果未指定 target,则默认情况下它将设置为源事件的 currentTarget 属性(如果可用)。