Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2009-11-04

02:23

疑問が解決したのでちゃんと書きました。→DOM3 Eventsのキーイベント - JavaScriptで遊ぶよ - g:javascript


keyIdentifier が DOM3 Events から無くなることになりました。

新しく event.key というプロパティができて、ほぼ event.keyIdentifier と同じになります。

唯一の大きな変更は、keyIdentifier では U+xxxx だったところが \uxxxx となるらしいのですが、ここのところがよくわかりません。

character value

In the context of key values, a character value is a string representing a single Unicode character, such as a letter or symbol, as a UTF-16 character escape (e.g. '\u0041' for the Latin Capital Letter A key, A.).

http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#glossary-character-value

これはつまり \u0041 と書いてあるけども、event.key === 'A' ということでいいのでしょうか? event.key === '\\u0041' ではなくて。


メーリングリストでも、

I really really don’t see the benefit of that change. It only 
complicates things because it looks similar to a JS-string encoded 
character but is not actually one. I.e., "\u2018" does not equal 
"\\u2018". By introducing a backslash, I can already see people getting 
confused by this, writing:

   if (event.key == "\u2018")

instead of

   if (event.key == "\\u2018")

I know I often forget to double-escape the backslash (especially when I 
write regular expressions in strings :)), and then scratch my head over 
why it doesn’t work.
Re: Changes to DOM3 Events Key Identifiers from Laurens Holst on 2009-10-30 (www-dom@w3.org from October to December 2009)

とか、

> The "\uxxxx" syntax is just reminiscent of a programming language
> but has little to do with strings returned from DOM APIs. I suppose
> you could argue that it's useful in some situations, but my concern
> is more about the existence of 2 things that mean the same
> thing.

"\uxxxx" is not a syntax, it is a Unicode string of the actual  
character. \u introduces the escape sequence for a unicode code point.  
So you can compare it directly to a character.
Re: Changes to DOM3 Events Key Identifiers from Maciej Stachowiak on 2009-10-30 (www-dom@w3.org from October to December 2009)

とか書いてあって、たぶん全員がわかってるわけじゃないと思います。(僕もわかりません)

たぶん Maciej さんが書いてるほう (event.key === 'A') が正しいと思うのですが…

だとすれば、 Backspace や Tab を判定する時はやっぱり、

if (event.key === '\u0008') { // Backspace
  //
} else if (event.key === '\u0009'){ // Tab
  //
}

みたいなふうになるのでしょうか? これだったらコードの可読性は上がらないですよね。

SVG Tiny で勧告されている keyIdentifier との互換性を捨てて作るにしては利点が小さい気がするんですよねぇ。

どうなんでしょう。


ついでなので、

issue のところに書いてありますが、サロゲートペアの問題があります。

つまり、

Unicode code point

A Unicode code point is a unique hexadecimal number signifying a character by its index in the Unicode codespace (or library of characters). In the context of key values, a Unicode code point is expressed as a string in the format "\u" followed by a hexadecimal character index in the range 0000 to 10FFFF, using at least four digits. See also character value.

http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#glossary-unicode-code-point

とあるので、「𣧂」は "\u0239c2" とすることになってしまいます。でも JavaScript では '𣧂' !== "\u0239c2" です。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20091104
 |