問題:コンテンツ スクリプトとして挿入しています
。background.js
(Chromeは名前を気にしません.content_scriptsの配列に入れるだけですjs
)したがって、基本的に、jQueryを使用してWebページDOMを直接操作できます(最初の試行のように)-コンテンツスクリプトでそれができるため、ただし、 (2回目の試行のように)使用できませんchrome.tabs.*
-コンテンツスクリプトではそれができないためです。
解決策:
バックグラウンド ページから Web ページの DOM を操作することはできないため、コンテンツ スクリプトを使用して操作する必要があります。
background.js
背景ページ (またはできればイベント ページ) として定義します。
- 新しいファイルを定義します (たとえば
content.js
、コンテンツ スクリプトとして)。
- リスナー (バックグラウンド ページ)から、 chrome.tabs.sendMessage
chrome.tabs.onUpdated
を使用して、対応するタブのコンテンツ スクリプトにメッセージを送信します。
- コンテンツ スクリプトで、バックグラウンド ページからのメッセージをリッスンし ( chrome.runtime.onMessageを使用)、実行します。
$("body").before("<code>");
(注: 代わりのアプローチがたくさんあるので、特定の要件により適したものを選択する必要があります。)
完全を期すために、上記で説明した内容に基づいたサンプル拡張のコードを以下に示します。
manifest.json で:
{
"manifest_version": 2,
"name": "Test Extension",
"version": "0.0",
"background": {
"persistent": false,
"scripts": ["./bg/background.js"]
},
"content_scripts": [{
"matches": ["*://*/*"],
"js": ["./fg/content.js"],
"run_at": "document_start",
}],
"permissions": ["tabs"]
}
background.js で:
chrome.tabs.onUpdated.addListener(function(tabId, info, tab) {
console.log("One of my tabs updated: ", info);
if (info.url) { // <-- Not all `info` objects contain a `url` field
// (Also, if a tab is refreshed, the URL is not changed,
// so you will never get and `info` object with a `url` field)
console.log("...pretending to make an AJAX request...");
var pageURL = info.url;
setTimeout(function() {
// ...let's simulate an AJAX request...
// ...now let's pretend out data arrived...
chrome.tabs.sendMessage(tabId, {
cmd: "doYourStuff",
kind: "fancy"
});
console.log("Message sent !");
}, 2000);
}
});
content.js で:
chrome.runtime.onMessage.addListener(function(msg) {
console.log("Someone sent us this: ", msg);
if (msg.cmd && (msg.cmd == "doYourStuff")) {
alert("Watch me doing " + kind + " stuff !");
}
});