ボタンのクリックをエミュレートする


Vimperatorでボタンクリックをエミュレートする

もっと直接的な方法が用意されてる気もするけど・・・

2012.12.21 追記

buffer.followLinkでできるよって教えてもらいました。
あと、node.click()よりもDOMEvent使うべきってつっこみももらいました。
ありがとうございます。

(追記) buffer.followLinkを使うパターン

教えてもらった、buffer.followLinkを使うパターンです。
これならjquery-loaderをインストールする必要もないですね。

.vimperatorrc
map ;te :js buffer.followLink(content.document.querySelector("form#modifypage").querySelector("input[type=submit]"), liberator.CURRENT_TAB)<CR>

1. jquery-loaderプラグインをインストールする

https://github.com/vimpr/vimperator-plugins/blob/master/jquery-loader.js
このjquery-loader.js を ./vimperator/plugin に置いて、.vimperatorrcにjquery.js へのパスを指定する。

.vimperatorrc
let g:jquery_filepath = "jquery.jsのパス"

2. 押したいボタンに応じて、.vimperatorrc に定義を追加する

mapでjavascriptコマンド呼ぶか

.vimperatorrc
map ;te :javascript jQuery.core("form#modifypage").find("input[type=submit]")[0].click()<CR>

もうちょっと丁寧にコマンドを定義するか

[2012.12.21 編集]
DOMEvent使うべきってつっこみをもらったので、 書きなおしました。

.vimperatorrc
javascript << EOS
commands.addUserCommand(['trace[dit]'], '[Trac] Enter wiki editor', 
    function () {
        let nodes = jQuery.core("form#modifypage").find("input[type=submit]");
        if (nodes.length != 1)
            return;
        let evt = document.createEvent("MouseEvents");
        evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0,
                           false, false, false, false, 0, null);
        nodes[0].dispatchEvent(evt);
    }
);
EOS

ちなみにこれはTracのWikiで「このページを編集」ボタンを押すための設定。

3. サイトを制限する

これだと対象じゃないサイトでも動いてしまうけど、ちゃんと目的のサイトでだけ動くようにしたいなら autocmd LocatioChange と組み合わせればいいかな。

.vimperatorc
" 127.0.0.1:5000/trac にいるときだけ is_tracをtrueにする
autocmd LocationChange .* :js var is_trac = false
autocmd LocationChange 127\.0\.0\.1\:5000\/trac.* :js var is_trac = true

javascript << EOS
commands.addUserCommand(['trace[dit]'], '[Trac] Enter wiki editor', 
    function () {
        if (!is_trac) return;
        // 以下略                  
    }
);
EOS