Firefox 4 にてコンテキストメニューを開く際に右クリックしたノードを取得する方法

Firefox拡張機能 (アドオンの一種) の開発をして、コンテキストメニューに項目を追加し、コンテキストメニューからいろいろと操作をできるようにすることがあります。 コンテキストメニューを変更したり、イベントを取得したりする方法については次のページが参考になります。

コンテキストとして何がクリックされたか判定する

上に示したページにおいて、コンテキストメニューを開く際に右クリックしたノードを取得する方法として、次のことが書かれています。

コンテキストメニューはマウスだけではなく他の方法でも開かれ得るという事を覚えておく事は重要です。しかしながら、キーボードを使って開かれた場合でも、メニューが適用されるノード (コンテキスト) はあります。それは現在フォーカスのある要素です。マウスを使った場合には、コンテキストはクリックされた要素です。

この要素は document の popupNode プロパティを使って取得できます。次の例では、browser に取り付けられたポップアップで、popupNode プロパティをチェックして画像がクリックされたかどうかを判定しています。

詳しくは 該当箇所 を読んでください。 要は JavaScriptdocument.popupNode を参照することで、どのノードを右クリックしてコンテキストメニューを開いたのかがわかるわけです。 (Firefox 3.6 にて確認。)

Firefox 4 では menupopup.triggerNode を使う?

しかしながら、Firefox 4.0b6 でその方法を試してみたところ、document.popupNodenull になっており、ノードの取得ができませんでした ((もしかしたら私のコードの書き方が悪くて、うまくしたら document.popupNode を使うことができるのかも知れませんが、少なくとも Firefox 3.6 でちゃんと動いたコードが動かなかったことは確かです。))。 Firefox 4.0b7 で試したところ、問題なく document.popupNode を使うことができました。 Firefox 4.0b6 のバグか何かだったようです。

そこで、Firefox 4 への変更点を調べていると、次の記述を見つけました

The menupopup XUL element now has a triggerNode property, which indicates the node on which the event occurred that caused the popup to open.

XULmenupopup 要素を表すオブジェクトに triggerNode プロパティが追加され、そのプロパティを参照することで、コンテキストメニューを開く際にどのノードを右クリックしたのかがわかるようです。 実際に Firefox 4.0b6 で試してみましたが、問題なく使用することができました。

Firefox 3 と 4 で互換性がないのでちょっと注意が必要です。 menupopup.triggerNode に関しては互換性がありませんが、document.popupNodeFirefox 3 でも 4 でも使えそうです。

Firefox 4 で document.popupNode が使えないのかどうかについて (追記)

@saneyuki_s さんのついーと より。

最新のnightlyだと、document.popupNodeでも、ちゃんと値は返ってきたけどなあ。(alertで簡易確認だけど。)

確かに Firefox 4 のドキュメントを読んでも document.popupNode が使えなくなった、という記述は見つけられませんので、どんな場合にでも document.popupNode が使えないというわけではなさそうです。 どういう場合に使えてどういう場合に使えないのか、もうちょっと詳しく調べてみる必要がありそうです。 上でも述べましたが、どうやら Firefox 4.0b6 のバグのようです。 Firefox 4.0b7 では問題ありませんでした。

おまけ: popup 要素に関して

XUL の雑多な変更点 を読んでると次のことが書かれていました。 Firefox 4 では popup 要素の代わりに menupopup 要素を使うべきである、とのこと。

The popup element is no longer supported; you should use menupopup instead.