javascript - 镜子和跨 iframe 的复选框状态
问题描述
我有一个 iFrame 可以在其内部加载其父页面。因此,同一页面的两个副本;一个在 iFrame 中,一个不在。
我正在尝试镜像主页和 iFrame 之间的<input type="checkbox">
checked/unchecked
状态。<details>
open/closed
我已经解决了每个部分(请参阅// comments
问题),触发click
事件:
对于复选框,我有
let boxes = document.querySelectorAll('input[type="checkbox"]');
for (let box of boxes)) {
myIFrame.getElementById(box.id).checked = box.checked; // works
if (inIFrame) {parent.getElementById(box.id).checked = document.getElementById(box.id).checked; // doesn't work
}
(inIFrame
上面的条件只是检查页面是否加载到 iFrame 中的测试的简写)
而对于<details>
let detailEls = document.querySelectorAll('details');
for (let i = 0; i < detailEls.length; i++) {
myIFrame.querySelectorAll('details')[i].open = querySelectorAll('details')[i].open; // works, but 1-click behind
}
但奇怪的是,这滞后了一个点击。因此,如果我单击、单击、单击以在主页上打开详细信息 A、B、C,则只有 A、B 会在 iFrame 中打开——下一次单击,C 将打开。
如果不清楚,这是我的问题的摘要:
- 为什么
<details>
国家落后?这似乎与复选框的策略相同,但结果不同。 - 为什么选中状态只能从主页镜像到 iFrame,反之则不行?
谢谢!
解决方案
这是一个演示您想要的行为的复制品,通常遵循您的模式:
https://stackblitz.com/edit/so-mirror-iframe?file=lib/script.js
没有完整的代码很难说,但这里有一些需要考虑的事情:
如果您在
click
细节上使用事件,那可能会给您带来“滞后”行为。事实证明,对于详细信息,click
事件发生在其open
属性更新之前。当您的同步器运行时,您刚刚单击的那个总是以错误的状态读取。- 请改用该
toggle
事件,它会在属性更新后触发。open
- 请改用该
假设它不是第一个代码块中的错字,
parent
是对父窗口的引用,而不是它的文档。- 改为使用
parent.document.getElementById
。
- 改为使用
推荐阅读
- python - 我们可以在 for 循环的变量中添加所有元素吗?
- python - 如何理解通过跳转服务器创建到远程主机的 SSH 隧道并使用 Python 自动化
- html - 如何在标签中使用带有图标类的 CSS 类
- json - 反应原生:无法解析 json 参数
- schema - 使用 biztalk 转换将两个模式合并为一个模式(作为主细节)
- angular - 如何在所有组件中使用选定的下拉字段
- google-bigquery - 如何减少对 BigQuery 的 oAuth2 应用程序权限?
- ios - 在不使用 Cocoa pod 的情况下集成 firebase SDK 时获取框架(GoogleMobileVision/FirebaseMLCommon)问题
- javascript - 任务完成时触发
- docker - docker-compose 容器启动后打印状态