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の犯行の動機が分からなくなってきた。なんでそんなことをしたんだろう?