10

私はこのようなスクリプトを持っています

function resizeCrossDomainIframe(id, other_domain) {
    var iframe = document.getElementById(id);
    window.addEventListener('message', function (event) {
        if (event.origin !== other_domain) return; // only accept messages from the specified domain
        if (event.data === "reload") top.location.reload(); // If child page sends reload request - reload it without any questions asked 
        if (isNaN(event.data)) { //If this isn't integer than it is alert
            alert(event.data); // Show alert if not integer
        } else {
            var height = parseInt(event.data) + 5; // add some extra height to avoid scrollbar
            iframe.height = height + "px";
            alert(event.data);
        }
    }, false);
}

iframeのサイズを動的に変更します。これで、最初のiframeページでアラートが1つだけ表示されますが、iframeページ内にリンクがあり、2番目のページに移動すると2つのアラートが表示され、3番目のページに移動すると3つのアラートが表示され、4番目のリンクが4つのアラートをトリガーします。 ..。。

各iframedページで、次のようにサイズを変更するために親を呼び出しています。

<body class="settingspage" onload="parent.postMessage(document.body.scrollHeight, '<?php echo $_SESSION['SESS_ACCESSING_FROM']; ?>');">

「イベント」配列をクリアしようとしましたが、それでもアラートが表示されますが、今回は空ですが、アラートの数はiframe内のリンククリックの数と同じですか?

どうしてこれなの ?

4

2 に答える 2

1

問題は、iframe 内のリンクをクリックするたびに load イベントが発生することです。

したがって、リンクがクリックされるたびにメッセージ イベントをバインドします。一度バインドしたため、最初はすべて正しく、2 回目には 2 回バインドしたため、2 つのアラートが表示されます。

したがって、解決策は、iframe のアンロード時に「メッセージ」イベントを削除することです。

このため、コードを少しきれいにする必要があります。

var listener = function (event) {

    if (event.data === "reload") top.location.reload(); // If child page sends reload request - reload it without any questions asked 
    if (isNaN(event.data)) { //If this isn't integer than it is alert
        alert(event.data); // Show alert if not integer
    } else {
        var height = parseInt(event.data) + 5; // add some extra height to avoid scrollbar
        iframe.height = height + "px";
        alert(event.data);
    }
};

次に、onLoad と onUnload を呼び出す関数があります。

function iframeOnLoad(id) {
    var iframe = document.getElementById(id);
    window.addEventListener('message', listener, false); 
}

function iframeOnUnload(id) {
    var iframe = document.getElementById(id);
    window.removeEventListener('message', listener, false); 
}
于 2013-02-13T08:18:57.940 に答える
0

関数を「ロード時のメインページ本文」に移動し、iframeから削除することでこれを解決しました...

于 2013-02-15T15:37:37.837 に答える