It is actually not a bug that onchange is not fired until the element loses focus. However, it is annoying. I get around the issue by having multiple bindings for different events; make sure not to clobber a handler and use an update aggregation if appropriate.
Here the "official" W3C documentation on the subject:
http://www.w3.org/TR/REC-html40/interact/scripts.html#h-18.2.3:
"""The onchange event occurs when a control loses the input focus and its value has been modified since gaining focus. This attribute applies to the following elements: INPUT, SELECT, and TEXTAREA."""
Here is the MSDN reference:
http://msdn.microsoft.com/en-us/library/ms536912%28VS.85%29.aspx:
"""This event is fired when the contents are committed and not while the value is changing. For example, on a text box, this event is not fired while the user is typing, but rather when the user commits the change by leaving the text box that has focus."""
The behavior, while often annoying, is as specified.