Ich erstelle eine Chrome-Erweiterung, die ich aktivieren/deaktivieren möchte. Ich habe erfolgreich ein Popup gemacht, das genau das tut. Das Problem ist, wenn ich die Erweiterung neu lade (oder wenn der Benutzer es anfänglich herunterlädt), dass meine Inhaltsskripts standardmäßig ausgeschaltet sind. I könnte einfach das Inhaltsskript in die manifest.json injizieren, aber das führt dazu, dass das Inhaltsskript für jede neue Registerkarte injiziert wird - was ich nicht will. Das Verhalten sollte so sein, dass wenn Sie die Erweiterung herunterladen/neu laden, diese standardmäßig aktiviert ist, aber dann können Sie sie aktivieren/deaktivieren und dies gilt für jede neue Registerkarte. Ich habe versucht, eine Initialisierung in background.js zu setzen, aber das wird offenbar nicht beim Start aufgerufen.Inject-Skript über die Erweiterung programmgesteuert neu laden (Chrome-Erweiterung)
manifest.json
{
"manifest_version": 2,
"name": "Rotten Tomatoes Search",
"description": "This extension searches rotten tomatoes with highlighted text",
"version": "1.0",
"browser_action": {
"default_icon": "./icons/icon_on.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab",
"<all_urls>",
"background"
],
"background": {
"scripts": ["background.js"],
"persistent": true
},
"content_scripts": [{
"js": ["jquery-1.12.3.min.js"],
"matches": ["<all_urls>"]
}]
}
background.js
var isExtensionOn = true;
chrome.tabs.executeScript({code: "console.log('backgournd hit...')"});
turnItOn();
chrome.extension.onMessage.addListener(
function (request, sender, sendResponse) {
if (request.cmd == "setOnOffState") {
isExtensionOn = request.data.value;
}
if (request.cmd == "getOnOffState") {
sendResponse(isExtensionOn);
}
});
function turnItOn() {
chrome.browserAction.setIcon({path: "./icons/icon_on.png"});
chrome.tabs.executeScript({file:"openTooltipMenu.js"});
//$('#toggle').text('disable');
}
popup.js
document.addEventListener('DOMContentLoaded', function() {
// show different text depending on on/off state (for icon, handled by having default icon)
chrome.extension.sendMessage({ cmd: "getOnOffState" }, function(currentState){
if (currentState) $('#toggle').text('disable');
else $('#toggle').text('enable');
});
// allow user to toggle state of extension
var toggle = document.getElementById('toggle')
toggle.addEventListener('click', function() {
//chrome.tabs.executeScript({code: "console.log('toggled...')"});
chrome.extension.sendMessage({ cmd: "getOnOffState" }, function(currentState){
var newState = !currentState;
// toggle to the new state in background
chrome.extension.sendMessage({ cmd: "setOnOffState", data: { value: newState } }, function(){
// after toggling, do stuff based on new state
if (newState) turnOn();
else turnOff();
});
});
})
});
function turnOn() {
chrome.browserAction.setIcon({path: "./icons/icon_on.png"});
chrome.tabs.executeScript({file:"openTooltipMenu.js"});
$('#toggle').text('disable');
}
function turnOff() {
chrome.browserAction.setIcon({path: "./icons/icon_off.png"});
chrome.tabs.executeScript({code: "$('body').off();"});
$('#toggle').text('enable');
}
popup.html
<some code>
<script src="./jquery-1.12.3.min.js"></script>
<script src="./popup.js"></script><style type="text/css"></style>
</head>
<body>
<div class="popupMenu" style="list-style-type:none">
<div class="header">Rotten Tomatoes Search</div>
<hr>
<div class="menuEntry" id="toggle"></div>
</div>
</body>
</html>
Sie sollten 'chrome.storage' verwenden, um persistente Daten zu speichern: https://developer.chrome.com/extensions/storage –
@RobM., Danke aber löst das mein Problem? Wo kann ich mein Initialisierungsskript ausführen, wenn nicht in background.js? – joshlevy89