Googleのラジオボタンをクリックすると検索

外は雪が積もっていたので引きこもることにした。

Greasemonkeyの勉強がてら、AUSGANG SOFTさんで紹介されていたGoogleの言語切り替えのチェックボックス選択で検索されるスクリプトを見ながら作ってみた。これは便利!
Greasemonkey - Google のラジオボタン押したら検索 - AUSGANG SOFT

Dive into greasemonkeyを読んでみたけどevaluateとかなんかよくわからないので$Xというのを使わせてもらった。$Xはブラックボックスで中身が理解できていないけど動いたのでよしとしよう。


$XでDOMをなんか検索して引っかかるのはわかるんだけど、そのオブジェクトの中身がわからなくて試行錯誤になっちゃう。下記のソースだと、frmが配列なのはGM_logしていて気づいた。なんかやり方とか法則?があるのかなぁ。

appendChildとかの振る舞いもよくわからないなぁ。
jashでMouseoverしながら書いていたのだけど、GM_*がshellで使えなかったのでイマイチ不便。エディタで書いてリロードの繰り返しになっちゃう。

あとは、$Xみたいなラッパを使うと良いよ、とかそういうGreasemonkeyを書くときのノウハウがまとまったところがないような気がする。Dive into greasemonkeyは基本的にプリミティブなものしか使っていないサンプルだし。検索の仕方が悪いのだろうか。


// ==UserScript==
// @name           search_global
// @namespace      search_global
// @include        http://www.google.co.jp/search*
// @version        0.1
// Copyright (c) 2008 tittea
// 
// ==/UserScript==

(function() {
	var rdbtn = $X("//input[@id='all']|//input[@id='il']");
	
	var frm = $X("//form[@name='gs']");
	
	GM_log(rdbtn);
	for(var cnt=0;cnt<=1;cnt++){
			rdbtn[cnt].addEventListener('click',function(){
				GM_log("click!");
				frm[0].submit();
			},
			true
			);
	}
	

// thanks cho45 http://lowreal.net/blog/2007/11/17/

// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
    if (typeof context == "function") {
        type    = context;
        context = null;
    }
    if (!context) context = document;
    var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
        var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
        if (o) return o;
        return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
    });

    switch (type) {
        case String:
            return exp.evaluate(
                context,
                XPathResult.STRING_TYPE,
                null
            ).stringValue;
        case Number:
            return exp.evaluate(
                context,
                XPathResult.NUMBER_TYPE,
                null
            ).numberValue;
        case Boolean:
            return exp.evaluate(
                context,
                XPathResult.BOOLEAN_TYPE,
                null
            ).booleanValue;
        case Array:
            var result = exp.evaluate(
                context,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                null
            );
            var ret = [];
            for (var i = 0, len = result.snapshotLength; i < len; i++) {
                ret.push(result.snapshotItem(i));
            }
            return ret;
        case undefined:
            var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
            switch (result.resultType) {
                case XPathResult.STRING_TYPE : return result.stringValue;
                case XPathResult.NUMBER_TYPE : return result.numberValue;
                case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
                case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                    // not ensure the order.
                    var ret = [];
                    var i = null;
                    while (i = result.iterateNext()) {
                        ret.push(i);
                    }
                    return ret;
                }
            }
            return null;
        default:
            throw(TypeError("$X: specified type is not valid type."));
    }
}
})();