GreaseMonkey からターゲットページのイベントハンドラを呼び出す方法
さくらです♡こんばんわ☆彡
今日はグリモンスクリプトから対象のウェブページに設定されたイベントハンドラを呼び出す方法を簡単にご紹介したいと思います。
例えば以下のような HTML をグリモンの処理対象とした場合、
<a href="http://www.example.com" id="target">www.example.com</a>
グリモンからウェブページ上の onclick イベントハンドラを、以下のように呼び出すことはできません。
var obj = document.getElementById('target'); obj.onclick();
できない理由は XPCNativeWrapper – MDC に書かれているとおり、XPCNativeWrapper の on* プロパティを設定したり読み込もうとすると例外が送出されるためです。
グリモンスクリプトから on* プロパティを呼び出すには、Document Object Model (DOM) Level 2 Events Specification に定義されている方法で、イベントハンドラを呼び出す必要があります。具体的にはこんな感じです。
var obj = document.getElementById('target'); var e = document.createEvent('MouseEvents'); e.initEvent('click', true, false); obj.dispatchEvent(e);
これは JavaScript で obj.onclick() と書くのとほぼ同じことを、DOM Level 2 のイベントを使ってコーディングしてるだけで、id=”target” のオブジェクトに対してマウスクリックが発生したことを表すイベントを送出してます。
DOM Level 2 イベントは、
- document.createEvent を使ってイベントオブジェクトのインスタンスを取得する
- イベントオブジェクトは initEvent を使って初期化する
- dispatchEvent でイベントを送出する
という順で使用します。
createEvent の引数にはイベントオブジェクトの種類を指定します。initEvent で指定する、発生させるイベントの種類により、使用するイベントオブジェクトは変わります。どのイベントを発生させるときにどのイベントオブジェクトが必要かについては Document Object Model (DOM) Level 2 Events Specification をご覧ください。
initEvent の第一引数には送出するイベントの種類を指定します。イベントの種類には onclick なら ‘click’ 等、JavaScript のイベントハンドラと対応した名前が付いてます。こちらも詳しくは Document Object Model (DOM) Level 2 Events Specification をご覧ください。第二引数にはイベントバブルの可否を指定します。true なら可です。第三引数にキャンセル可否を指定します。こちらも true なら可です。
DOM Level 2 イベントを使うと、イベント発生を伴う JavaScript での処理をグリモンにより自動化することができます。
使い道は色々あると思いますが、さくら的には例えば田代とか、正確に言えば田代砲とか、いずれにしてもロクな利用方法は思いつきませんでしたww
まあウェブアプリのテストとかなら使えるような気もしますけど、テストツールならもっと良いアドオンがあったと思いますので、やっぱりロクな利用方法が(ry
さくら
Having read this I thought it was rather enlightening.
I appreciate you spending some time and effort to put this content together.
I once again find myself personally spending a significant amount of time both reading and posting comments.
But so what, it was still worthwhile!