3

Ich entwickle eine Google Chrome-Erweiterung und habe ein ziemlich seltsames Problem. (Ich versuche es so einfach wie möglich zu halten)setInterval mit dem Wert vor dem letzten?

Grundsätzlich erlaube ich dem Benutzer, die Intervallgeschwindigkeit einer setInterval Schleife anzupassen. Ich tue dies mit einem Eingabefeld, das, wenn Daten eingegeben werden, einen localStorage Wert auf keyUp setzt. Der Wert localStorage wird dann über die Message-Passing-API von Chrome an das Inhaltsskript übergeben, und die Schleife setInterval übernimmt diese automatisch.

options.html

<!DOCTYPE html> 
    <head> 
    </head> 

    <body> 
     <input type="text" id="customTime_Input" onKeyUp="setPref_customTime()" /> 

     <!--Call JavaScript functions after all elements are created--> 
     <script type="text/javascript" src="messagePassing.js"></script> 
     <script type="text/javascript" src="options.js"></script> 
    </body> 
</html> 

background.html

<!DOCTYPE html> 
    <head> 
     <script type="text/javascript" src="messagePassing.js"></script> 
     <script type="text/javascript" src="content.js"></script> 
    </head> 

    <body> 
    </body> 
</html> 

messagePassing.js

if(localStorage["scanTime"] == undefined || localStorage["scanTime"] == ""){ 
    localStorage["scanTime"] = 2000; 
} 

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
     if (request.method == "getScanTime"){ 
      sendResponse({data: localStorage["scanTime"]}); 
      console.log("scanTime LS, response: " + localStorage["scanTime"]); 
     } 
    } 
); 

options.js

function setPref_customTime(){ 
    var inputBoxElement = document.getElementById("customTime_Input"); 

    localStorage["scanTime"] = inputBoxElement.value; 
    console.log("scanTime LS, setPref_customTime(): " + localStorage["scanTime"]); 
} 

content.js

window.load = passMessages(); 
function passMessages(){ 
    chrome.extension.sendRequest({method: "getScanTime"}, function(response) { 
     localStorage["scanTime"] = response.data; 
     console.log("scanTime LS, request: " + localStorage["scanTime"]); 
    }); 

    scanPage(); 
} 

function scanPage(){ 
    console.log("scanTime LS, scanPage: " + localStorage["scanTime"]); 

    setInterval(function match(){ 
     console.log("scanTime LS, match: " + localStorage["scanTime"]); 
    }, localStorage["scanTime"]); 
} 

und die Konsole kehrt diese Protokolle nach einem benutzerdefinierten Wert eingegeben wird (es gibt „2000“ für alle Protokolle als Standardwert geladen ist , wie es soll):

scanTime LS, scanPage: 2000 
scanTime LS, scanPage: 2000 
scanTime LS, request: 5000 
scanTime LS, request: 5000 
scanTime LS, scanPage: 2000 
scanTime LS, request: 5000 
scanTime LS, match: 5000 
scanTime LS, match: 5000 
scanTime LS, match: 5000 
scanTime LS, match: 5000 
[etc] 

es zeigt deutlich, dass setInterval ist die neue Wert, sich mit t die Seite und Protokoll aktualisiert mit der Geschwindigkeit des alten Wertes (und es ist kein Benutzerfehler. Ich habe mehrmals sehr unterschiedliche Werte verwendet und hatte die gleichen Ergebnisse). Wie kann ein localStorage mit dem gleichen Namen verschiedene Werte ein paar Zeilen auseinander haben?

Update: Ich habe gerade bemerkt, dass die Konsole alle console.log() Befehle außer "ScanTime LS, Antwort:" meldet. Ist das wichtig?

Antwort

0

Das Problem, das Sie sehen, ist, dass Sie eine Schleife mit 2000 ms haben und dann nur eine neue Schleife mit 5000 ms starten und Sie mit zwei Schleifen auf einmal laufen lassen. Sie müssen die erste abbrechen, wenn Sie die zweite mit clearInterval starten.

So etwas sollte funktionieren.

function scanPage(){ 
    console.log("scanTime LS, scanPage: " + localStorage["scanTime"]); 

    if (localStorage["intervalID"]) { 
     clearInterval(localStorage["intervalID"]); 
    } 

    localStorage["intervalID"] = setInterval(function match(){ 
     console.log("scanTime LS, match: " + localStorage["scanTime"]); 
    }, localStorage["scanTime"]); 
} 
+0

Ja, ich dachte, es war seltsam, dass mehrere Protokolle gemeldet wurden. Ich werde es jetzt versuchen und zu dir zurückkommen. :) – mythofechelon

+0

Nein. Deinen Code eingesteckt und es hat immer noch genau den gleichen Effekt. :/ – mythofechelon

+0

Sie müssen die Intervall-ID möglicherweise zurück in einen int konvertieren. – abraham

Verwandte Themen