javascript - 如何检测外框是否已经加载到单页应用程序中?
问题描述
我正在创建一个包含 3 个部分的单页 Web 应用程序:
- 一个标题
- 导航侧边栏
- 显示主页内容的 i-frame
标题和侧边栏不应在第一页加载后重新加载 - 只有 i-frame。我正在使用 History API(即 pushstate)来处理历史记录和导航。
我遇到的问题是,如果有人直接在网站中的任何页面输入 url,我想加载标题和侧边栏,然后加载他们在 i-frame 中访问的页面。如果他们已经在页面上并且他们单击指向不同页面的链接,我只希望它在 i-frame 中加载新页面。我也想在不弄乱导航历史的情况下做到这一点。
如何检测到这一点并正确加载内容?
解决方案
在 iframe 中,您将使用一小段 Javascript 来查看window.parent和window.top ,如下所示:
iframe 中的 JavaScript
if (window.parent == window.top) {
// user loaded the iframe, go to parent
window.location = "<your parent url>" + "?iframe=" + window.location;
}
然后在父级加载由 指示的 iframe $_GET['inframe']
:
父级中的 PHP
if (isset($_GET['inframe']) {
loadIframe($_GET['inframe']);
}
我在哪里编写了一个loadIframe()
函数,因为你没有提供任何代码,所以你必须用你自己的代码替换它。
出于安全原因,您可能希望使用filter_input()过滤输入:
父级中的 PHP
if (isset($_GET['inframe']) {
loadIframe(filter_input(INPUT_GET, 'inframe'], FILTER_VALIDATE_URL);
}
并进行进一步检查。通过这种方式,您可以防止人们使用该iframe
参数在您的代码中注入恶意内容,或者仅加载他们喜欢的任何 iframe。
您可以使用 AJAX 来代替 iframe 来加载内容,并完全避免这个问题。然而,iframe 允许以更传统的方式加载内容。
推荐阅读
- php - 使用 Doctrine ORM 的顶级 EXISTS 查询
- reactjs - 防止渲染发送的 ReactJs 组件
- spring - Spring JPA- DB2 ZOS - 在关闭 DB2 LPAR 期间观察到 -104 错误
- unity3d - MRTK:InputSimulation 也可以模拟手部网格输入吗?
- python-3.x - 如何在imshow中将日期时间的双轴与不可见的浮点数/整数轴对齐?
- r - 提取两个标题标签之间的所有文本和标签(
- android - 系统忘记了 Android 10 和 11 上的默认启动器设置(某些默认设置保留)
- python - Python根据图像名称以排序方式将打开CV的图像保存到数组中
- javascript - 计算文件夹中的图像数量(排序)
- reactjs - React redux 在获取新数据之前显示先前状态的旧数据