sendMouseEventによるイベントシミュレートの効果範囲
モデレータ: Forum Moderators
sendMouseEventによるイベントシミュレートの効果範囲
sendMouseEventでマウスクリックイベントを起こしたいのですが思ったような動作をしません。
Firefoxのツールバーなどのボタンを押したりはできるようなのですが、座標をwebページ中にすると効果がありません(リンクなどのクリック対象に座標を合わせても反応が無い)。
sendMouseEventはwebページに対してイベントを起こすことは出来ないのでしょうか?
環境
os:xp
Firefox:3.6.4
Firefoxのツールバーなどのボタンを押したりはできるようなのですが、座標をwebページ中にすると効果がありません(リンクなどのクリック対象に座標を合わせても反応が無い)。
sendMouseEventはwebページに対してイベントを起こすことは出来ないのでしょうか?
環境
os:xp
Firefox:3.6.4
Re: sendMouseEventによるイベントシミュレートの効果範囲
コード: 全て選択
var utils = window
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils);
例えばマウス系のイベントから対応するフレームのユーティリティを取得するなら、こんな感じでしょうか。
コード: 全て選択
var utils = event.originalTarget.ownerDocument.defaultView
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils);
コード: 全て選択
var view = window;
while (true) {
let target = view.document.elementFromPoint(x, y);
if (target.localName.match(/^(iframe|frame|browser|tabbrowser)$/)
view = target.contentWindow;
else
break;
}
var utils = view.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils);
Re: sendMouseEventによるイベントシミュレートの効果範囲
何がしたいのか分かりませんが、普通にDOMイベントを生成し、狙いの要素にdispatchするのでは実現できませんか? また、やりたいことを直接実行できるAPIはありませんか?
nsIDOMWindowUtilsは自動テストでの利用を主に想定していて、拡張での利用すら想定されていませんので他のAPIよりもより一層、unstableです。そのため、利用は極力避けた方が賢明です。
また、普通のDOMイベントを弾く、セキュリティ的に問題があるイベントハンドラもこれらのAPI経由で生成されたネイティブイベントは処理してしまいます(ここをテストするためのAPIなため)。つまり、セキュリティリスクが大きいものです。
ちなみに利用するにあたってはどこからどこまでが一つのnsIWidgetであるのかを理解しておかなくてはいけません(これがバージョンごとに変わっているのですが)。
nsIDOMWindowUtilsは自動テストでの利用を主に想定していて、拡張での利用すら想定されていませんので他のAPIよりもより一層、unstableです。そのため、利用は極力避けた方が賢明です。
また、普通のDOMイベントを弾く、セキュリティ的に問題があるイベントハンドラもこれらのAPI経由で生成されたネイティブイベントは処理してしまいます(ここをテストするためのAPIなため)。つまり、セキュリティリスクが大きいものです。
ちなみに利用するにあたってはどこからどこまでが一つのnsIWidgetであるのかを理解しておかなくてはいけません(これがバージョンごとに変わっているのですが)。
この部分も今は真ですが、そのうち偽になります。ブラウズ領域はインラインフレーム扱いなので、トップレベルのウィンドウではなくそのフレームのnsIDOMWindowUtilsインターフェースのユーティリティを取得する必要があります。
Re: sendMouseEventによるイベントシミュレートの効果範囲
Piroさん、Masayukiさん、お返事ありがとうございます。
やりたいことはFlashゲーム上の指定した座標でマウスクリックを行うというものです。
DOMイベントを生成してdispatchするという方法だと、以下のような方法になるのでしょうか?
var view = window;
let target = view.document.elementFromPoint(x, y);
view = target.contentWindow;
var e = document.createEvent('MouseEvents');
e.initMouseEvent("click",true,true,window,1,10,50,10,50,0,0,0,0,1,null);
view.dispatchEvent(e);
やりたいことはFlashゲーム上の指定した座標でマウスクリックを行うというものです。
DOMイベントを生成してdispatchするという方法だと、以下のような方法になるのでしょうか?
var view = window;
let target = view.document.elementFromPoint(x, y);
view = target.contentWindow;
var e = document.createEvent('MouseEvents');
e.initMouseEvent("click",true,true,window,1,10,50,10,50,0,0,0,0,1,null);
view.dispatchEvent(e);
Re: sendMouseEventによるイベントシミュレートの効果範囲
Yes.rk さんが書きました:DOMイベントを生成してdispatchするという方法だと、以下のような方法になるのでしょうか?
var view = window;
let target = view.document.elementFromPoint(x, y);
view = target.contentWindow;
var e = document.createEvent('MouseEvents');
e.initMouseEvent("click",true,true,window,1,10,50,10,50,0,0,0,0,1,null);
view.dispatchEvent(e);
http://mxr.mozilla.org/mozilla-central/ ... et.idl#106
target.dispatchEvent(e);の方がスマートかも。
Re: sendMouseEventによるイベントシミュレートの効果範囲
上手くいきました。 ありがとうございます。
ところで、initMouseEventはスクリーン・クライアント座標を引数にとっていますが、これに値を入れても機能していないようにみえるのですがどのように使うのでしょうか(座標はelementFromPointのみに依存して機能しているようです)。
ところで、initMouseEventはスクリーン・クライアント座標を引数にとっていますが、これに値を入れても機能していないようにみえるのですがどのように使うのでしょうか(座標はelementFromPointのみに依存して機能しているようです)。
Re: sendMouseEventによるイベントシミュレートの効果範囲
各イベントのプロパティに反映されていませんか?rk さんが書きました:上手くいきました。 ありがとうございます。
ところで、initMouseEventはスクリーン・クライアント座標を引数にとっていますが、これに値を入れても機能していないようにみえるのですがどのように使うのでしょうか(座標はelementFromPointのみに依存して機能しているようです)。
イベントが発生する要素を自動的に選択してほしい、というのであれば、そのようには使えません。dispatchEvent()は文字通り、そのイベントをそのDOMEventTargetに対して送信するものであって、本物のイベントをエミュレートする訳ではありません。これが、nsIDOMWindowUtilsのSend*()との大きな違いです。
Re: sendMouseEventによるイベントシミュレートの効果範囲
分かりました。 ありがとございます。Masayuki さんが書きました:dispatchEvent()は文字通り、そのイベントをそのDOMEventTargetに対して送信するものであって、本物のイベントをエミュレートする訳ではありません。これが、nsIDOMWindowUtilsのSend*()との大きな違いです。