optimized on() to save another 18 bytes, web-noie now at 4086bytes