如何将消息发布到 iFrame 中?
How to postMessage into iFrame?
我正在开发一个 Chrome 扩展,用于我自己的 Web 应用程序,处理网页(包括跨域网页),加载到我应用程序主页上的 iFrame
。所以我必须发送消息,包含要处理的页面的 URL,从我的主页到内容脚本,注入目标 iFrame
以访问已处理页面的 window.
我尝试实施 here 中描述的方法。以下是所有涉及文件的基本部分:
index.html
:
...
<head>
...
<script type="text/javascript" src="base.js"></script>
</head>
<body>
<div>
<input type="text" id="page_url"> <input type="button" id="get_page" value="Get page">
</div>
<iframe id="cross_domain_page" src=""></iframe>
</body>
base.js
:
(function() {
"use strict";
function pageProcessing() {
let urlButton = window.document.getElementById("get_page");
urlButton.addEventListener("click", () => {
let url = window.document.getElementById("page_url").value;
window.postMessage(
{
sender: "get_page_button1",
message: url
},
"*"
);
window.postMessage(
{
sender: "get_page_button2",
message: url
},
"*"
);
});
}
window.document.addEventListener('readystatechange', () => {
if (window.document.readyState == 'complete') {
pageProcessing();
}
}
);
})();
manifest.json
:
{
"manifest_version": 2,
"name": "GetPage",
"version": "0.1",
"content_scripts": [
{ "js": ["main.js"], "matches": ["<all_urls>"] },
{ "js": ["frame.js"], "matches": ["<all_urls>"], "all_frames": true, "match_about_blank": true }
],
"permissions": ["activeTab"]
}
main.js
:
(function() {
"use strict";
window.isTop = true;
})();
frame.js
:
(function() {
"use strict";
window.addEventListener("message", (event) => {
if (event.data &&
event.data.sender == "get_page_button1") {
if (window.isTop) {
alert("Main window alert");
} else {
alert("Frame window alert 1");
}
}
});
if (!window.isTop) {
window.addEventListener("message", (event) => {
if (event.data &&
event.data.sender == "get_page_button2") {
alert("Frame window alert 2");
}
});
}
})();
问题是,当我单击 "get_page" 按钮时,我看到的唯一警报是主 window 警报。至于我的理解,这意味着从主 window 发布的消息没有到达注入到 iFrame
.
的内容脚本
我的脚本有什么问题以及如何解决这个问题?
window.postMessage 在您的网络应用程序中发送到主文档的 window
,而不是 iframe 的。
指定 iframe 的 window 对象:
document.getElementById('cross_domain_page').contentWindow.postMessage(.......)
或者,您可以切换到更安全的 externally_connectable 消息传递。
我正在开发一个 Chrome 扩展,用于我自己的 Web 应用程序,处理网页(包括跨域网页),加载到我应用程序主页上的 iFrame
。所以我必须发送消息,包含要处理的页面的 URL,从我的主页到内容脚本,注入目标 iFrame
以访问已处理页面的 window.
我尝试实施 here 中描述的方法。以下是所有涉及文件的基本部分:
index.html
:
...
<head>
...
<script type="text/javascript" src="base.js"></script>
</head>
<body>
<div>
<input type="text" id="page_url"> <input type="button" id="get_page" value="Get page">
</div>
<iframe id="cross_domain_page" src=""></iframe>
</body>
base.js
:
(function() {
"use strict";
function pageProcessing() {
let urlButton = window.document.getElementById("get_page");
urlButton.addEventListener("click", () => {
let url = window.document.getElementById("page_url").value;
window.postMessage(
{
sender: "get_page_button1",
message: url
},
"*"
);
window.postMessage(
{
sender: "get_page_button2",
message: url
},
"*"
);
});
}
window.document.addEventListener('readystatechange', () => {
if (window.document.readyState == 'complete') {
pageProcessing();
}
}
);
})();
manifest.json
:
{
"manifest_version": 2,
"name": "GetPage",
"version": "0.1",
"content_scripts": [
{ "js": ["main.js"], "matches": ["<all_urls>"] },
{ "js": ["frame.js"], "matches": ["<all_urls>"], "all_frames": true, "match_about_blank": true }
],
"permissions": ["activeTab"]
}
main.js
:
(function() {
"use strict";
window.isTop = true;
})();
frame.js
:
(function() {
"use strict";
window.addEventListener("message", (event) => {
if (event.data &&
event.data.sender == "get_page_button1") {
if (window.isTop) {
alert("Main window alert");
} else {
alert("Frame window alert 1");
}
}
});
if (!window.isTop) {
window.addEventListener("message", (event) => {
if (event.data &&
event.data.sender == "get_page_button2") {
alert("Frame window alert 2");
}
});
}
})();
问题是,当我单击 "get_page" 按钮时,我看到的唯一警报是主 window 警报。至于我的理解,这意味着从主 window 发布的消息没有到达注入到 iFrame
.
我的脚本有什么问题以及如何解决这个问题?
window.postMessage 在您的网络应用程序中发送到主文档的 window
,而不是 iframe 的。
指定 iframe 的 window 对象:
document.getElementById('cross_domain_page').contentWindow.postMessage(.......)
或者,您可以切换到更安全的 externally_connectable 消息传递。