0

Firefox で CTRL-f を使用して見つかったテキストの最上位 X ウィンドウ座標をプログラムで決定する必要があります。たとえば、次のシーケンスから始めます。

  1. Linux で Firefox を開きます (MS Windows はここでは関係ありません)。
  2. いくつかの Web ページを参照します。
  3. CTRL-f を入力して、ページに存在するテキスト「foo」の検索を開始します。
  4. Firefox は期待どおりにテキストを強調表示します。
  5. ページの下部にある検索ツールバーを削除するエスケープ キーを入力します。

ここで、スクラッチパッド (Shift-F4) を開き、強調表示/選択されているテキストの左上の点の X 座標と Y 座標をコンソールに出力する JavaScript を入力します (再び、明確にするために、座標はトップレベルの X ウィンドウ座標である必要があります)。座標は、最上位の X ウィンドウ (Firefox ウィンドウ) を基準とした座標に変換する必要があります。

Selenium などの Firefox 拡張機能をインストールせず、そのままの JavaScript を使用することをお勧めします。また、ロードされて表示されているページのコンテンツを、可能であれば変更したくありません。

選択したテキストと xy 座標の質問はこれに似ているようです。このwindow.getSelection()メソッドはテキスト文字列を返しますが、X ウィンドウ上にある文字列の X 座標と Y 座標を特に探しています。

編集 #1: http://javascript.info/tutorial/coordinatesで指定された「ウィンドウ座標」は、トップレベルの X ウィンドウ座標と同じではないことに注意してください。この質問に対する実行可能な答えには、要素またはノード座標からトップレベルの X ウィンドウ座標に変換するための完全なアフィン変換 JavaScript コードが含まれます ( http://javascript.info/で指定された「ウィンドウ座標」への中間変換を意味する場合でも)。チュートリアル/座標)。

編集 #2: 考えられる答えはhttps://stackoverflow.com/a/14119731/257924にありますが、まだ確認中です。以下の編集#3で確認:

編集#3:Tim Downsの回答へのフォローアップ:これはうまくいきましたが、注意が必要です:

var sel = window.getSelection();
var result = "no_selection";
if (sel.rangeCount) {
    var range = sel.getRangeAt(0).cloneRange();
    if (range.getBoundingClientRect) {
        range.collapse(true);
        var rect = range.getBoundingClientRect();
        if (rect) {
            x = rect.left;
            y = rect.top;
            x += window.mozInnerScreenX;
            y += window.mozInnerScreenY;
            result = "" + x + " " + y;
        }
    }
}
result

注意点として、ユーザーがページで CTRL-PLUS または CTRL-MINUS を押してページをスケーリングした場合、x と y の値が正しくなくなります (スケーリングの問題)。しかし、スケーリングが含まれていない場合、x と y の値は絶対 X ルート ウィンドウ (Linux では X11 の下) 座標であり、最初に求めていた Firefox X ルート ウィンドウの原点に相対的ではないことがわかりました。

デバッグ中の倍率へのアクセスに関する別の関連する問題を尋ねました。

4

2 に答える 2

1

getClientRects()これは、選択範囲から取得した範囲のメソッドを使用して行うことができます。https://stackoverflow.com/a/6847328/96100を参照してください

によって返された四角形によって返された座標を、Firefox のみgetClientRects()の「画面」を基準とした座標に変換するには、とを使用できます。以下のデモ。結果は、Windows 上の Firefox ではもっともらしいようです。window.mozInnerScreenXwindow.mozInnerScreenY

http://jsfiddle.net/timdown/gaw5W/1/

于 2013-01-02T09:40:27.130 に答える
0

jsfiddle.net が応答しないことを考えると ( Tim の回答で参照)、スケーリング ファクターの取得に関する質問の「EDIT #3」で説明した問題にも対処する独自のソリューションを以下に示します。

次の Javascript コードは、選択したテキストの適切にスケーリングされた原点座標を取得する方法を示しています。選択されたテキストには、CTRL-f を入力して選択されたテキストを入力し、Escape を入力した場合に選択されたものが含まれます。

screenPixelsPerCSSPixel例外をスローせずに を使用できるようにするには、フラグdevtools.chrome.enabledabout:configtrue に設定する必要があり、スクラッチパッドEnvironmentメニューを使用してBrowser構成を選択する必要があります (詳細については、Javascript スクラッチパッドの Firefox Components.interfaces.nsIDOMWindowUtils.screenPixelsPerCSSPixel 値の検査を参照してください)。 .

セキュリティ リスクを回避するにdevtools.chrome.enabled は、以下のコードを試した後、必ずフラグを false に戻してください。

上記の構成変更が適用されたら、次のテキストをスクラッチパッドに入力し、カーソルを最後の「結果」の後に置き、CTRL-L を入力して結果を表示します。

var contentWindow = window.content;
var sel = contentWindow.getSelection();
var result = "no_selection";
if (sel.rangeCount) {
    var range = sel.getRangeAt(0).cloneRange();
    if (range.getClientRects) {
        range.collapse(true);
        var rect = range.getClientRects()[0];
        if (rect) {
            x = rect.left;
            y = rect.top;
            x += contentWindow.mozInnerScreenX;
            y += contentWindow.mozInnerScreenY;
            var util = contentWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).getInterface(Components.interfaces.nsIDOMWindowUtils);
            x *= util.screenPixelsPerCSSPixel;
            y *= util.screenPixelsPerCSSPixel;
            result = "" + x + " " + y;
        }
    }
}
result

文字列に埋め込まれた結果の座標値resultが絶対 X ルート ウィンドウ座標に対応するように、上記がコンテンツ ウィンドウで適切にスケーリングを処理することを確認しました。上記は MS Windows でテストしていません。

于 2013-01-12T15:27:52.600 に答える