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?
Ja, ich dachte, es war seltsam, dass mehrere Protokolle gemeldet wurden. Ich werde es jetzt versuchen und zu dir zurückkommen. :) – mythofechelon
Nein. Deinen Code eingesteckt und es hat immer noch genau den gleichen Effekt. :/ – mythofechelon
Sie müssen die Intervall-ID möglicherweise zurück in einen int konvertieren. – abraham