2013-02-07 7 views
10

Ho uno script come questoHTML5 messaggistica multi-istanza

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); 
} 

ciò che fa è dinamicamente ridimensionata iframe. Ora su una prima pagina iframe ho appena ricevuto un avviso, ma nella pagina iframe ho dei collegamenti e quando vado alla seconda pagina vedo 2 avvisi, quando vado alla terza pagina - ricevo 3 avvisi, 4iiii grilletto 4 avvisi etc ...

In ogni pagina iframed sto chiamando genitore per ridimensionare come:

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

ho cercato di cancellare la matrice "evento", ma ho ancora ottenere avvisi, ma questa volta sono vuote, ma il numero di avvisi è uguale al numero di link-clic all'interno dell'iframe?

Perché è questo?

+0

Quando/Dove si chiama 'resizeCrossDomainIframe()'? – FoolishSeth

+0

@FoolishSeth La funzione stessa si trova su un altro dominio (ho accesso a entrambi i domini), ma dal momento che si tratta di messaggistica interdominio - lo sto chiamando su ogni corpo "iframe" al caricamento. Quindi, al primo "frame load" mostra tutto correttamente, ma mentre l'utente avanza facendo clic sui link all'interno dell'iframe, con ogni clic ricevo la stessa quantità di avvisi (1 clic del link in iframe = 1 avviso, 2 clic = 2 avvisi, 15 clic = 15 avvisi ecc.). – Peter

risposta

1

Il problema è che ogni volta che si fa clic su un collegamento nell'iframe viene generato l'evento di caricamento.

Così si associa l'evento del messaggio ogni volta che si fa clic su un collegamento. La prima volta è tutto corretto, perché lo hai rilegato una volta, la seconda volta che ricevi due avvisi, perché lo hai rilegato due volte, e così via ...

Quindi la soluzione è rimuovere il 'messaggio'eventuale su scarico di iframe.

Per questo motivo è necessario pulire il codice un po ':

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); 
    } 
}; 

allora si hanno le funzioni che voi chiamate onLoad e 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

Ho risolto questo con la funzione di trasferirsi a "principale corpo della pagina del carico" e la rimozione dal iframe ...

Problemi correlati