This code looks okay, though there are many numerousam excessive amount of DOM lookups. It would be wise to cache those, since they can be expensive.
”...DOM access is actually pretty costly - I think of it like if I have a bridge - like two pieces of land with a toll bridge, and the JavaScript engine is on one side, and the DOM is on the other, and every time I want to access the DOM from the JavaScript engine, I have to pay that toll”
- John Hrvatin, Microsoft, MIX09, in this talk Building High Performance Web Applications and Sites at 29:38, also cited in the O'Reilly Javascript book by Nicholas C Zakas Pg 36, as well as mentioned in this post
In events the keys need not be string literals... e.g.
const events = [ { type: 'click', selector: '.start-button', handler: quiz.start, }, using ecmascript-6 features, variables can be swapped with destructuring assignment without the need for a temporary variable - so shuffleArray() can be greatly simplified - also using the prefix decrement operator.
