on() with a selector is delegation; without one it is not

.on() replaced .bind(), .live() and .delegate() with one method, and the difference between them survives as a single optional argument in the middle. With a selector the handler is delegated; without one it is bound directly, and the two look almost identical at the call site.

// direct: attached to the 40 rows that exist at this moment
$('#orders .delete').on('click', remove);

// delegated: attached to #orders, matched as the click bubbles up
$('#orders').on('click', '.delete', remove);

// unbinding the delegated form needs the selector too
$('#orders').off('click', '.delete');

The delegated version survives an Ajax replacement of the rows and costs one listener instead of forty, which is the usual reason to reach for it. Two details that are not obvious. Inside a delegated handler this is the matched element rather than the container — event.delegateTarget is the container and event.currentTarget is the match, which is the reverse of what the plain DOM names suggest. And delegation depends on bubbling, so it cannot work for events that do not bubble: jQuery quietly maps focus and blur onto focusin and focusout so those appear to work, but load and error on an image genuinely do not.