javascript - 从不同的域操作 iframe
问题描述
就上下文而言,我正在为我的网站设计一个 Ionic 移动应用程序。但是,我不认为这个问题仅限于 Ionic 框架。
在我的应用程序中,我想显示一个全宽、全高的 iframe,从我的网站加载其中一个页面。这很简单:
<iframe id="myFrame" src="https://example.com/" style="height:100%;width:100%"></iframe>
但是,我现在希望能够从 iframe 中“修剪”或“隐藏”内容(类似于此示例)。在一个 iframe 中,我只想修剪导航栏(一个特定的命名 div)。在另一个 iframe 中,我实际上想修剪不在页面内特定命名 div 内的所有内容。
我已经看到对同一域内的站点使用 jQuery“加载”功能完成了这项工作。但是,对于该应用程序,我很确定我需要将 iframe 源视为一个单独的域,即使我拥有该站点并且该应用程序旨在访问该站点。
我在这里使用 jQuery Ajax看到了一个看起来很有希望的答案,但是我需要更多的指针来执行它。
任何有关如何做到这一点的提示将不胜感激!
解决方案
我不相信这在不同来源的网站之间是可能的。所提出的方法的主要问题不是 CORS,而是跨站点脚本。但是,可以使用postMessage()将消息从父窗口发送到 iframe,执行隐藏在 iframe 源中的 javascript 代码。然后这个 javascript 可以操作页面中的元素。
这是我最终要工作的解决方案:
父窗口
var frame = document.getElementById('myFrame').contentWindow;
sendMessage = function(e) {
frame.postMessage('secret command', 'https://endpoint.com');
}
<iframe data-tap-disabled="true" id="myFrame" src="https://endpoint.com/index.php" onload="sendMessage()"></iframe>
子项(在 iframe 中加载的页面)包含此脚本:
<script>
window.onload = function() {
// A function to process messages received by the window.
function receiveMessage(e) {
if (e.data == "secret command")
//put code here to maniuplate page elements however desired
else
return;
}
// Setup an event listener
window.addEventListener('message', receiveMessage);
}
</script>
最终的结果是,在 iframe 中加载的页面可以根据从父窗口传递的命令以某种方式显示。对于我的使用,iframe 中加载的页面仅在从我的应用程序中加载时才会隐藏导航栏。
推荐阅读
- python - Python 守护程序线程未在 Windows 上退出
- anylogic - 创建代理并添加到总体
- java - Java中的静态变量编译时错误,在C中一次内存分配
- magento - 在 Magento 上开发
- swift - 有没有办法使用 `try?` 获取抛出的错误消息是 Swift 吗?
- apache-kafka - 使用 kafka 和 python-kafka 库无限重新平衡消费者群体?
- java - 如何使用 Servlet 在 Java 应用程序中实现 OAuth2 SSO?
- ruby - HAML if else with table row
- php - Laravel 关系相互匹配(火种案例)
- android - 为什么扫描结果不包含完整的本地名称?