Uses the Gamepad API. I found it very easy to work with, in large part thanks to the corresponding MDN docs.
The only weird part about the Gamepad API is that you have to poll it rather than handling events the way you normally would for other, similar stuff in JavaScript. In practice, this means that you have to do your own debouncing for handling things like key combos, but that doesn't really affect individual button presses too much.