2017-08-02 145 views
1

我試圖將消息發送到後臺,並接收回內容腳本。 enter image description herechrome.runtime.onMessage.addListener在內容腳本中未定義

enter image description here

這是我content_script.js

init(); 
function init() { 
    function notifyBackgroundPage(event) { 
     chrome.runtime.sendMessage(chromeExtID, { 
      greeting: "Greeting from the content script" 
     }); 
    } 

    window.addEventListener("click", notifyBackgroundPage); 

    // accept messages from background 
    // below line addListener is undefined 
    chrome.runtime.onMessage.addListener(function backgroundListener(request, sender, sendResponse) { 
     console.log("BgExt.js says: " + request); 
    }); 
    } 

BgExt.js

define([], function GmailExt() { 

    return { 
     start: function() { 

      chrome.runtime.onMessage.addListener(
       function (request, sender, sendResponse) { 
        console.log('inside response'); 
        // to send back your response to the current tab 
        chrome.tabs.query({active: true, currentWindow: true}, function (tabs) { 
         chrome.tabs.sendMessage(tabs[0].id, {farewell: response}, function (response) { 
         }); 
        }); 
        return true; 
       } 
      ); 
     } 
    }; 
}); 

這GmailExt文件內all.js加載(而所有.js插入到index.ht中毫升)

require([ 
    "base_host/chrome/Server", 
    "kernel/Kernel", 
    "hydra/version", 
    "base_host/chrome/StartupConfig", 
    "hydra/apps", 
    "dojo/_base/Deferred", 
    "talkto_util/common", 
    "dojo/i18n!base_host/nls/CommonStrings", 
    "base_host/chrome/BgExt", 
    "dojo/domReady!" 
], function (Server, Kernel, version, StartupConfig, apps, Deferred, talktoUtil, nls, BgExt) { 
    document.getElementById("logoMessage").innerText = nls.simple_secure_text; 
    var host = new Server(); 
    //if app and not extension 
    chrome.browserAction && chrome.browserAction.onClicked.addListener(function() { 
     Deferred.when(kernel.onInit(), function() { 
      host.appManager.showShell(); 
     }); 
     return true; 
    }); 

    BgExt.start(); 
}); 

client_base /主機/鉻/ index.html中

<!DOCTYPE HTML> 
<html> 
<head> 
    <!-- Background Page for Extension/app --> 
    <title>Flock</title> 
    <meta charset="UTF-8"> 
    <!--BUILD_REPLACE_BLOCK_START--> 
    <!-- This block will be remove by build. 
    All the files from libs/common/files.txt would be prepended to dojo.js --> 
    <script type="text/javascript" src="../../../hydra/src/libs/common/dojoConfig.js"></script> 
    <script type="text/javascript" src="../../../hydra/src/libs/common/underscore.js"></script> 
    <script type="text/javascript" src="../../../hydra/src/libs/common/underscore-ext.js"></script> 
    <!--BUILD_REPLACE_BLOCK_END--> 
    <script type="text/javascript" src="../../../hydra/src/libs/dojotoolkit/dojo/dojo.js"></script> 
    <script type="text/javascript" src="all.js"></script> 
</head> 
<body> 

</body> 
</html> 

的manifest.json

{ 
    "manifest_version": 2, 
    "content_security_policy": "script-src 'self' 'unsafe-eval' https://j.maxmind.com https://ssl.google-analytics.com https://flock-apps.flock.co https://flock-apps.flock-staging.co https://flock-apps.flock.com https://flock-apps.flock-staging.com; object-src 'self'", 
    "minimum_chrome_version": "22", 

    "options_page": "client_base/host/chrome/static/crx_browser_actions/index.html?app=preferences", 
    "name": "__MSG_extName__", 
    "description": "__MSG_extDescription__", 
    "background": { 
    "page": "client_base/host/chrome/index.html", 
    "persistent": true 
    }, 

    "browser_action": { 
    "default_popup": "/gmail_ext/popup.html" 
    }, 
    "web_accessible_resources": [ 
    "client_base/host/chrome/static/blank.gif", 
    "gmail_ext/icons.png", 
    "gmail_ext/jquery-3.2.1.min.js", 
    "gmail_ext/gmail.js", 
    "gmail_ext/content_script.js" 
    ], 
    "permissions": [ 
    "<all_urls>", 
    "unlimitedStorage", 
    "notifications", 
    "idle", 
    "background", 
    "tabs", 
    "activeTab" 
    ], 
    "optional_permissions": [ 
    "clipboardWrite" 
    ], 
    "externally_connectable": { 
    "matches": [ 
     "https://*.google.com/*", 
     "http://localhost/*", 
    ] 
    }, 
    "content_scripts": [ 
    { 
     "matches": [ 
     "*://mail.google.com/*" 
     ], 
     "css": [ 
     "/gmail_ext/content_script.css" 
     ], 
     "js": [ 
     "/gmail_ext/loader.js" 
     ], 
     "run_at": "document_end" 
    } 
    ], 
    "version": "1.0" 
} 
+1

控制檯顯示錯誤發生在VM2279這意味着代碼不是內容腳本。顯然,腳本中的某些內容會將代碼注入腳本元素中,該腳本元素在頁面上下文中運行 - 它不再是內容腳本,因此無法訪問chrome.runtime.onMessage。 – wOxxOm

+0

@wOxxOm你說的對,但是我的''''''''''''''''''只是爲了確保'init函數'只有在所有的AJAX完成後才運行。 – STEEL

+0

請編輯問題爲主題:包括一個複製問題的[mcve]。對於Chrome擴展程序或Firefox WebExtensions,這通常意味着包含您的* manifest.json *以及一些背景,內容和/或彈出式腳本/ HTML。尋求調試幫助的問題(「爲什麼代碼不按我想要的方式工作?」)必須包括:(1)期望的行爲,(2)特定問題或錯誤,以及(3)重現它所需的最短代碼*在問題本身*。另請參閱:[我可以在這裏詢問什麼主題?](http://stackoverflow.com/help/on-topic)和[問]。 – Makyen

回答

0

我固定它。解決方案是因爲我使用loader.js加載我的內容腳本和jQuery通過chrome.extension.getURL('/gmail_ext/content_script.js');

而且使用「content_script.js」作爲web_accessible_resources只loader.js有權訪問鉻對象。

是的,它的一個道場項目,你可以看到這裏的工作擴展:https://chrome.google.com/webstore/detail/flock-chat-for-teams-and/enfaahabcinohafeakbliimmoholjeip?hl=en

我使用頁面事件現在是這裏顯示:https://developer.chrome.com/extensions/content_scripts#host-page-communication

截至loader.js頂部我添加如下:

function initPort() { 
    var contentScriptPort, 
     chromeExtID = "lddaepjihbpbfpegjhjnkffjmmoigphe"; 

    contentScriptPort = chrome.runtime.connect(chromeExtID); 

    contentScriptPort.onMessage.addListener(function (message) { 
     // Send data back to content script received from Background. 
     window.postMessage({type: "FROM_BACKGROUND", emails: message}, "*"); 
    }); 

    window.addEventListener("message", function _postMessage(event) { 
     // We only accept messages from ourselves 
     if (event.source != window) 
      return; 

     if (event.data.type && (event.data.type == "FROM_PAGE")) { 
      // console.log("Content script received: " + event.data.emails); 
      contentScriptPort.postMessage(event.data); 
     } 
    }, false); 
} 

initPort(); 
相關問題