javascript - 为 chrome.local.set 重写 localStorage javascript

标签 javascript google-chrome-extension google-chrome-app

我有这段代码正在处理 localStorage html5 调用。但是,它必须针对 Chrome 桌面应用程序进行重写,而且我不知道如何将其移植。

window.fakeStorage = {
  _data: {},

  setItem: function (id, val) {
    return this._data[id] = String(val);
  },

  getItem: function (id) {
    return this._data.hasOwnProperty(id) ? this._data[id] : undefined;
  },

  removeItem: function (id) {
    return delete this._data[id];
  },

  clear: function () {
    return this._data = {};
  }
};

function LocalScoreManager() {
  this.key     = "bestScore";

  var supported = this.localStorageSupported();
  this.storage = supported ? window.localStorage : window.fakeStorage;
}

LocalScoreManager.prototype.localStorageSupported = function () {
  var testKey = "test";
  var storage = window.localStorage;

  try {
    storage.setItem(testKey, "1");
    storage.removeItem(testKey);
    return true;
  } catch (error) {
    return false;
  }
};

LocalScoreManager.prototype.get = function () {
  return this.storage.getItem(this.key) || 0;
};

LocalScoreManager.prototype.set = function (score) {
  this.storage.setItem(this.key, score);
};

我收到的错误是“window.localStorage 在打包应用程序中不可用。请改用 chrome.storage.local。”

到目前为止,我尝试重写它是这样的..但它在这个过程中的某个地方出现了问题。

$(document).ready(function() {


$("body").bind('keyup', function() {
      var number = $(".best-container").val();

if(number == 'undefined'){
 var number = "0";
}

    chrome.storage.local.set({'bestScore': number});
});



chrome.storage.local.get('bestScore', function (result) {
     hello= result.bestScore || 0;
    $(".best-container").val(hello);
});



});

最佳答案

将 localStorage 移植到 chrome.storage 有一个重要的陷阱:chrome.storage 方法是异步的,而 localStorage 访问是同步的。

这意味着:如果您在调用 set 方法的回调之前尝试从 chrome.storage 获取值,该值仍将是未定义的

错误的方式:

chrome.storage.local.set({'key': value});
...
chrome.storage.local.get('key', function(items) {
   if(items.key)         // won't be able to find the key
      alert(items.key);
});

正确方法:

chrome.storage.local.set({'key': value}, function() {
   ...
   chrome.storage.local.get('key', function(items) {
      if(items.key)
         alert(items.key); // will be "value"
   });
});

或者更确切地说:

chrome.storage.local.set({'key': value}, function() {
   doFurtherStuff();
});

function doFurtherStuff() {
   ...
   chrome.storage.local.get('key', function(items) {
      if(items.key)
         alert(items.key); // will be "value"
   });
}

关于javascript - 为 chrome.local.set 重写 localStorage javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23354538/

相关文章:

javascript - 如何在手机中安装 NativeScript 应用程序?

javascript - 了解未登录 Chrome 浏览器时 chrome.storage.sync 的行为

html - 如何在移动 Chrome 应用程序中使用音频

google-chrome - 使用 chrome.runtime.sendmessage 从网页与打包应用程序进行通信

google-chrome-app - 使用 Chrome FileSystem,让用户选择一个目录,在里面加载文件。并将文件保存在该目录中而无需再次提示

javascript - 选中复选框的 Jquery/Javascript 问题通过输入框操作将行从一个表添加到另一个表

javascript - 我正在尝试使用 jquery 或 javascript 回调一个简单的动画

javascript - 使用 Node 打开 MATLAB GUI

javascript - Chrome 扩展 - 获取用户在撰写邮件时输入的文本

javascript - 如何使用 Chrome 扩展程序用于 URL 的更简单的正则表达式检查?