今さら感全開です。
に触発されて昔、移植したものを中途半端に公開します。
雑用系
nagatonさんのスクリプトをベースにSleipnirでも動くようにしてみたつもりです。
プヨぷよ氏のGoogleAutoPager+にも一応対応しているはずです。
キーバインド
- j:フォーカスを進める
- k:フォーカスを戻す
- r:手動で検索件数を取得
ダメなところ
- GoogleAutoPagerの読み込みより速くjを連打すると追加読み込み分にフォーカスできない。
- スクロールが汚い。
- jを一回打鍵するとスクロール位置にかかわらず一番はじめからフォーカスしていく。
1に関してはrで読み込み直すかゆっくりと適当にjやkを押してたらとりあえず戻りますorz
2に関してははてなみたいにフォーカスするリンクを一番上にスクロールさせるのが個人的にいやだったので100だけ押されるごとにスクロールさせるようにしたのがだめっぽい。モニタとかフォントサイズに依存してると思うのでスクロール量は要調整。
3ホイールスクロールとかで下の方までスクロールさせた状態でjを打鍵すると一気にふりだしに戻ってしまうのがイマイチ。ここをはてなみたいに現在のビュー内の一番上にきているリンクにフォーカスするようにしたいけど実現方法が全く思い浮かばず。ヘルプミー
やりたいこと
- はてなみたいにPinを立ててまとめて開く。
以下ソース
// ==UserScript== // @name Google_jk // @namespace original By nagaton http://d.hatena.ne.jp/nagaton/ // @description LDRやはてブ風にj/kでフォーカス移動。 // @include http://www.google.*/search* // @version 1.00 2007/08/02 // ==/UserScript== (function() { var current = -1; var links = 0; function getElementsByClassName(oElm, strTagName, strClassName){ //どこからかを忘れてしまいましたが頂ものの関数です。感謝。 var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName); var arrReturnElements = new Array(); strClassName = strClassName.replace(/\-/g, "\\-"); var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)"); var oElement; for(var i=0; i<arrElements.length; i++){ oElement = arrElements[i]; if(oRegExp.test(oElement.className)){ arrReturnElements.push(oElement); } } return (arrReturnElements) } function get_links() { links = getElementsByClassName(document, "a","l"); } // End of get_links function get_links_alert() { links = getElementsByClassName(document, "a","l"); alert(links.length); } // End of get_links_alert get_links(); var listeners = { 'j' : focusNext, 'k' : focusPrev, 'r' : get_links_alert } function focusNext() { if (++current > links.length - 1) get_links(); select(); } function focusPrev() { if (--current < 0) current = links.length - 1; select(); } function select() { var link = links[current]; // link.parentNode.scrollIntoView(false); link.parentNode.scrollIntoView(true); window.scrollBy(0, -100); if (current == 0) window.scrollBy(0, -100); link.focus(); } document.attachEvent( 'onkeypress', function(event) { var target = event.srcElement; if (target.nodeName != 'INPUT' || target.type != 'text') { var f = listeners[String.fromCharCode(event.keyCode)]; if (f) f(); } }, false); })();