Javascript 无法加载HTML 5 PostMessage/Detect iFrame
我们有一些代码利用HTML5中的新功能来解决跨域通信问题。我正试图找到一种方法来检测我是否将消息发布到一个正确加载其内容的iFrame。如果框架无法正确加载,postMessage不知道这一点,并且会很高兴地将消息发布到无响应的框架中(我假设消息正在传递到框架,而不管是否加载了内容) 这是我们的工作流程:Javascript 无法加载HTML 5 PostMessage/Detect iFrame,javascript,jquery,asp.net,html,Javascript,Jquery,Asp.net,Html,我们有一些代码利用HTML5中的新功能来解决跨域通信问题。我正试图找到一种方法来检测我是否将消息发布到一个正确加载其内容的iFrame。如果框架无法正确加载,postMessage不知道这一点,并且会很高兴地将消息发布到无响应的框架中(我假设消息正在传递到框架,而不管是否加载了内容) 这是我们的工作流程: 用户负载 a、 com/specialpage.aspx依次从另一个域加载一个子iFrame,并将其源设置为代理页面,例如 用户执行一些操作,单击一个按钮 window.postMessage
我有没有办法检查iFrame并告诉它的内容加载是否正确,或者检测postMessage是否正在发送到源代码加载失败的帧?这不是最清晰的答案,但我能够解决我的问题。我发现的是一些旧文档,虽然安全性不允许您从其他帧读取信息,但您可以调用一些函数。在较旧的浏览器中,这被用来欺骗帧,使其相互设置url片段并导致动作发生。这里有一个很好的参考: 由于postMessage是允许的,所以我的代理所做的第一件事就是将“加载的”消息发布到它的父帧(如果它存在的话)。代理看起来像这样:
//tell the parent that we're functional
var data = '{ "action" : "Loaded" }';
if (parent && parent.frames && parent.frames[0] && parent.frames[0].content) {
parent.frames[0].content.postMessage(data, '*');
}
window.addEventListener("message", function (e) {
if (e.domain == undefined) {
//do something
}
}, false);
$(document).ready(function () {
window.addEventListener("message", function (e) {
var args = (e.data && (e.data.length > 0)) ? JSON.parse(e.data) : {};
if (args.action) {
if (args.action == 'Loaded') {
if (typeof ProxyLoaded_success == 'function') {
ProxyLoaded_success(args);
}
}
}
}, false);
});
var proxyLoaded = false;
function ProxyLoaded_success(args) {
proxyLoaded = true;
}
function abc() {
if(proxyLoaded == true) {
//do something here
} else {
alert("proxy didn't load. call support");
}
}
另一方面,我的页面侦听该消息,并在收到该消息时设置一个变量,以显示代理正确加载。如果他们从未收到消息,则所有操作都假定代理不可用,UI会相应地做出反应以阻止用户操作。看起来是这样的:
//tell the parent that we're functional
var data = '{ "action" : "Loaded" }';
if (parent && parent.frames && parent.frames[0] && parent.frames[0].content) {
parent.frames[0].content.postMessage(data, '*');
}
window.addEventListener("message", function (e) {
if (e.domain == undefined) {
//do something
}
}, false);
$(document).ready(function () {
window.addEventListener("message", function (e) {
var args = (e.data && (e.data.length > 0)) ? JSON.parse(e.data) : {};
if (args.action) {
if (args.action == 'Loaded') {
if (typeof ProxyLoaded_success == 'function') {
ProxyLoaded_success(args);
}
}
}
}, false);
});
var proxyLoaded = false;
function ProxyLoaded_success(args) {
proxyLoaded = true;
}
function abc() {
if(proxyLoaded == true) {
//do something here
} else {
alert("proxy didn't load. call support");
}
}