この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2013年8月)

2013年8月31日

Bug-org 903715 Using keyboard to select value in <select> with enter key ends up submitting form when it didn't use to
初回投稿日時: 2013年08月31日11時42分28秒
カテゴリ: Events Mozilla Core Mozilla25 Mozilla26 バグ修正
SNS: (list)

Bug-org 501496の修正によるregressionで、<select>要素でドロップダウンを開いている時に、Enterキーで閉じた際、changeイベントのハンドラで、<input>にフォーカスを移動させると、その<input>要素上でkeypressイベントが発生し、これがフォームを送信してしまう、というバグです。

25以降では、Geckoでも、DOM keydownイベントで、preventDefault()を呼び出すと、keypressイベントは発生しなくなりました。このため、元のバグで、<select>要素の操作を、keypressイベントから、keydownイベントにタイミング変更を行いました。これは、keydownイベントでpreventDefault()が呼び出されても、操作ができないとセキュリティ的にも、ユーザビリティ的にも問題があるからです。

この変更によって、意図しないイベントの順序変更が発生していました。従来は、

  1. keydown
  2. keypress
  3. change

だったのですが、変更後は他のWindowsのブラウザと同じく、

  1. keydown
  2. change
  3. keypress

となっていました。WibKit/BlinkのMac版では、前者の順序というあたりが話がややこしいのですが。

それはさておき、<select>要素のドロップダウンをキーで閉じる、という操作を行った場合に、ユーザはそれ以上、何らかのアクションが発生するとは、考えていないはずです。ですので、ドロップダウンが閉じられた場合には、シンプルに、keydownイベントのpreventDefault()を呼び出すように変更しました。この方が、IEや、Windows版Blinkに合わせるよりも、従来のGeckoの動作に近く、ユーザの期待にも近いと考えたためです。このため、イベントの発生は以下のように変わっています。

  1. keydown
  2. change

つまり、フォーカス移動後の<input>要素で、keypressイベントが発生しなくなっています。

関連するかもしれないエントリ

bug-org 903715を含むエントリ