【问题标题】:How from firefox addon to get the content of iframe the displayed page?如何从firefox插件中获取iframe显示页面的内容?
【发布时间】:2014-03-01 01:26:50
【问题描述】:

例如,我在 Firefox 中打开了以下页面:

<html>
   <head></head>
   <body> text
       <iframe id="wikipedia" src="http://en.wikipedia.org"></iframe>
   </body>
</html>

如何从我的插件中获取 iframe 中显示的维基百科文本?

...
Welcome to Wikipedia,
the free encyclopedia that anyone can edit.
4,462,480 articles in English
...

等等

【问题讨论】:

  • 我不知道为什么人们对此投了反对票。我在下面给你解决方案
  • 我不在乎投票 - 非常需要解决。

标签: javascript firefox iframe firefox-addon


【解决方案1】:

此代码在最近的 navigator:browser 窗口中打开一个新选项卡,并在加载时查找 iframe 并获取其内容/

这个解决方案更好,因为如果 iframe 正在加载,我会测试它是否加载 iframe.contentDocument 是否存在,这不是最准确的测试方法,我现在想不出另一个. 如果其他人看到此内容,请分享一个更好的方法来查看 iframe 是否已加载

但如果 iframe 正在加载,它将等待 iframe 加载,而不是将 iframe 的 html 记录到浏览器控制台

将此复制粘贴到暂存器,确保环境设置为“浏览器”,这是经过测试和工作的

Components.utils.import('resource://gre/modules/Services.jsm')
var aDOMWindow = Services.wm.getMostRecentWindow('navigator:browser');
var newTabBrowser = aDOMWindow.gBrowser.getBrowserForTab(aDOMWindow.gBrowser.loadOneTab('http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_tolocaletimestring', {
    inBackground: false
}));
newTabBrowser.addEventListener('load', function onloadFunc() {
    Services.appShell.hiddenDOMWindow.console.log('tab loaded');
    newTabBrowser.removeEventListener('load', arguments.callee, true);
    var doc = newTabBrowser.contentDocument;
    var win = doc.defaultView;
    var iframes = doc.querySelectorAll('iframe');
    Services.appShell.hiddenDOMWindow.console.log('number of iframes in this tab = ' + iframes.length);
    [].forEach.call(iframes, function (frm, i) {
        logIframeHtml(frm, i);
    });

}, true);

function logIframeHtml(iframe, i) {

    iframe.removeEventListener('DOMContentLoaded', logIframeHtml, true); //this line removes the event listneer if it had one

    var iframeDoc = iframe.contentDocument;
    if (!iframeDoc) {
        Services.appShell.hiddenDOMWindow.console.log('iframe ' + i + ' is not fully loaded yet as it its contentDocument does not exist');
        iframe.addEventListener('DOMContentLoaded', logIframeHtml, true);
    } else {
        var iframeInnerHtml = iframeDoc.documentElement.innerHTML;
        Services.appShell.hiddenDOMWindow.console.log('iframe ' + i + ' innerHTML = ' + iframeInnerHtml);
    }
}

【讨论】:

  • 页面上的 iframe 已完全加载。在浏览器中我可以看到它。我所需要的 - 获取我在浏览器中看到的文本。我是开发附加组件的新手。但我会尝试了解您的解决方案。尽管如此,如果可能的话,需要高性能。打开新标签并重新加载 iframe 可能会很慢据我了解 - 即使从附加组件中也无法读取 iframe 的内容?
  • 啊,好吧,所以只是当前打开的标签?生病在下面发布该解决方案
【解决方案2】:

在最近的导航器中刚刚加载的选项卡的解决方案:浏览器和 iframe 已经加载

Components.utils.import('resource://gre/modules/Services.jsm')
var aDOMWindow = Services.wm.getMostRecentWindow('navigator:browser');
var iframes = aDOMWindow.gBrowser.contentDocument.querySelectorAll('iframe');
Services.appShell.hiddenDOMWindow.console.log('number of iframes in this tab = ' + iframes.length);
[].forEach.call(iframes, function (frm, i) {
        var iframeInnerHtml = frm.contentDocument.documentElement.innerHTML;
});

function logIframeHtml(iframe, i) {

    iframe.removeEventListener('DOMContentLoaded', logIframeHtml, true); //this line removes the event listneer if it had one

    var iframeDoc = iframe.contentDocument;
    if (!iframeDoc) {
        Services.appShell.hiddenDOMWindow.console.log('iframe ' + i + ' is not fully loaded yet as it its contentDocument does not exist');
        iframe.addEventListener('DOMContentLoaded', logIframeHtml, true);
    } else {
        var iframeInnerHtml = iframeDoc.documentElement.innerHTML;
        Services.appShell.hiddenDOMWindow.console.log('iframe ' + i + ' innerHTML = ' + iframeInnerHtml);
    }
}

此解决方案适用于当前选项卡,但不信任 iframe 是否已加载:

Components.utils.import('resource://gre/modules/Services.jsm')
var aDOMWindow = Services.wm.getMostRecentWindow('navigator:browser');
var iframes = aDOMWindow.gBrowser.contentDocument.querySelectorAll('iframe');
Services.appShell.hiddenDOMWindow.console.log('number of iframes in this tab = ' + iframes.length);
[].forEach.call(iframes, function (frm, i) {
    logIframeHtml(frm, i);
});

function logIframeHtml(iframe, i) {

    iframe.removeEventListener('DOMContentLoaded', logIframeHtml, true); //this line removes the event listneer if it had one

    var iframeDoc = iframe.contentDocument;
    if (!iframeDoc) {
        Services.appShell.hiddenDOMWindow.console.log('iframe ' + i + ' is not fully loaded yet as it its contentDocument does not exist');
        iframe.addEventListener('DOMContentLoaded', logIframeHtml, true);
    } else {
        var iframeInnerHtml = iframeDoc.documentElement.innerHTML;
        Services.appShell.hiddenDOMWindow.console.log('iframe ' + i + ' innerHTML = ' + iframeInnerHtml);
    }
}

【讨论】:

  • 我以前使用firefox addons builder,但是现在这个服务已经不行了。所以我必须处理如何从零开始编写插件。在我将脚本插入 main.js 之前,现在我不知道将您的解决方案放在哪里。如果您能发送完成的版本,那就太好了。我的邮件是:2014Alexander@mail.ru 理想情况下需要一个按钮。当它被按下时,所有 iframe 的内容都放在剪贴板上。我明白问不可能。但如果你这么好心,那就太好了。
  • 这是汉化版。你想要一个完整的插件。将您的插件上传到 github 或其他东西,并告诉我您希望我将其放置在哪里,很乐意为您放置它。
  • 刚在 GitHub 上注册。但不知道如何在那里上传。所以我给你寄了一封信,里面有我的插件压缩包。到 noitidart@gmail.com。
  • 我整天都在更新页面 - 等待你的回答:)
  • 到 noitidart@gmail.com 我发送带有附件的信函。也许你有 Skype?但是,如果您将完整的工作插件发送到我的邮件中,可能会更容易:2014alexander@mail.ru
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
相关资源
最近更新 更多