― MozillaZine.jp フォーラムは Mozilla 製品に関する情報交換の場です ―



All times are UTC + 9 hours

新しいトピックを投稿する トピックへ返信する  [ 8 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2010年6月29日(火) 00:27 
オフライン

登録日時: 2010年6月27日(日) 17:45
記事: 14
sendMouseEventでマウスクリックイベントを起こしたいのですが思ったような動作をしません。
Firefoxのツールバーなどのボタンを押したりはできるようなのですが、座標をwebページ中にすると効果がありません(リンクなどのクリック対象に座標を合わせても反応が無い)。

sendMouseEventはwebページに対してイベントを起こすことは出来ないのでしょうか?

環境
os:xp
Firefox:3.6.4


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2010年6月29日(火) 02:16 
オフライン
Moderator

登録日時: 2007年5月03日(木) 01:11
記事: 92
お住まい: 東京
コード:
var utils = window
                  .QueryInterface(Ci.nsIInterfaceRequestor)
                  .getInterface(Ci.nsIDOMWindowUtils);


でnsIDOMWindowUtilsインターフェースのユーティリティを取得できますが、このユーティリティのイベント発行系の機能は基本的に、そのウィンドウ(フレーム)自身に対してしか働きません。ブラウズ領域はインラインフレーム扱いなので、トップレベルのウィンドウではなくそのフレームのnsIDOMWindowUtilsインターフェースのユーティリティを取得する必要があります。
例えばマウス系のイベントから対応するフレームのユーティリティを取得するなら、こんな感じでしょうか。

コード:
var utils = event.originalTarget.ownerDocument.defaultView
                     .QueryInterface(Ci.nsIInterfaceRequestor)
                     .getInterface(Ci.nsIDOMWindowUtils);


座標ベースなら、document.elementFromPointを使う事になると思います。

コード:
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);


これは省略した例なので、実際にはx, yのズレやら何やらを計算しないといけませんが。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2010年6月29日(火) 12:32 
オフライン

登録日時: 2009年4月26日(日) 00:32
記事: 97
お住まい: 大阪
何がしたいのか分かりませんが、普通にDOMイベントを生成し、狙いの要素にdispatchするのでは実現できませんか? また、やりたいことを直接実行できるAPIはありませんか?

nsIDOMWindowUtilsは自動テストでの利用を主に想定していて、拡張での利用すら想定されていませんので他のAPIよりもより一層、unstableです。そのため、利用は極力避けた方が賢明です。

また、普通のDOMイベントを弾く、セキュリティ的に問題があるイベントハンドラもこれらのAPI経由で生成されたネイティブイベントは処理してしまいます(ここをテストするためのAPIなため)。つまり、セキュリティリスクが大きいものです。

ちなみに利用するにあたってはどこからどこまでが一つのnsIWidgetであるのかを理解しておかなくてはいけません(これがバージョンごとに変わっているのですが)。

引用:
ブラウズ領域はインラインフレーム扱いなので、トップレベルのウィンドウではなくそのフレームのnsIDOMWindowUtilsインターフェースのユーティリティを取得する必要があります。


この部分も今は真ですが、そのうち偽になります。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2010年6月30日(水) 00:08 
オフライン

登録日時: 2010年6月27日(日) 17:45
記事: 14
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);


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2010年8月10日(火) 13:46 
オフライン

登録日時: 2009年4月26日(日) 00:32
記事: 97
お住まい: 大阪
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);


Yes.

http://mxr.mozilla.org/mozilla-central/ ... et.idl#106

target.dispatchEvent(e);の方がスマートかも。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2010年8月22日(日) 23:09 
オフライン

登録日時: 2010年6月27日(日) 17:45
記事: 14
上手くいきました。 ありがとうございます。

ところで、initMouseEventはスクリーン・クライアント座標を引数にとっていますが、これに値を入れても機能していないようにみえるのですがどのように使うのでしょうか(座標はelementFromPointのみに依存して機能しているようです)。 


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2010年8月23日(月) 15:57 
オフライン

登録日時: 2009年4月26日(日) 00:32
記事: 97
お住まい: 大阪
rk さんが書きました:
上手くいきました。 ありがとうございます。

ところで、initMouseEventはスクリーン・クライアント座標を引数にとっていますが、これに値を入れても機能していないようにみえるのですがどのように使うのでしょうか(座標はelementFromPointのみに依存して機能しているようです)。 


各イベントのプロパティに反映されていませんか?

イベントが発生する要素を自動的に選択してほしい、というのであれば、そのようには使えません。dispatchEvent()は文字通り、そのイベントをそのDOMEventTargetに対して送信するものであって、本物のイベントをエミュレートする訳ではありません。これが、nsIDOMWindowUtilsのSend*()との大きな違いです。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2010年9月11日(土) 05:52 
オフライン

登録日時: 2010年6月27日(日) 17:45
記事: 14
Masayuki さんが書きました:
dispatchEvent()は文字通り、そのイベントをそのDOMEventTargetに対して送信するものであって、本物のイベントをエミュレートする訳ではありません。これが、nsIDOMWindowUtilsのSend*()との大きな違いです。

分かりました。 ありがとございます。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
期間内表示:  ソート  
新しいトピックを投稿する トピックへ返信する  [ 8 件の記事 ] 

All times are UTC + 9 hours


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[38人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by MozillaZine.jp® Forum Software © phpBB Group , Almsamim WYSIWYG
Japanese translation principally by ocean