从popup.js chrome扩展中调用inject.js方法

时间:2018-02-16 14:41:48

标签: javascript google-chrome-extension

我正在构建一个修改页面DOM的chrome扩展程序。 我注入inject.js并且工作正常 清单:

"manifest_version": 2,
"web_accessible_resources": ["js/inject.js"],
"content_security_policy": "script-src 'self'  'unsafe-eval'; object-src 'self'",
"background": { "scripts": ["js/background.js"] },
  "content_scripts" :[
    {
      "matches" : [
        "*://*.somesite.com/*"
      ],
      "js" : ["js/page.js"],
      "run_at" : "document_idle"

    }
  ],
"page_action": {
    "default_icon": {                    
      "16": "images/icon16.png",           
      "24": "images/icon24.png",           
      "32": "images/icon32.png"            
    },
    "default_title": "some name",      
    "default_popup": "popup.html"   
  }

page.js:

chrome.runtime.sendMessage({type:'showPageAction'});
var s = document.createElement('script');
// TODO: add "script.js" to web_accessible_resources in manifest.json
s.src = chrome.extension.getURL('js/inject.js');
s.onload = function() {
    this.remove();
};
(document.head || document.documentElement).appendChild(s);

background.js:

chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    if(message.type === 'showPageAction'){
        chrome.pageAction.show(sender.tab.id);
    }
});

现在我还有popup.htmlpopup.js,弹出页面中有一个复选框。 点击复选框应调用inject.js 中的某个功能,但我无法实现此功能。

我也试过location.href="javascript:disableFeature(); void 0";但Chrome拒绝了内联JS。

1 个答案:

答案 0 :(得分:1)

感谢@wOxxOm我可以从popup.js中调用inject.js中的方法。
以下是示例代码。

popup.js

// event is triggered in inject.js whenever below code is run
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
            chrome.tabs.sendMessage(tabs[0].id, { method: "enableFeature" }, function (response) {
            });
        });

page.js / content.js

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
        var evt = document.createEvent("CustomEvent");
        evt.initCustomEvent(request.method, true, true);
        document.dispatchEvent(evt);
    });

inject.js

document.addEventListener('enableFeature', function (e)
{
  // add your code here
});