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
を無視するのは、セキュリティに関わる部分です。例えば、開いたパネルやメニューが閉じることができなくなると問題ですので、このあたりは他の処理結果を無視して、強引に動作するようになっています。