Skip to content


Dispatching is a low-level interaction mechanism that allows you to register named callbacks and then call them with arbitrary arguments. A variety of D3 interaction components, such as d3-drag, use dispatch to emit events to listeners. Think of this as EventTarget except every listener has a well-defined name so it’s easy to remove or replace them.

For example, to create a dispatch for start and end events:

const dispatch = d3.dispatch("start", "end");

You can then register callbacks for these events using dispatch.on:

dispatch.on("start", callback1);
dispatch.on("", callback2);
dispatch.on("end", callback3);

Then, you can invoke all the start callbacks using or dispatch.apply:


Like, you may also specify the this context and any arguments:

js"start", {about: "I am a context object"}, "I am an argument");


Source · Creates a new dispatch for the specified event types. Each type is a string, such as "start" or "end".

dispatch.on(typenames, callback)

Source · Adds, removes or gets the callback for the specified typenames. If a callback function is specified, it is registered for the specified (fully-qualified) typenames. If a callback was already registered for the given typenames, the existing callback is removed before the new callback is added.

The specified typenames is a string, such as start or The type may be optionally followed by a period (.) and a name; the optional name allows multiple callbacks to be registered to receive events of the same type, such as and To specify multiple typenames, separate typenames with spaces, such as start end or

To remove all callbacks for a given name foo, say dispatch.on(".foo", null).

If callback is not specified, returns the current callback for the specified typenames, if any. If multiple typenames are specified, the first matching callback is returned.


Source · Returns a copy of this dispatch object. Changes to this dispatch do not affect the returned copy and vice versa., that, ...arguments)

Source · Like, invokes each registered callback for the specified type, passing the callback the specified ...argument, with that as the this context. See dispatch.apply for more information.

dispatch.apply(type, that, arguments)

Source · Like function.apply, invokes each registered callback for the specified type, passing the callback the specified arguments, with that as the this context. For example, if you wanted to dispatch your custom callbacks after handling a native click event, while preserving the current this context and arguments, you could say:

selection.on("click", function() {
  dispatch.apply("custom", this, arguments);

You can pass whatever arguments you want to callbacks; most commonly, you might create an object that represents an event, or pass the current datum (d) and index (i). See and function.apply for further information.