Olá.
Pro caso dos outros códigos do onreadystatechange (0,1, 2 e 3), pode acontecer deles retornarem 200 no xhr.status?
Porque caso o 200 seja retornado apenas na ocasião do xhr.readyState == 4, eu poderia remover o if do onreadystatechange e deixar apenas o do status.
[ ]'s