2016-05-25 4 views
0

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> 
+0

Sie sollten 'chrome.storage' verwenden, um persistente Daten zu speichern: https://developer.chrome.com/extensions/storage –

+0

@RobM., Danke aber löst das mein Problem? Wo kann ich mein Initialisierungsskript ausführen, wenn nicht in background.js? – joshlevy89

Antwort

0

Ich habe das Problem herausgefunden. Mein architektonischer Ansatz war falsch. Man sollte das content_script global einfügen, aber überprüfen Sie mit dem Skript, ob etwas getan werden soll oder nicht. Um es deutlicher zu machen, holen Sie sich im Skript den Status von der Hintergrundseite und machen Sie etwas darauf basierend. Zuvor habe ich das Skript nur injiziert, nachdem das Popup geladen wurde oder erst einmal, als der Hintergrund initialisiert wurde. Außerdem muss man alle Registerkarten in allen Fenstern durchlaufen, um den Status in allen Registerkarten zu aktualisieren (falls das gewünscht ist).

+0

Sie können sich auch [diese Antwort] (http://stackoverflow.com/a/23895822/934239) ansehen, was erklärt, was mit Ihren Skripten passiert, wenn die Erweiterung (neu) geladen wird, während Registerkarten vorhanden sind öffnen. – Xan

Verwandte Themen