5

iframe を含むページがあり、iframe の履歴のみを追跡したいと考えています。私はこのように履歴オブジェクトを使用しようとしました:

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <script type="text/javascript">
        function checkFrameHistory() {
            alert(window.frames["test2"].history.length);
        }

        function checkThisHistory() {
            alert(history.length);
        }
        </script>
    </head>
    <body>

        <iframe name="test2" src="test2.html"></iframe>

        <div>
            <input type="button" onclick="checkFrameHistory()" value="Frame history"/>
            <input type="button" onclick="checkThisHistory()" value="This history"/>
        </div>

    </body>
</html>

test2.html

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <script type="text/javascript">
        function checkMyHistory() {
            alert(history.length);
        }
        </script>
    </head>
    <body>
    <div>
        Test2
    </div>

    <div>
        <input type="button" onclick="checkMyHistory()" value="My history"/>
    </div>

    </body>
</html>

しかし、実際には親ウィンドウを含む履歴が表示されました。

たとえば、メイン ウィンドウで別のサイトに移動し、iframe テスト サイトに戻ってきました。長さを 2 増やすことで、両方ともwindow.frames["test2"].history.length同じhistory.lengthカウントが得られました。

私はそれを間違っていましたか?iframe 履歴のみを追跡する方法はありますか?

4

6 に答える 6

5

Chrome はウィンドウ ベースで履歴を管理します。別々のフレームではありません。この動作が問題の原因である可能性があります。

ところで、すべてのブラウザのデフォルトの動作かどうかはわかりません。

編集: Navigationhistory サーバー側を維持する必要があります。別の回答で述べられているように、メインウィンドウに配列を保持することは、親ウィンドウでもナビゲートする場合には機能しません。

于 2012-06-04T16:31:07.557 に答える
4

もちろん、iframe コンテンツが同じドメインであれば、これを行う簡単な方法があります。

親からiframe の window オブジェクトのbeforeUnloadまたはイベントにバインドします。イベントのコールバック ハンドラーでは、場所はもちろん、親スコープで以前に定義された配列であるloadという行に沿って何かを行うだけです。locations.push(getElementById("iframe").contentWindow.location.href)

于 2012-06-04T12:43:30.070 に答える
3

これを使用して iframe の履歴にアクセスします

document.getElementById("test2").contentWindow.history.length
于 2012-06-04T18:33:31.310 に答える
1

同一生成元ポリシーのため、フレームに関連付けられているオブジェクトにアクセスできる可能性はほとんどありません。

ページ自体とiframeでドメインが等しくなるように設定してみましたか?例えば

//somewhere on your page in a script tag
document.domain = "your-top-level-domain.com";

これは、ページが相互に信頼し、内部状態へのアクセスを許可される必要があることをブラウザに通知する必要があります

于 2012-05-29T15:16:50.533 に答える
0

フレームにcontentWindowが含まれている場合は、 frame.contentWindow.historyを使用できます。

ただし、すべてのブラウザがこのプロパティをサポートしているわけではありません。そうでない場合は、フレームの位置をいくつかの変数に格納する必要があります。以下のようにフレーム onload イベントにイベント ハンドラーをバインドします (jquery を使用)。

var frameHistory = [];
$(document).ready(function(){
    var frame = window.frames["test2"];
    $.bind(frame, "onload", function(){ //store location when frame loads
        frameHistory.push(frame.window.location.href);
    }
});

そして、ボタンクリックイベントハンドラーで:

alert(frameHistory.length);
于 2012-06-05T06:14:43.390 に答える
0

両方のドメインにアクセスできる限り、SOP に勝てる可能性がありますヘルパー IFRAME を使用して、BODY から onchange イベントを渡すことができます。

この投稿は非常に役立つはずです: コンテンツに基づいて iframe のサイズを変更する

于 2012-06-05T13:36:29.597 に答える