2016-12-08 9 views
1

Chrome拡張機能を使用して、メインコンテキストを呼び出すために拡張機能ボタンをクリックしてgmail.jsにアクセスできるようにします。マイbackground.jsです:Chrome拡張機能のbackground.jsからmain.jsにメッセージが送信されない

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.browserAction.onClicked.addListener(function(tab) { 
     chrome.tabs.sendMessage(tab.id, {greeting: "hello"}); 
    }); 
}); 

私main.jsは次のとおりです。

var gmail; 

function refresh(f) { 
    if ((/in/.test(document.readyState)) || (typeof Gmail === undefined)) { 
    setTimeout('refresh(' + f + ')', 10); 
    } else { 
    f(); 
    } 
} 

var main = function() { 
    gmail = new Gmail(); 

    chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
    console.log(sender.tab ? "from a content script:" + sender.tab.url : "from the extension"); 
    }); 
} 

refresh(main); 

マイcontent.jsさ:

var j = document.createElement('script'); 
j.src = chrome.extension.getURL('jquery-1.10.2.min.js'); 
(document.head || document.documentElement).appendChild(j); 

var g = document.createElement('script'); 
g.src = chrome.extension.getURL('gmail.js'); 
(document.head || document.documentElement).appendChild(g); 

var s = document.createElement('script'); 
s.src = chrome.extension.getURL('main.js'); 
(document.head || document.documentElement).appendChild(s); 

私のmanifest.jsonをです:

{ 
    "name": "Test", 
    "version": "1.0", 
    "description": "Test Gmail chrome extension", 
    "background": { 
    "scripts": ["background.js"], 
    "persistent": false 
    }, 
    "browser_action": { 
    "default_title": "Export current Gmail message", 
    "default_icon": "email_16x16.png" 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["https://mail.google.com/*"], 
     "js": ["content.js"] 
    } 
    ], 
    "web_accessible_resources": [ 
    "jquery-1.10.2.min.js", 
    "background.js", 
    "gmail.js", 
    "main.js" 
    ], 
    "manifest_version": 2 
} 

拡張機能がロードされると、このエラーが表示されます。

Uncaught TypeError: Cannot read property 'addListener' of undefined 
at <anonymous>:9:27 
at refresh (chrome-extension://lnndcckhmkllogdhmmlhfdoehbfgipdj/main.js:14) 
at <anonymous>:1:1 

ありがとうございました。

+0

完了しました。 – Scott

+0

あなたの編集に関する唯一の悪い点は、私の答えが今や意味をなさないことです。それを避けるようにしてください。必要に応じて、新しい質問をして、この質問に戻ることができます。また、 'content.js'には何がありますか? – Teepeemm

+0

content.jsが追加されました。これはおそらくこれの鍵です。 @テペーム、それについて申し訳ありません、私は別の質問をしていたはずです。 – Scott

答えて

0

window.postMessage現在のウィンドウへのポストは、バックグラウンドスクリプトの場合の目に見えない背景htmlウィンドウです。これはあなたが見ているページではないので、受け取られません。

代わりにmessage passingを使用する必要があります。あなたはブラウザ(?またはページ)アクションを持っているので、あなたのbackground.jsは、次のようになります。

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.sendMessage(tab.id, {greeting: "hello"}); 
}); 

(および将来の質問のために、Makyenは正しいです:それは本当にmcveを持っているのに役立ちます。この場合、それは次のようになり。 10行目のマニフェストと2行のjavascriptファイルがあります。

+0

私は[mcve]などを求めました。なぜなら、スクリプトが実行されているコンテキストが質問からはっきりしていないからです。 * main.js *はコンテンツスクリプトである可能性が高いが、ページスクリプト、あるいは何か他のものであってもよい。 * main.js *がすでに他のソースからメッセージを受け取っているという事実は、より複雑なことを意味します。したがって、私は、最も一般的な可能性が「正常」よりも低い可能性があると考えました。また、[mcve]を持っていると、バックグラウンドスクリプトからコンテンツスクリプトへの通信方法を尋ねる他の質問の重複ではありません。 – Makyen

+0

この回答について: 'chrome.tabs.sendMessage()'から送信されたメッセージを受け取るには、OPに 'chrome.runtime.onMessage'リスナーが必要であることを説明するとよいでしょう。そのようなメッセージは 'window.addEventListener(" message "、...)'から受信されません。 – Makyen

+0

FYI:* background.js *というスクリプトを用意しても、それが実際にバックグラウンドスクリプトであるとは限りません。名前はそれを可能性が高いものにしますが、保証するものではありません。例として、私は最近、[コンテンツスクリプトが* background3.js *と呼ばれた]という質問に遭遇しました(http://stackoverflow.com/q/40917541/3773011)。 – Makyen