2008-03-06、Google Reader が地味にアップデートした。
このアップデートと前後して、キーボード・ショートカット系に不具合が報告されている。一つは、ショートカットが利かなくなるというもの。もう一つは、Greasemonkey 系のショートカットが働かなくなるというもの。
ショートカットが利かなくなる
これは、Google Groups で報告されているバグ。
firefox では、中クリックでリンク先を別タブ・バックグラウンドに開くことが出来る。今回のバグは、その中クリックを実行すると、キーボード・ショートカット全般が利かなくなってしまうというもの。
対処方法は簡単。ウィンドウのどこかをもう一度クリックする。
簡単な対処ではあるけれど、一手間増えるということで嫌がられている。
Google 側は、この問題を認識しており、2008-03-10 に「修正中」とのコメントを寄せている。
Greasemonkey のショートカットが利かなくなる
ぼくが作ってる Greasemonkey で、ショートカット・キーが利かなくなってる。特に、「y キーで記事を別タブ・バックグラウンドに開く」Greasemonkey スクリプトで修正して欲しいとのコメントを頂いた (Adhoc 修正版をアップ済)。
- clmemo@aka: Google Reader で新しいタブを開く Greasemonkey スクリプト
- clmemo@aka: Google Reader で新しいタブを開く Greasemonkey (旧版)
これは、Google Reader の HTML ソースが変更になったといふ類の問題ではない (さふなら、どれほどよかったことか!)。JavaScript 回りの変更が原因。少しソースを見てみませう。
ぼくの、キーボード・ショートカット回りのソース・コードは下記の通り。
function GRT_key(event) { alert("foo"); element = event.target; elementName = element.nodeName.toLowerCase(); if (elementName == "input") { typing = (element.type == "text" || element.type == "password"); } else { typing = (elementName == "textarea"); } if (typing) return true; if (String.fromCharCode(event.which)=="y" && !event.ctrlKey) { // ココにショートカットで呼び出す関数名を書く _gm_open_original_in_tab(); try { event.preventDefault(); } catch (e) { } return false; } return true; } document.addEventListener("keypress", GRT_key, false);
addEventListener() を使って、keypress がある度に関数 GRT_key()
を呼び出している。GRT_key()
は、まずキーがテキスト・エリアで入力されたかどうかを検出する。Google Reader の場合、検索窓で入力されたかどうかをチェックしている。で、検索窓への入力なら、無視。何もしない。そうでないなら、入力文字をチェックして対応する関数を呼び出す。かういふ仕組み。
さて、関数 GRT_key()
の一行目に alert()
が置いてある。これはデバッグ用のコード。キー入力があるたびに、「foo」とメッセージ・ボックスが出ることを期待している。このコードを入れたまま、このスクリプトを実行してみると何の反応もなかった。どうやら、keypress イベントそのものが、Google Reader に喰い潰されてしまっている。このせいで、キーボード・ショートカットが利かなくなった。
ちなみに、シフト・キーを押しながら文字を入力すると、keypress イベントが呼ばれる。Google Reader が何をしたいのかよく分からない。
閑話休題。
Ad hoc な対処だけど、keypress イベントじゃなくて keyup イベントを使うやうにした。つまり、サンプル・コードの一番下を
document.addEventListener("keypress", GRT_key, false);
から
document.addEventListener("keyup", GRT_key, false);
に変更する。
すると、keyup イベントが送られる。だけど、これで解決ではない。
String.fromCharCode(event.which)
が何故か大文字に変換される。なので、「小文字の y」と比較しても、true にならない。これを修正するために、「小文字の y」を「大文字の Y」に変えた。
以上。
まだ残る課題
今回の対処法だと、小文字と大文字で呼び出す関数を切り替えられない。例えば、拙 Greasemonkey「Google Reader SBM」では、「b キーではてなブックマーク、B キーで livedoor clip」にブックマーク出来る仕様にしてある。
今回の Ad hoc な対策だと、このスクリプトは救済出来ない。
で、現在、どうしやうかと悩み中。誰か、よいアイデアがあればコメント・トラックバック下さい m(_ _)m。
No comments:
Post a Comment