2017-02-18 2 views
0

Ich habe eine kleine Erweiterung gemacht, um Bilder auf einer Website zu blockieren, die ich über das Popup ein- und ausschalten kann. Ich habe alles außer dem Teil, wo es überprüft, ob es die Bilder blockieren sollte oder nicht. Dies ist, was ich im Moment habe:Wenn Bedingung in background.js nicht funktioniert

manifest.json

{ 
    "manifest_version": 2, 

    "name": "Name", 
    "description": "Description", 
    "version": "1.0", 
    "icons": { "256": "256icon.png", 
       "128": "128icon.png", 
       "64": "64icon.png", 
       "48": "48icon.png", 
       "32": "32icon.png", 
       "16": "16icon.png" }, 

    "browser_action": { 
     "default_title": "Name", 
     "default_popup": "popup.html" 
    }, 

    "background": { 
     "scripts": [ 
      "background.js" 
     ], 
     "persistent": true 
    }, 

    "permissions": [ 
     "webRequest", 
     "webRequestBlocking", 
     "activeTab", 
     "tabs", 
     "webNavigation", 
     "management", 
     "http://*/*", 
     "https://*/*", 
     "*://static2.gamekit.com/upload/*" 
    ] 
} 

popup.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title></title> 
    <link rel="stylesheet" href="popup.css"> 
</head> 

<body> 
    <script src="popup.js"></script> 
    <div class="PopUp" id="PopUp"> 
     <div class="onoffswitch"> 
      <input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch"> 
      <label class="onoffswitch-label" for="myonoffswitch"> 
       <span class="onoffswitch-inner"></span> 
       <span class="onoffswitch-switch"></span> 
      </label> 
     </div> 
    </div> 
</body> 
</html> 

popup.js

document.addEventListener('DOMContentLoaded', function() { 
    'use strict'; 
    var bg = chrome.extension.getBackgroundPage(); 
    document.getElementById("myonoffswitch").checked = bg.onoffstate; 
}); //gets checkbox state from background.js and applies it 

function updatecheck() { //onclick function of the checkbox 
    'use strict'; 
//puts checkbox state in var (checkstate) 
    var checkstate = document.getElementById("myonoffswitch").checked; 
//sends checkbox state to background.js 
    chrome.runtime.sendMessage({onoffstate: checkstate}, function (response) { 
     console.log(response.bg_onoffstate); //response from background.js 
    }); 
} 

document.addEventListener('DOMContentLoaded', function() { 
    'use strict'; 
    document.getElementById('myonoffswitch').addEventListener('click', updatecheck); 
}); //adds onclick event to checkbox 

background.js

var onoffstate; 

chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) { 
     'use strict'; 
     onoffstate = request.onoffstate; //puts checkbox state from popup.js into var 
     sendResponse({bg_onoffstate: onoffstate}); //debug response 
    } 
); 


if (onoffstate === true) { //check if checkbox is checked 
    chrome.webRequest.onBeforeRequest.addListener(
     function (details) { 
      'use strict'; 
      return {cancel: true}; 
     }, 
     {urls: ["*://static2.gamekit.com/upload/*"]}, 
     ["blocking"] //blocks images 
    ); 
} 

(Entschuldigung für unordentlichen Code)

Beim Laden der popup.html zieht es den gespeicherten Zustand (true/false) aus dem background.js und wendet es auf das Kontrollkästchen. Wenn Sie das Kontrollkästchen (un) in der popup.html aktivieren, sendet es seinen Status an die background.js. Der gespeicherte Zustand im Hintergrund.js bestimmt dann, ob die Bilder blockiert werden sollen oder nicht. Und hier funktioniert es nicht richtig. Der Code, der die Bilder selbst blockiert, funktioniert von selbst. Aber wenn ich es in die if Funktion stelle, wird es nicht auslösen. Ich habe versucht, andere Sachen hineinzuschieben, um zu sehen, ob es es ausführen würde, aber es tat es nicht.

Ich habe gesucht, ob ich irgendwo einen Tippfehler hatte, aber nichts gefunden habe. JSLint zeigt auch nichts.

Ich hoffe jemand kann herausfinden, was los ist.

Link zu Dateien für einen leichteren Zugang: Here

+1

Es sieht so aus, als würden Sie Ihre Bedingung treffen, bevor Ihr Listener den Status erhält. Versuchen Sie, var onoffstate mit einer Zeichenfolge zu initialisieren, und drucken Sie dann die Variable var in Ihrem if-Bedingungsblock aus, um festzustellen, ob sie geändert wurde. –

+0

Verschieben Sie das if-Gerät in den Hörer! Oder wickeln Sie es in eine Funktion und rufen Sie die Funktion innerhalb des Ereignis-Listeners auf! –

+0

@ibrahimmahrir, Das hat es funktioniert, danke. Ich kann nicht glauben, dass ich etwas so Einfaches übersehen habe. –

Antwort

0

Sie Ihre wenn Bedingung innerhalb onMessage Ereignishandler nicht hinzufügen (Wie in den Kommentaren vorgeschlagen). Dadurch wird der Ereignishandler mehrmals onBeforeRequest gebunden.

Lösung: Entfernen Sie Ihren Zustand und geben Sie einfach den Zustand innerhalb onBeforeRequest Handler zurück.

chrome.webRequest.onBeforeRequest.addListener(
    function (details) { 
     'use strict'; 
      return {cancel: onoffstate}; 
    }, 
    {urls: ["*://cdn.sstatic.net/Sites/*"]}, 
    ["blocking"] //blocks images 
); 
Verwandte Themen