从Chrome扩展程序访问当前选项卡DOM对象

时间:2010-12-07 08:43:21

标签: javascript

我一直在寻找如何实现这一目标。我发现了一些最引人注目的文章

Accessing Current Tab DOM Object from "popup.html"?

然而,我对JavaScript非常陌生并且使用chrome扩展而且我已经走到了尽头。 我的猜测是没有收到回复,这解释了为什么document.write("Hellp") 不工作。任何帮助解决这个问题将不胜感激。

我有三个主要文件

的manifest.json

{
 "name": "My First Extension",
 "version": "1.0",
 "description": "The first extension that I made.",
 "browser_action": 
 {
  "default_icon": "icon.png",
  "popup": "popup.html"
 },
 "permissions":
 [
  "tabs"
 ],
 "content_scripts": 
 [{
  "matches": ["<all_urls>"],
  "js": ["dom.js"]
 }]
}

popup.html

<html>     
 <body>     
 </body>    
 <script>

 chrome.tabs.getSelected(null, function(tab)
 {
  // Send a request to the content script.
  chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, function(response)
  {
   document.write("Hello");
   document.write(response.title)
  });
 });

 </script>
</html>

dom.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) 
{
 if (request.action == "getDOM")
  sendResponse({dom: document.getElementsByTagName("body")[0]});
 else
  sendResponse({}); // Send nothing..
});

2 个答案:

答案 0 :(得分:3)

我认为这是一个较老的问题,但是没有答案,我遇到了同样的问题。也许这是一个安全功能,但您似乎无法返回DOM对象。但是,您可以返回文本。所以对于dom.js:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
 if (request.action == "getDOM")
   sendResponse({dom: document.body.innerHTML});
 else
   sendResponse({}); // Send nothing..
});

答案 1 :(得分:1)

我正在开发一个扩展,它将元素的html作为文本传输,然后使用innerHTML重新构建元素。 希望澄清如何从当前页面获取DOM元素**

这就是我获得DOM的方式:

<强>的manifest.json

{
    "manifest_version": 2,
    "version" : "2.0",
    "name": "Prettify search",
    "description": "This extension shows a search result from the current page",
  "icons":{
    "128": "./img/icon128.png",
    "48": "./img/icon48.png",
    "16": "./img/icon16.png"
  },
 "page_action": {
    "default_icon": "./img/icon16.png",
    "default_popup": "popup.html",
    "default_title": "Prettify Results!"
  },

// If the context is the Mach url = sends a message to eventPage.js: active icon
  "content_scripts": [
    {
      "matches": ["http://www.whatever.cat/*"],
      "js": ["./js/content.js", "./js/jquery-3.1.1.min.js"]
    }
  ],

  "permissions": [
    "tabs",
    "http://www.whatever.cat/*",
    "http://loripsum.net/*"  //If you need to call and API here it goes
  ],

  "background":{
    "scripts": ["./js/eventPage.js"],
    "persistent": false
  }

}

<强> Popup.js

    $(function() {
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {

            chrome.tabs.sendMessage(tabs[0].id, {action: "getPage"}, function(response) {

                var importedCode = response.searchResults;
                var fakeHtml = document.createElement( 'html' );
                fakeHtml.innerHTML = importedCode; // recieved String becomes html


          });
        });

<强> Eventpage.js

>Able/disable the extension button 
chrome.runtime.onMessage.addListener(function(req, sender, resp) {
    if(req.todo === 'showPageAction'){

        chrome.tabs.query({active:true, currentWindow:true}, function(tabs) {
            chrome.pageAction.show(tabs[0].id);
        });
    }
});

<强> content.js

  

Content_Scripts无法使用Chrome API启用或停用&gt;扩展程序图标。我们将消息传递给Event_Page,js,他确实可以   使用Api

chrome.runtime.sendMessage({ todo: "showPageAction"});
window.onload = function() {

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.action == "getPage"){
        sendResponse({searchResults: document.body.innerHTML});
      }
  });  
};

<强> popup.html

  

只需链接popup.js

即可