2011-02-22
Firefoxでコンテンツにフォーカスする方法(KeySnail)
KeySnailでj,k,n,mなどをスクロールキーとして利用しているが、「Fast look up JP and EN for Greasemonkey」で検索をした後などに、フォーカスがコンテンツエリアから外れてしまい、スクロールができなくなってしまう。
で、コンテンツエリアにフォーカスさせる方法として下記の2種類の方法で試していたのだけど、うまく機能するときとしないときがあった。
let elem = document.commandDispatcher.focusedElement; if (elem) elem.blur(); gBrowser.focus(); _content.focus();
gBrowser.selectedTab.focus(); content.focus();
しかし、今日どんな場面でも意図通りコンテンツエリアにフォーカスさせることができるようになった。
document.getElementById("searchbar").focus(); document.commandDispatcher.advanceFocus(); document.commandDispatcher.advanceFocus();
やっていることは、まず検索バーにフォーカスしてから、TABキーを2回押す動作をJavascriptで実現している。
1つ目のTABでタブバーがフォーカスされ、2つ目でコンテンツエリアがフォーカスされる。
2010-11-20 LDR Full Feedで全文取得するときに、本文を必ず表示する
livedoor Readerで本文を非表示にしている状態で、gキーかアイコンクリックで全文を取得しても、取得された文章は表示されない。
Greasemonkey, Firefox, JavaScript
記事を読むためにはさらに「本文の表示を切り替える」というアクションが必要で、それがいちいち面倒くさいので、全文取得したときに自動的に本文を表示状態に切り替えるように修正した。
LDR Full Feedのソースを開き928行目と929行目の間に以下のように追加する
変更前
if(!c.found && !PHASE.some(function(i){
log('PHASE: ' + i.type);
変更後
if(!c.found && !PHASE.some(function(i){
/* 全文取得をするとき、常に本文を表示状態に切り替える
LDRで使われている関数はunsafeWindow内でしか使えない */
with(unsafeWindow) {
if (contain($("right_body").className, "compact")) {
toggleClass("right_body", "compact");
}
if (!id) id = get_active_item(true).id;
Control.scroll_to_px($("item_body_" + id).parentNode.offsetTop + 2);
}
log('PHASE: ' + i.type);
11月21日に
if (!id) id = get_active_item(true).id;
を追加した。
なぜか分からないが、はてなダイアリーにアクセスしても記事を書くためのリンクや、過去記事ごとにあったはずの編集するためのリンクが表示されない。
エラーコンソールを見ると、「Hatena is not defined」「Ten is not defined」というエラーが表示されている。
管理画面の過去記事を見ても編集するためのリンクなどが存在しなく、編集ができない状態だったけど、「管理」>「設定」「編集設定」で「編集画面の設定」を「その場編集モード」から「詳細編集モード」に変更したら、ようやく編集するためのリンクが表示されるようになったので、今編集しているところ。
2010-11-15
LDRで本文の表示、非表示をワンクリックで切り替える
Greasemonkey, LDR, Firefox, JavaScript
livedoor Readerで本文の表示・非表示をマウスでワンクリックで切り替える機能を追加する。
HatebuComment on LDRに追加しようと思ったけど、一般的ではないかもしれないので、ソースだけ載せておく。
// 本文の表示非表示を切り替える▼を追加する function byID(id) { return document.getElementById(id); } function EVENT(type) { var event = document.createEvent('MouseEvents'); event.initEvent(type, true, true); return event; } var elem = document.createElement('li'); elem.id = 'toggleContent'; elem.title = '本文の表示 / 非表示の切替'; elem.innerHTML = '▼'; byID("control_buttons_ul").appendChild(elem); byID("toggleContent").addEventListener('click', function() { // まずメニューをポップアップさせる byID("menu_button").dispatchEvent(EVENT('mousedown')); // 次に該当メニューをクリック var elem = document.evaluate( '//span/text()[self::text()="本文の表示 / 非表示の切替"]', document, null, 7, null ); elem.snapshotItem(0).dispatchEvent(EVENT('mouseup')); // メニューを閉じる byID("menu_button").dispatchEvent(EVENT('click')); }, false);
byID("toggleContent").addEventListener('click', function() { // まずメニューをポップアップさせる byID("menu_button").dispatchEvent(EVENT('mousedown')); // 次に該当メニューをクリック var elem = document.evaluate( '//span/text()[self::text()="本文の表示 / 非表示の切替"]', document, null, 7, null ); elem.snapshotItem(0).dispatchEvent(EVENT('mouseup')); // メニューを閉じる byID("menu_button").dispatchEvent(EVENT('click')); }, false); 上記を以下のように変更 $("toggleContent").addEventListener('click', function() { // LDRの関数 Control.compact() }, false);
これに伴い、function byID()やfunction EVENT()は不要となった。
メニューの「その他」の右に▼が追加され、クリックするたびに表示・非表示が切り替わる。
2010-11-04
HatebuComment on LDR改良
Greasemonkey, JavaScript, Firefox
HatebuComment on LDRでコメントを取得した場合、実際にブックマークされている数より、取得できる数が遥かに少ないケースがよくある。
取得に失敗するのはスクリプトのエラーかと思ったけど、はてな公式の拡張機能である「Hatena Bookmark 2.1.1」でもコメントの取得に失敗するケースがある。
さらに、F5でページリロードしたあとに同じ記事でコメントを取得すると正常に取得できる場合もあるので、はてな側でのエラー?のようす。
shift+m(=M)でコメントを再読込するようにしてみたが改善できず。
色々見ていると、はてなのRSSを使ってもコメントを取得できると分かったので、JSONとRSS両方で取得して、コメントが多い方を自動的に表示するようにした。
HatebuComment on LDR for Greasemonkey
あと、マウスで取得する場合の動作も改善。
クリックした記事と実際にコメントの取得を試みる記事がずれるケースを修正した。
さらに、最初の3つぐらいの記事でしかマウスによる取得が機能しないケースもあったので、EventListenerの追加を1000ミリ秒から1500ミリ秒に遅らせてみた。
使用方法は同じだが、スクリプトのソースは大幅に変更した。
2010-09-29
Gmail Macrosをリメイクしたので公開。
Greasemonkey, JavaScript, Firefox
Gmailに独自ショートカットキーを設定できる「Gmail Macros」。
オリジナルは数年前に更新が終了していて、現在は動作しないので、リメイクしてみた。
きっかけは最近フィルタを追加してメールの自動振り分けを細かくしたこと。新たなラベルに振り分けるようにしたのだけど、ラベルに移動することが面倒になってしまった。
Gmail Macrosなら、"g"を押すと「Go to label」のポップアップが表示され、次に"i"と入力すれば受信トレイに移動できる("i"から始まるラベルを作っていない場合)。
これは標準の機能と同じだけど、標準では移動できない迷惑メールフォルダには"sp"で、ゴミ箱には"t"で移動できる(これも同じ頭文字で始まるラベルがない場合)。
もちろん、自分で作成したラベルにも移動できるし、クイックリンクにも同じ動作で移動できる。あまり使わない気もするけど、設定画面の各ページにも"set:Label"などで移動できるようにした。
他には、"Q"を押すと、現在表示している状態のクイックリンクを作成するポップアップが表示される。
"r"を押すと、未読メールなら既読に、既読メールなら未読に、同じキーで変更できる(これはメール一覧の状態の動作で、メールを閲覧しているときに"r"を押すと標準の「返信」として機能する)。
"d"を押すと、迷惑メールやゴミ箱の場合は「完全に削除」、下書きの場合は「破棄」、その他の場合は「既読にして削除」という処理を行う。
"l(小文字のエル)"を押すと、"g"の「Go to label」と同じ方法でラベルを付けたりラベルを外す事ができる。存在しないラベルを入力したら、そのラベルが新規作成されて適用される。
ラベルへの移動はGmailのLabsにある「ラベル ショートカット」でも可能だけど、「Go to label」の方が使いやすいはず。
全部で20個以上のショートカットキーを初期設定しているし、もちろん独自にマクロを追加することもできる。
あと、"f-a"といった複合キー(fを押したあとaを押すと動作する)も設定可能。ただし、その場合"f"単独キーの動作は設定できなくなる。