一昨日公開した Gmail のラベルにチェックボックスをつける Greasemonkey。いくつかバグがあったので修正した。
修正項目:
- チェックボックスからチェックを外すと、検索ボックスから「label:ラベル」が削除されるようにした。
- 検索ボックスの横に を表示。ボタンを押すとラベルの横にチェックボックスを付けるようにした。
バグを潰したつもりですが、これで如何でしょう > typester さん ;)
「チェックボックスからチェックを外しても「label:ラベル」が追加される」問題について
Version 0.1 では、チェックボックスをクリックした時に次のコードを書いていた。
checkbox.setAttribute("onClick","document.getElementById('s').firstChild.value+='label:"+label+" '");
これでチェックボックスをクリックする度に label:LABEL を検索ボックスに追加する。このコードだとチェックを外そうとチェックを外すためにチェックボックスをクリックしても label:LABEL が追加される。ここで、チェックを外した時に検索ボックスの中にある label:LABEL を削除するためには、簡単な条件分岐を書けばよい。ただ、そういった処理は (簡単ではあっても) 一行に押しこめるのは難しい。関数を書くべきでせう。例えばこんな感じに。
function _gcl_toggle_checkbox (label) { ... } .... checkbox.setAttribute("onClick","_gcl_toggle_checkbox('"+label+"')");
それで最初そのようなコードを書いたのだけど、動かなかった。仕方がないので、バグのあるままコードをリリース。
リリース後、この原因を調べた。
日々の流転さんの記事に詳しくあるので引用。
原因はと言うと、GreaseMonkey 0.6.4 ではセキュリティのために XPCNativeWrapper を使うようになったため、onclick等のプロパティを使えなくなっていたこと。まあ、onclickなんてもとより非標準のAPIだし、標準のaddEventListenerに移行するいい機会だと思う。
そこでコードを次のように直して、無事条件分岐を含む関数が書けたとさ。
function _gcl_toggle_checkbox (label) { ... } .... checkbox.addEventListener("click",function(){_gcl_toggle_checkbox(this.value);},true);
見事にハマったので、メモ。
「「ラベル」部分を折り畳んで開くとチェックボックスが消える」「左上の「Gmail」ロゴをクリックするとチェックボックスが消えることがある」問題について
どうも Gmail は、「ラベル」部分を折り畳んで開くたびに「ラベル」と書かれた領域を再描画しているらしい。だから、Gmail の画面を開いた時に一度だけチェックボックスを書くだけではダメで、ラベル部分を開く度にチェックボックスを加える必要がある。
また、Gmail は定期的にメールの着信を確かめている。そしてメールが届いてて、そのメールに「@aka」ラベルがつくようにフィルター設定していると、自動的にラベル部分が「@aka (1)」という風に変わる。つまり、メールの定期チェックの度にラベル部分は再描画されている。この再描画、メールが届いていない場合でも実行されている。だから、少しの間放っておくと Gmail のラベル部分からチェックボックスが消えてしまう。
「左上の「Gmail」ロゴをクリックするとチェックボックスが消えることがある」と書いたけど、これは受信メールの定期チェックの時にロゴを押してしまって、そう感じたんじゃないかと思う。
この問題については、チェックが行われたらチェックボックスを追加すればいい。
困ったのは、どういうコードを書けば上に書いたようなことが実現できるのか皆目見当がつかないこと。もし分かる方、いらっしゃいましたら、パッチなり、アドバイスなり、コメントなり、頂ければ幸いです。
それで、チェックボックスが消えてしまった場合、ページを再描画すれば (Greasemonkey 君が頑張って) チェックボックスが現れる。ただ、それは処理が重いし、Ajax らしくない。ので、検索ボックスの横に を置くことにした。ボタンを押すと、チェックボックス追加用の関数が呼ばれる仕組。これが、今のぼくの限界 (;_;)。ごめんなさい。
No comments:
Post a Comment