J'ai une application exécutée à l'intérieur d'un iframe sur une page "étrangère" (domaine différent, etc.). Pour permettre une communication de base entre le parent iframe &, je charge un de mes scripts sur la page parente et utilise postMessage
pour faire des messages inter-documents.Problèmes de messagerie documentaire croisée entre IFrame et parent
La plupart du temps, cette communication fonctionne comme prévu, mais parfois des erreurs sont signalées à mon outil de suivi des erreurs et je n'arrive pas à comprendre pourquoi elles se produisent.
Voici un code exemplaire:
PluginOnParent.js
// ...
window.addEventListener('message', function(e) {
// Check message origin etc...
if (e.data.type === 'iFrameRequest') {
e.source.postMessage({
type: 'parentResponse',
responseData: someInterestingData
}, e.origin);
}
// ...
}, false);
// ...
AppInsideIFrame.js
// ...
var timeoutId;
try {
if (window.self === window.top) {
// We're not inside an IFrame, don't do anything...
return;
}
} catch (e) {
// Browsers can block access to window.top due to same origin policy.
// See http://stackoverflow.com/a/326076
// If this happens, we are inside an IFrame...
}
function messageHandler(e) {
if (e.data && (e.data.type === 'parentResponse')) {
window.clearTimeout(timeoutId);
window.removeEventListener('message', messageHandler);
// Do some stuff with the sent data
}
}
timeoutId = window.setTimeout(function() {
errorTracking.report('Communication with parent page failed');
window.removeEventListener('message', messageHandler);
}, 500);
window.addEventListener('message', messageHandler, false);
window.parent.postMessage({ type: 'iFrameRequest' }, '*');
// ...
Qu'est-ce qui se passe ici, lorsque les coups de délai d'attente et l'erreur est signalée?
Un peu plus d'info & pensées de la mine:
- Je ne contrôle pas sur la page parent moi-même
- Il ne semble pas être un problème "de configuration" générale (CORS etc.) puisque l'erreur se produit sur la même page où il fonctionne la plupart du temps
- Nous ne soutenons pas IE < 10 et d'autres versions de navigateur « anciens » du tout, donc ce sont pas question ici
- Mon erreur outil de reporting fait état d'une multitude de différents navigateurs parmi lesquels sont les dernières versions d'entre eux (49 FF, Chrome 43 sur Android 5, Chrome 53 sur Win et Android 6, Mobile Safari 10, ...)
- Par conséquent, il doesn Il ne semble pas que ce soit un problème lié à des navigateurs spécifiques ou à des versions.
- Le délai d'attente de 500 ms est juste un nombre magique que j'ai choisi que je pensais être complètement sûr ...
Est-ce qui se passe dans un environnement de test ou dans la nature? –
Ça se passe dans la nature et je ne suis pas capable de le reproduire (du moins jusqu'à maintenant). – suamikim
dans ce cas, je me demande si certains utilisateurs finissent sur votre page intérieure en dehors d'un iframe et c'est pourquoi la messagerie ne fonctionne pas? Vous pouvez ajouter du code qui vérifie que la page interne est dans un iframe, un rapide Google a donné quelques réponses SO sur la façon de le faire. –