Hm, that didn't change anything, unfortunately; still the same behavior.
A couple small things I discovered though:
1) Since I'm getting synchronously (3rd argument in get() is "false"), it's not necessary to define a function for onreadystatechange; I can just put the code in ajaxDone() right after the send() line.
2) alert(req.responseText) -- the responseText is there, it just had so much whitespace that the alert box was stretching down below the window and the text was out of view. If I trim the response text, the alert box shows it just fine.