Events usually bubble from a nested target through its ancestors. A listener on a list can therefore handle actions from many rows, including rows inserted after the listener was created. The target may be a span inside the button, so find the nearest intended action with closest before reading its identifier. Check that the result belongs to the delegated container. You'll route separate actions, insert new controls, and remove exactly one owning row. Duplicate names are deliberate. Removing by display text can remove the wrong record or several records, while a stable id keeps the action tied to its row.