从 iframe(同一域)中获取 iframe(节点)的实例
getting instance of iframe (node) from within iframe (same domain)
我有一种情况需要知道代码来自 运行 的哪个 iframe 实例。 “父”文档本身是由代码生成的,我无法访问生成它的机制(并且它会定期重新生成)。我的文档在页面上的多个 iframe 中被加载 不止一次 在不同的位置(iframe 不是兄弟)。我希望脚本的每个实例都能够访问加载该脚本实例的 iframe 节点。
这是大概的想法。对于每个“a.html”的 运行 代码,我希望它知道它在 运行 中的 iframe ELEMENT。
在此示例中,将有来自“a.html”的相同代码 运行 的三个实例。我希望能够查看父文档(我可以 - 这不是跨域问题)并找出 iframe 的 ID 或其他一些动态分配的 属性 - 所以我需要 ELEMENT 参考iframe 本身。
请求 iframe 的“父”元素不会通知父 javascript 实例哪个元素正在执行该请求 AFAIK。有吗?
我不能只遍历所有 iframe 并查找我的页面已知来源“a.html”,因为会有多个相同路径的实例,以及与我无关的其他 iframe - 当前执行上下文是哪个 IFRAME?
我不能做的事情:
- 修改父页面
- 修改 iframe 网址,包括名称或使用搜索参数
- 在 iframe 上指定 ID 或数据集值。
我能做的事:
- 修改子 iframe 的内容
目前我唯一的方法是让“a.html”生成一个(希望)唯一值并将其存储在文档中,然后要求父上下文迭代所有 iframe 并寻找该值在子上下文中,然后当它匹配时就会有调用请求的节点。
想法?
所以我学到了一些东西。
- javascript 中似乎没有办法“知道”哪个 iframe 触发了事件。
console.trace()
不会告诉您脚本执行的 dom 上下文,即使其中一些脚本在一个文档中执行而另一个函数在父文档中执行。
- 像往常一样,我想太多了,试图查看脚本在哪个节点中执行,或者事件来自哪里,而不是确定我已经知道的东西——window 名称 属性(幸运的是,这在我的情况下是独一无二的)和 dom 个节点。迭代父 iframe,直到它匹配我需要的那个。
在子 iframe (a.html) 中:
const n = window.name; // 'window' is the iframe document a.html
window.parent.getIframe = function (name) {
// in the context of the function, 'this' is the parent 'window' element.
const iframes = this.document.getElementsByTagName('iframe');
for (let i = 0; i < iframes.length; i++) {
if (iframes[i].name == name) {
return iframes[i];
}
}
return null;
}
const frame = window.parent.getIframe(n);
let prop = frame.dataset.someValue ... etc
我有一种情况需要知道代码来自 运行 的哪个 iframe 实例。 “父”文档本身是由代码生成的,我无法访问生成它的机制(并且它会定期重新生成)。我的文档在页面上的多个 iframe 中被加载 不止一次 在不同的位置(iframe 不是兄弟)。我希望脚本的每个实例都能够访问加载该脚本实例的 iframe 节点。
这是大概的想法。对于每个“a.html”的 运行 代码,我希望它知道它在 运行 中的 iframe ELEMENT。
在此示例中,将有来自“a.html”的相同代码 运行 的三个实例。我希望能够查看父文档(我可以 - 这不是跨域问题)并找出 iframe 的 ID 或其他一些动态分配的 属性 - 所以我需要 ELEMENT 参考iframe 本身。
请求 iframe 的“父”元素不会通知父 javascript 实例哪个元素正在执行该请求 AFAIK。有吗?
我不能只遍历所有 iframe 并查找我的页面已知来源“a.html”,因为会有多个相同路径的实例,以及与我无关的其他 iframe - 当前执行上下文是哪个 IFRAME?
我不能做的事情:
- 修改父页面
- 修改 iframe 网址,包括名称或使用搜索参数
- 在 iframe 上指定 ID 或数据集值。
我能做的事:
- 修改子 iframe 的内容
目前我唯一的方法是让“a.html”生成一个(希望)唯一值并将其存储在文档中,然后要求父上下文迭代所有 iframe 并寻找该值在子上下文中,然后当它匹配时就会有调用请求的节点。
想法?
所以我学到了一些东西。
- javascript 中似乎没有办法“知道”哪个 iframe 触发了事件。
console.trace()
不会告诉您脚本执行的 dom 上下文,即使其中一些脚本在一个文档中执行而另一个函数在父文档中执行。 - 像往常一样,我想太多了,试图查看脚本在哪个节点中执行,或者事件来自哪里,而不是确定我已经知道的东西——window 名称 属性(幸运的是,这在我的情况下是独一无二的)和 dom 个节点。迭代父 iframe,直到它匹配我需要的那个。
在子 iframe (a.html) 中:
const n = window.name; // 'window' is the iframe document a.html
window.parent.getIframe = function (name) {
// in the context of the function, 'this' is the parent 'window' element.
const iframes = this.document.getElementsByTagName('iframe');
for (let i = 0; i < iframes.length; i++) {
if (iframes[i].name == name) {
return iframes[i];
}
}
return null;
}
const frame = window.parent.getIframe(n);
let prop = frame.dataset.someValue ... etc