IEは悪くないと思うんだけど。

気になるのでもう少し調べました。

function logEvent( observingEventType,  useCapture, event ) {
    var s = "";
    s += " expectedType=" + observingEventType;
    s += " actualType=" + event.type;
    s += " useCapture=" + useCapture;
    s += " ";
    s += " keyCode=" + event.keyCode;
    s += " charCode=" + event.charCode;
    s += " which=" + event.which;
    var logArea = $("logArea");
    logArea.value = logArea.value + "\n" + s;
}

function observeEvent(field, observingEventType, useCapture) {
    Event.observe(field, observingEventType, function(event) {
        logEvent(observingEventType, useCapture, event);
    }, useCapture);
}

function attachEvent(field, observingEventType, useCapture) {
    if (field.attachEvent)
        field.attachEvent("on" + observingEventType, function(event) {
            logEvent(observingEventType, useCapture, event);
        });
    else
        observeEvent(field, observingEventType, useCapture);
}

window.onload = function() {
    var observed = $("observed");
    attachEvent(observed, "keypress", true);
    attachEvent(observed, "keypress", false);
    observeEvent(observed, "keydown", true);
    observeEvent(observed, "keydown", false);
    observeEvent(observed, "keyup", true);
    observeEvent(observed, "keyup", false);
}

という風にコードをちょっと直してkeypressに関してのみ自前でattachEventメソッドを呼び出すように変更してみた。

そしたら結果は以下のとおり。

 expectedType=keydown actualType=keydown useCapture=false  keyCode=65 charCode=undefined which=undefined
 expectedType=keydown actualType=keydown useCapture=true  keyCode=65 charCode=undefined which=undefined
 expectedType=keypress actualType=keypress useCapture=false  keyCode=97 charCode=undefined which=undefined
 expectedType=keypress actualType=keypress useCapture=true  keyCode=97 charCode=undefined which=undefined
 expectedType=keyup actualType=keyup useCapture=false  keyCode=65 charCode=undefined which=undefined
 expectedType=keyup actualType=keyup useCapture=true  keyCode=65 charCode=undefined which=undefined

useCaptureは全く無視されているので気にしない。結局ちゃんとkeydown -> keypress -> keyupの順に呼び出されている。ますますprototype.jsの犯行の動機が分からなくなってきた。なんでそんなことをしたんだろう?