Bug-org 501496 preventDefault on keydown does not cancel following keypress
初回投稿日時: 2013-07-29 20:14:50
カテゴリ: Events Google Chrome IE Mac Mozilla Core Mozilla25 Safari Windows バグ修正
SNS:
Tweet (list)
Geckoでは、keydownイベントのpreventDefault()を呼び出しても、続いて、keypressイベントが発生する、というバグです。
Gecko 24までは、keydownイベントが消費された場合、defaultPreventedをtrueに設定して、keypressイベントを発火していました。
しかし、IE、Safari、Chromeではこの場合、keypressイベント自体が発火されません。
D3Eの仕様では、keydownイベントのデフォルトアクションに、keypressイベントが含まれていますので、Gecko以外のブラウザの動作が正しいことが明白です。
このため、今回の修正を行うことにしました。これにより、Webサイトや、Webアプリが影響を受けることはほとんどないと思います。なぜなら、他のブラウザの動作に合わせた修正だからです。
これに対して、FirefoxやThunderbirdのキー処理、アドオンのキー処理は、Geckoのこれまでの動作を前提に書かれている可能性がありますが、その場合、regressionが発生する可能性があります。
この修正により、regressionが発生する条件は、
keypressイベントがdefaultPrevented属性値を確認していない(常に動作する)- Webコンテンツも含め、
keydownイベントがpreventDefault()を呼んでいる
というものになります。つまり、他の部分の処理に関係無く、強引に処理が行われる、keypressイベントハンドラがなければ、regressionは発生しません。
regressionが出た場合、その対処方法は、keypressイベントハンドラでkeyCode値を検査していたものはkeydownイベントハンドラで処理するようにする。
それ以外の、charCodeを見ているものに関しては、keydownイベントハンドラに移動できませんので、そのまま、動作しない形が好ましいと私は思います。なぜなら、他のイベントハンドラが、デフォルトアクションをキャンセルしているのですから、アドオンも含めたブラウザのデフォルトアクションは実行されるべきではありません。
ちなみに、Gecko内で、defaultPreventedを無視するのは、セキュリティに関わる部分です。例えば、開いたパネルやメニューが閉じることができなくなると問題ですので、このあたりは他の処理結果を無視して、強引に動作するようになっています。