2013-02-07 19 views
10

は、私はそれが何をするか、このHTML5のメッセージング複数のインスタンス

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アラート

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

私は「イベント」配列を消去しようとしましたが、私はまだ警告を得るが、この時間は、彼らは空ですが、私は次のようにサイズを変更する親を呼び出しています各iframeをページで...

アラートの数はiframe内のリンククリック数に等しいか?

これはなぜですか?

+0

...「負荷のメインページ本体」に機能を移動するとiframeからそれを削除することによって、これを解決? – FoolishSeth

+0

@FoolishSeth関数自体は他のドメインにあります(私は両方のドメインにアクセスできます)が、ドメイン間のメッセージングであるため、ロード時に各iframe本体で呼び出されます。だから、最初の "フレームの読み込み"では、すべてが正しく表示されますが、iframe内のリンクをクリックすることでユーザーの進捗状況が表示されます(1回のクリックでiframe = 1のアラート、2回のクリック= 2のアラート、15クリック= 15アラートなど)。 – Peter

答えて

1

iframeのリンクをクリックするたびに、loadイベントが発生するという問題があります。

リンクをクリックするたびにメッセージイベントをバインドします。 2回目のアラートが発生したため、2回目のアラートが発生したときなど、2回目のアラートが発生したときに初めてバインドされたため、すべてが正しくなりました...

解決方法は 'message'event 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); 
    } 
}; 

その後、あなたはオンロードと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); 
} 
0

私はあなたが `resizeCrossDomainIframe()`を呼び出すんどことき/

関連する問題