Hatena::ブログ(Diary)

実験と娯楽

2010-04-11

FormMemorize フォームの値を記憶するGreasemonkeyスクリプト

formmemorize.user.js

仕事でRedmineを使っていて、大量のチケットを上げる時に、いちいちTarget VersionだのWatchersだのを入力するのが面倒すぎて、書いたやつ。

ユーザスクリプトコマンドで「FormMemorize」っていうのを選ぶと、その時のフォームの値がURLとセットでGM_setValueされて、次からその画面を開いたときに、保存されている値が反映されます。

単純にフォーム要素の出現順で保存してるだけなので、要素が増えたりすると普通にズレます。

クッキーでやればChromeでも使えそうとか、いろいろあるけど、とりあえず。

// ==UserScript==
// @name           FormMemorize
// @namespace      http://d.hatena.ne.jp/adda/
// @include        *
// @version        2010.3.18
// ==/UserScript==

var targets = [
    {
        xpath: '//select',
        attr: 'selectedIndex'
    },
    {
        xpath: '//input[@type="checkbox" or @type="radio"]',
        attr: 'checked'
    },
    {
        xpath: '//textarea | //input[@type="text"]',
        attr: 'value'
    },
]

var memories = eval(GM_getValue("formValues")) || {};
var currentURL = document.location.href;

for(url in memories){
    if(url != currentURL) continue;
    targets.forEach(function(target){
        var attr = target.attr;
        memories[url][attr].forEach(function(value, i){
            $x(target.xpath)[i][attr] = value || null;
        })
    })
}

GM_registerMenuCommand('FormMemorize', function(){
    memories[currentURL] = getFormValues();
    GM_setValue("formValues", uneval(memories));
})

function getFormValues(){
    var result = {};
    targets.forEach(function(target){
        var attr = target.attr;
        result[attr] = $x(target.xpath).map(function(element){
            return element[attr];
        })
    })
    return result;
}

function $x(xpath, doc) {
    var nodes = document.evaluate(xpath, doc||document, null, 
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    var data = [];
    for (var i = 0, len = nodes.snapshotLength; i < len; i++) {
          data.push(nodes.snapshotItem(i));
    }
    return data;
}

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/adda/20100411/1270990474