【问题标题】:getting instance of iframe (node) from within iframe (same domain)从 iframe(同一域)中获取 iframe(节点)的实例
【发布时间】:2022-01-17 10:59:56
【问题描述】:

我有一种情况,我需要知道代码是从哪个 iframe 实例运行的。 “父”文档本身是由代码生成的,我无法访问生成它的机制(并且它会定期重新生成)。我的文档在页面上的多个 iframe 中被加载不止一次,位于不同的位置(iframe 不是兄弟)。我希望脚本的每个实例都能够访问加载该脚本实例的 iframe NODE。

这是一个粗略的想法。对于每个“a.html”的运行代码,我希望它知道它正在运行的 iframe ELEMENT。

在此示例中,将有三个从“a.html”运行的相同代码实例。我希望能够查看父文档(我可以——这不是跨域问题)并找出 iframe 的 ID 或其他一些动态分配的属性——所以我需要 iframe 本身的 ELEMENT 引用.

请求 iframe 的“父”元素不会通知父 javascript 实例哪个元素正在执行该请求 AFAIK。有吗?

我不能只迭代所有 iframe 并查找我的页面已知来源“a.html”,因为同一路径的多个实例以及与我无关的其他 iframe - IFRAME 是当前执行上下文?

我不能做的事:

  1. 修改父页面
  2. 修改 iframe 网址,包括名称或使用搜索参数
  3. 在 iframe 上指定 id 或数据集值。

我能做的事:

  1. 修改子 iframe 的内容

我目前唯一的方法是让“a.html”生成一个(希望如此)唯一值并将其存储在文档中,然后要求父上下文迭代所有 iframe 并在子上下文中查找该值,那么当它匹配时,就会有正在调用请求的节点。

想法?

【问题讨论】:

  • 节点的本质是非常模糊的。它是一个元素吗?文本?它是如何突然生成的?通过函数?事件?您正在寻找的这个值到底是什么?数组?目的?数字?字符串?
  • node 是加载了a.html 实例的iframe element。一个自动化的外部进程根据外部事件生成引用a.html 的文件。当我在a.html 中运行的脚本知道加载a.html 实例的iframe 是什么时,它将从该iframe element 中读取一个属性(它的id 或其数据集集合中的一个值),然后使用在a.html 内运行的脚本中的那个值来处理。 a.html 可能多次嵌入同一页面,每个 iframe 将有不同的 id,并在每个实例上运行。

标签: javascript html iframe


【解决方案1】:

所以我学到了一些东西。

  1. 在 javascript 中似乎没有办法“知道”哪个 iframe 触发了事件。 console.trace() 不会告诉您脚本在其中执行的 dom 上下文,即使其中一些在一个文档中执行而另一个函数在父文档中执行。
  2. 像往常一样,我通过尝试查看脚本在哪个节点内执行或事件来自何处而不是识别我已经知道的 - 窗口名称属性(幸运的是,在我的情况下是唯一的),并且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

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2017-10-20
    • 2010-10-31
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多