承認これくしょん

my black histories

IEでフォームの入力内容を保存して自動入力できるようにしたい

定型業務とかテストとかで、Webアプリのフォームに何度も同じ内容を入力する機会があると思う。これを保存しておいて自動入力できるようにしたい。
IEのアドオン開発は敷居が高そうだけど、右クリック時のコンテキストメニューは簡単に編集できるらしい。これを使ってみよう。

コンテキストメニューの編集

こんな感じでregファイルを作ってレジストリに登録する。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\フォームの内容をブックマークレットに保存(&B)]
"Contexts"=dword:00000001
@="D:\\Works\\MenuExt\\main.html"

規定値に実行するhtmlのパスを、Contextsは規定の0x1にしておく。
画像や文字列と言った選択中のオブジェクトの種類を指定して表示条件を設定できるそうだ。

htmlの作成

このhtmlは画面上には表示されないし、新規タブにも現れない。
しかしscriptタグ内の処理は実行されるので、ここにロジックを書けばOK。

<script language="JScript">
var shell = new ActiveXObject('WScript.Shell');
var fso = new ActiveXObject('Scripting.FileSystemObject');
// ブックマークレットの保存先(ユーザーのお気に入りフォルダ)
var path = shell.SpecialFolders('Favorites') + '\\';

var oDocument = window.external.menuArguments.document;
var script = getBookmarklet(oDocument);
if (script) {
   var name = oDocument.title || oDocument.location.href.replace(/.+\//, '');
   saveBookmarklet(script, name, path);
   alert('ブックマークレットを保存しました。');
} else {
   alert('名称つきフォームが存在しないか、保存可能な値が入力された項目が存在しません。');
}

shell = null;
fso = null;

function getBookmarklet(document) {
   var script = 'javascript:(function (a){for(var b in a)for(var c in a[b])document.forms[b].elements[c].value=a[b][c]})(';
   var outerScript = '';
   for (var i = 0; i < document.forms.length; i++) {
       if (document.forms[i].name != '[object HTMLInputElement]' && document.forms[i].name != '') {
           outerScript && (outerScript += ',');
           var innerScript = '';
           for (var j = 0; j < document.forms[i].elements.length; j++) {
               if (document.forms[i].elements[j].name
                   && document.forms[i].elements[j].type != 'hidden'
                   && document.forms[i].elements[j].type != 'file'
                   && document.forms[i].elements[j].type != 'submit'
                   && document.forms[i].elements[j].type != 'image'
                   && document.forms[i].elements[j].type != 'reset'
                   && document.forms[i].elements[j].type != 'button'
                   && document.forms[i].elements[j].value != '') {
                       innerScript && (innerScript += ',');
                       innerScript += document.forms[i].elements[j].name + ':"' + document.forms[i].elements[j].value + '"';
                   }
           }
           outerScript += innerScript ? '{' + document.forms[i].name + ':{' + innerScript + '}' : '';
       }
   }
   script += outerScript + '});'
   return outerScript ? script : '';
}

function saveBookmarklet(script, name, path) {
   fso.FolderExists(path) || fso.CreateFolder(path);
   if (!fso.FileExists(path + name + '.url')) {
       var sc = shell.CreateShortcut(path + name + '.url');
   } else {
       var i = 2;
       while(fso.FileExists(path + name + ' (' + i + ').url')) {
           i++;
       }
       var sc = shell.CreateShortcut(path + name + ' (' + i + ').url');
   }
   sc.TargetPath = script;
   sc.Save();
}
</script>

JScriptから呼び出し元のDOMを取得し、フォームに入力された値を自動入力するためのブックマークレットを生成する。
ブックマークレットはpathで指定したフォルダ内にショートカットファイルとして作成されます。
name属性のないフォームおよびその子要素や、文字列として保持できないものなどは記録対象外です。

参考

Internet Exploreにコンテキストメニューを追加して機能を追加する