从chrome扩展中获取当前页面的源代码HTML

我有一个Chrome扩展。 我需要从当前页面的HTML源代码进行分析。 我在这里find了各种解决scheme与背景页面和内容脚本,但没有任何帮助我。 这是我到目前为止:
manifest.json的:

{ "name": "Extension", "version": "1.0", "description": "Extension", "browser_action": { "default_icon": "bmarkred.ico", "popup": "Test.html" }, "content_scripts": [ { "matches": ["http://*/*"], "js": ["content.js"] } ], "background": { "page": "backgroundPage.html" }, "permissions": [ "cookies", "tabs", "http://*/*", "https://*/*" ] } 

background.html:

 <html> <head> <script type="text/javascript"> try { chrome.tabs.getSelected(null, function (tab) { chrome.tabs.sendRequest(tab.id, {action: "getSource"}, function(source) { alert(source); }); }); } catch (ex) { alert(ex); } </script> </head> </html> 

content.js:

 chrome.extension.onRequest.addListener(function(request, sender, callback) { if (request.action == "getSource") { callback(document.getElementsByTagName('html')[0].innerHTML); } }); 

警报始终提醒未定义。 即使我改变了content.js文件的callback函数:

 callback('hello'); 

仍然是一样的结果。 我究竟做错了什么? 也许即将在这个错误的方式。 我真的需要的是这个。 当用户打开扩展popup(只有然后),我需要当前页面的HTML,所以我可以分析它。 有什么build议么?

将脚本注入您想要获取源代码的页面,并将其发送回popup窗口….

的manifest.json

 { "name": "Get pages source", "version": "1.0", "manifest_version": 2, "description": "Get pages source from a popup", "browser_action": { "default_icon": "icon.png", "default_popup": "popup.html" }, "permissions": ["tabs", "<all_urls>"] } 

popup.html

 <!DOCTYPE html> <html style=''> <head> <script src='popup.js'></script> </head> <body style="width:400px;"> <div id='message'>Injecting Script....</div> </body> </html> 

popup.js

 chrome.runtime.onMessage.addListener(function(request, sender) { if (request.action == "getSource") { message.innerText = request.source; } }); function onWindowLoad() { var message = document.querySelector('#message'); chrome.tabs.executeScript(null, { file: "getPagesSource.js" }, function() { // If you try and inject into an extensions page or the webstore/NTP you'll get an error if (chrome.runtime.lastError) { message.innerText = 'There was an error injecting script : \n' + chrome.runtime.lastError.message; } }); } window.onload = onWindowLoad; 

getPagesSource.js

 // @author Rob W <http://stackoverflow.com/users/938089/rob-w> // Demo: var serialized_html = DOMtoString(document); function DOMtoString(document_root) { var html = '', node = document_root.firstChild; while (node) { switch (node.nodeType) { case Node.ELEMENT_NODE: html += node.outerHTML; break; case Node.TEXT_NODE: html += node.nodeValue; break; case Node.CDATA_SECTION_NODE: html += '<![CDATA[' + node.nodeValue + ']]>'; break; case Node.COMMENT_NODE: html += '<!--' + node.nodeValue + '-->'; break; case Node.DOCUMENT_TYPE_NODE: // (X)HTML documents are identified by public identifiers html += "<!DOCTYPE " + node.name + (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '') + (!node.publicId && node.systemId ? ' SYSTEM' : '') + (node.systemId ? ' "' + node.systemId + '"' : '') + '>\n'; break; } node = node.nextSibling; } return html; } chrome.runtime.sendMessage({ action: "getSource", source: DOMtoString(document) });