xul:popup#showPopup の位置ズレを直す

popup 要素に対して

showPopup(document.documentElement, event.screenX, event.screenY, "popup", null, null);

とかすると、マウスポインタを基点とした位置にポップアップが表示されるが、その後に右クリックのコンテキストメニューを表示させてからもう一度上記の showPopup を実行すると、ポップアップが表示される位置が大きくズレるという問題に悩まされた。

しかし、showPopup する前に、以下のようにしてやることで直った。

document.popupNode = null;

TOP

4 Comments to “xul:popup#showPopup の位置ズレを直す”

これ、document.popupNodeが空の時とそうでない時の挙動ってどっちが正しいんでしょう?
自分は逆に、常に何らかの値をpopupNodeに入れておくように統一してるんですが……

mozilla1.8 mozilla/toolkit/content/widgets/autocomplete.xml
このXBLではnullをセットしていますね。そもそもなんでこれで位置ズレが直るのか理由はわかってません。

document.popupNodeに何らかの要素ノードが入っていると、配置の基準座標(原点)が変化するようです。
どうも、document.documentElementのX座標とY座標が原点にされてしまっているような感じ?

nullを代入する方に統一しようかとも思うんですが、内容領域でのコンテキストメニューやタブのコンテキストメニューのように、初期化時にdocument.popupNodeに何らかの値が入っていることが期待されている物を手動で表示させる時には、そういうわけにはいかないんですよね。

確かに、contentAreaContextMenu なんかは document.popupNode の値から リンク上か画像上かフレーム内か、などを調べているので null はまずいっすね。

以下のような簡単なテストケースを使って調べたのですが、 Firefox 2 では document.documentElement が基準となって位置ズレが発生したものの、 Firefox 3.0a7pre では正しい位置に表示されました。おそらく Bug 279703 – Need to redesign how XUL popups work の一環としてバグ修正されたのかもしれませんね。

window.addEventListener("click", function(event) {
	if (event.button != 0)
		return;
	document.popupNode = window.content.document.documentElement;
	var popup = document.getElementById("contentAreaContextMenu");
	popup.showPopup(document.documentElement, event.screenX, event.screenY, "popup");
}, true);

TOP

TOP