【问题标题】:Accessing <iframe> upon an event in the iframe - with a chrome extension根据 iframe 中的事件访问 <iframe> - 使用 chrome 扩展
【发布时间】:2012-10-15 17:37:00
【问题描述】:

使用扩展程序,我想在 iframe 中发生特定事件时测量 iframe 的偏移量(相对于顶部窗口)。 这包括不同来源的 iframe。

似乎需要两件事:

  1. 在 iframe 自己的内容文档中捕获事件
  2. 在其父窗口中查找 iframe 对应的 DOM 元素 (&lt;iframe&gt;) 并测量其偏移量

我可以在所有 iframe 中运行会捕获特定事件的内容脚本,但我无法在不同来源的 iframe 中识别 iframe 的相应 DOM 元素,因为在这些情况下,我被拒绝访问“window.frameElement” '。

有什么想法吗? 我也许可以在 iframe 的内容脚本的上下文中查找具有与“window.location.href”相对应的“src”属性的元素,但“window.location.href”不会是唯一标识符。 .. 还是会?

【问题讨论】:

    标签: google-chrome iframe google-chrome-extension


    【解决方案1】:

    您可以采取以下方法:

    1. 使用清单文件中"content_scripts""all_frames":true 标志在所有帧中执行内容脚本。
    2. 绑定一个执行逻辑的message事件监听器。
    3. 为相关触发器绑定事件侦听器。
    4. 每当第 3 步中的事件被触发时,使用if (top === window) 来确定我们是否在顶部窗口内。

      • 如果是,我们就完成了。
      • 如果没有,请使用parent.postMessage({currentTotal: ... }, '*'); 将数据传递给父框架。第二步中的message 事件侦听器应检测到此事件,对其进行处理,然后重复第三步。

    我已经解释了如何解决这个问题。一个更有用的代码sn -p:你需要识别源框架。为此,我们使用&lt;iframe&gt; 对象的contentWindow 属性与事件对象的source 属性进行比较:

    window.addEventListener('message', function(event) {
        if (top === window) {
            // do something with e.data
        } else {
            var iframes = document.getElementsByTagName('iframe');
            for (var i=0; i<iframes.length; i++) {
                if (iframes[i].contentWindow === event.source) {
                    // Found frame; measure offset, and pass data to parent frame
                    var data = e.data;
                    e.data += iframes[i].getBoundingClientRect().top; // example
                    parent.postMessage({currentTotal: data}, '*');
                    break;
                }
            }
        }
    });
    

    有了这些提示,您应该能够自己编写完整的代码。要测量偏移量,请使用getBoundingClientRect 方法。为了完整起见,我还提供了其他相关文档的链接:window.postMessageContent scripts (manifest)

    【讨论】:

    • 问题是在内容脚本上下文中未定义与父级不同来源的 iframe 的父级。
    • @rsanchez 注入您的脚本,使其在页面上下文中运行。有关注入的更多详细信息,请参阅Building a Chrome Extension - Inject code in a page using a Content script
    • chrome 检查器很有用,因为它允许在任一上下文中运行代码:所有 'top'、'parent' 和 'iframes[i].contentWindow' 在扩展上下文中都未定义,并抛出 'unsafe javascript...' 在页面上下文中 - 处理具有不同来源的 iframe 时。
    • @afters iframes[i].contentWindow 可用于严格比较而不会引发任何错误。正如我在之前的评论中所说,在页面中注入代码。我已经为此创建了一个详细的答案(请参阅之前评论中的链接),所以我不会在我的答案中重复这一点。如果您在尝试时遇到困难,请回复并解释您在没有运气的情况下尝试了什么。
    • @RandyHall 回复您的第一条评论:如果您尝试将消息从内容脚本发送到托管在另一个页面中的内容脚本,origin 参数将没有多大用处。这个“另一个页面”可以读取用于您的内容脚本的消息。 (注意:如果您没有注意到:此问答是关于 Chrome 扩展的)
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2012-07-08
    • 2017-10-22
    • 1970-01-01
    • 2015-02-28
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多