Я использую messsage
событие для общения между окнами браузера. Главное окно отправляет сообщение в iframe, а iframe передает сообщение родителю. Пост всегда работает. php echos возвращает сообщение, используя следующее:
echo "<script>document.write(parent.postMessage(" . json_encode($status) . ", '*'))</script>";
Иногда сообщение получено, а иногда нет. Я уверен, что сообщение отправляется, так как я могу записать сообщение о состоянии, отправленное после echo "<script>...
, Что может быть причиной проблемы?
Упрощенный JavaScript:
// posts login info to an iframe which logs user in
postToIframe(path, parameters, "post");
// wait for server's response
var foundMessage = false;
var messageFn = function (e) {
if (typeof e.data.status !== "undefined"){
_jsonStatus = e.data.status;
foundMessage = true;
}
window.removeEventListener("message", messageFn);
messageFn = undefined;
if (!foundMessage){
_jsonStatus = "Unknown Message: " + v(e.data);
}
};
window.addEventListener("message", messageFn, false);
var timer = new Date().getTime();
var interval = setInterval(function() {
var timer2 = new Date().getTime();
var done = true;
var message;
if (_jsonStatus.indexOf('Error') === 0){
message = _jsonStatus;
console.log(message);
done = true;
} else if (timer2 - timer > 5000){
message = 'Timeout: Failed to get report data'
console.log(message);
if (_this.status){
_this.status(message, "red");
}
done = true;
if (typeof messageFn !== undefined){
window.removeEventListener("message", messageFn);
}
} else if (_jsonStatus.substr(0, 7) == "Success"){
done = true;
} else {
// continue to wait
done = false;
}
if (done == true){
clearInterval(interval);
}
}, 1000)
Упрощенный PHP:
if ($userid > 0){
$status['status'] = "Success. You are logged in.";
} else {
$status['status'] = 'Error: Login Failed';
}
echo "<script>document.write(parent.postMessage(" . json_encode($status) . ", '*'))</script>";
Задача ещё не решена.
Других решений пока нет …