加载后如何从 iframe 中选择内容

Posted

技术标签:

【中文标题】加载后如何从 iframe 中选择内容【英文标题】:How to select content from an iframe after loaded 【发布时间】:2016-06-04 16:49:14 【问题描述】:

我制作了一个 Chrome 扩展程序,它使用我的 YouTube 订阅页面的 <iframe> 加载我的新标签页(我解决了 SAMEORIGIN 问题)并希望将文档的一个元素复制到另一个 <div> ,准确地说是#content 元素。这是我的代码:

Background.html

<html> 
    <head>   
        <script type="text/javascript" src="jquery-2.2.0.min.js"></script>
        <script type="text/javascript" src="script.js"></script>
        <script type="text/javascript" src="window.js"></script>
    </head>
    <body>
        <iframe id="left"  name="left"></iframe>
        <div id="canvas"></div>
    </body>
</html>

Window.js

$(document).ready(function()
    var $left = $('#left');

    $left.attr('src', 'https://www.youtube.com/feed/subscriptions');

    var $leftDoc = $left.contentWindow.document;
    $leftDoc.querySelector('#content').clone().appendTo('#canvas');
);

Script.js

chrome.webRequest.onHeadersReceived.addListener(
    function(info) 
        var headers = info.responseHeaders;
        for (var i = headers.length - 1; i >= 0; --i) 
            var header = headers[i].name.toLowerCase();
            if (header == 'x-frame-options' || header == 'frame-options') 
                headers.splice(i, 1); // Remove header
            
        
        return 
            responseHeaders: headers
        ;
    , 
        urls: ['*://*/*'], // Pattern to match all http(s) pages
        types: ['sub_frame']
    , ['blocking', 'responseHeaders']
);

就像现在一样,YouTube 已加载,但我无法获取 &lt;iframe&gt; 中的文档,因为它将该属性称为 undefined。我试图让div#content 加载而无需其他任何东西,以便从我的新标签页导航。有任何想法吗?谢谢!

编辑:#contentdiv,顺便说一下,它会显示您的订阅供稿。

【问题讨论】:

【参考方案1】:

您似乎在 jQuery 对象上使用了诸如 contentWindow 之类的本机方法,而不是等待 iframe 加载,您想要的是更多

$(document).ready(function()
    var $left = $('#left');

    $left.on('load', function() 
        $(this).contents().find('#content').clone().appendTo('#canvas');
    );

    $left.attr('src', 'https://www.youtube.com/feed/subscriptions');
);

【讨论】:

太好了,这行得通!我有一个后续问题。我没有收到与SAMEORIGIN 问题类似的错误。发生这种情况时,我是否应该添加另一个侦听器来再次调用script.js?完整的错误是:Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "chrome-extension://XYZ" from accessing a frame with origin "https://www.youtube.com". The frame requesting access has a protocol of "chrome-extension", the frame being accessed has a protocol of "https". Protocols must match. 不太确定,但是 script.js 添加了一个事件侦听器,我认为每次收到标头时都会触发,并且会为每个请求回避同源策略?如果您在更改 iframe 的源等时遇到同源错误,我认为您可能必须再次更改标题。同样,我从来没有在扩展程序中绕过同源策略,所以不确定它是如何工作的。

以上是关于加载后如何从 iframe 中选择内容的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iframe 中获取内容类型?

Fancybox iframe 内容 - 如何从父级访问 CSS?

如何扩展 iFrame/将内容从 iFrame 移动到 div? [复制]

IOS15 升级后 Iframe 内容未加载到 Iphone 中

iframe如何使用javascript替换内容?

确定 IFrame 已加载后何时呈现 iFrame 内容