Googleの検索結果をjkで

今さら感全開です。
に触発されて昔、移植したものを中途半端に公開します。

雑用系
nagatonさんのスクリプトをベースにSleipnirでも動くようにしてみたつもりです。

プヨぷよ氏のGoogleAutoPager+にも一応対応しているはずです。

キーバインド

  • j:フォーカスを進める
  • k:フォーカスを戻す
  • r:手動で検索件数を取得

ダメなところ

  1. GoogleAutoPagerの読み込みより速くjを連打すると追加読み込み分にフォーカスできない。
  2. スクロールが汚い。
  3. 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);
})();