2014-03-01 89 views
0

例如,我有在Firefox的开放以下页面:如何从Firefox插件获取iframe的内容显示页面?

<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 
... 

+0

我不知道为什么人们失望投你这一点。生病给你下面的解决方案 – Noitidart

+0

我不在乎投票 - 很需要解决。 –

回答

0

这里的代码将打开最近的导航新标签:浏览器窗口,并在负荷会寻找I帧,并得到其内容/

这解决方案更好,因为如果iframe加载,我测试以查看iframe是否存在iframe.contentDocument是否存在,这不是测试这个最准确的方法,我现在不能想到另一个。 如果任何人读取此请您分享一个更好的方法,看看是否iframe中加载与否

但如果iframe要加载它会等待iframe来加载比将记录到浏览器控制台iframe的HTML

拷贝粘贴便签,确保environement设置为“浏览器”,这是测试和工作

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); 
    } 
} 
+0

iframe完全加载页面。在浏览器中,我可以看到它。我所需要的 - 获取我在浏览器中看到的文本。 我是开发附加组件的新手。但我会尽力了解你的解决方案。尽管如此,如果可能需要高性能打开新标签页并重新加载iframe也许它很慢 据我了解 - 只要阅读iframe的内容是不可能的,甚至从附加组件? –

+0

啊好吧,只是目前打开的选项卡?生病发布解决方案 – Noitidart

0

在最近的导航只是当前加载的标签解决方案:浏览器和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); 
    } 
} 
+0

下面做了这个工作的人吗? – Noitidart

+0

我曾经使用Firefox插件生成器,但现在这个服务不再。 所以我必须处理如何从零写入插件。 之前我插入脚本main.js 现在我不知道在哪里把你的解决方案。 如果你可以发送完成的版本,这将是很好的。 我的邮件是: [email protected] 理想情况下需要一个按钮。当它被按下时,所有iframe的内容放在剪贴板上。 我明白,要求不可能。但是,如果你非常善良发送 - 这将是美好的。 –

+0

这是完成版本的人。你想要一个完整的插件。将你的插件上传到github或其他东西,并告诉我你希望我把病痛放在哪里,很乐意把它放在那里。 – Noitidart