将本地存储转换为 Chrome 存储以进行获取和设置

2024-04-05

我有一个用户脚本,我已将其转换为 Chrome 扩展程序,供使用 Chrome 的用户使用。用户脚本设置主题并有可供选择的主题,但仅使用 localStorage,除主子域之外的任何内容都将具有默认主题。我希望使用 Chrome 的存储 API 能够缓解这种情况,但我对如何让它发挥作用感到困惑。

这是原始代码:

  hasGM: typeof GM_deleteValue !== "undefined",
  get: function(name)
  {
    var val = this.hasGM ?
          GM_getValue(NAMESPACE + name) :
          localStorage.getItem(NAMESPACE + name);

    if (val != undefined)
      return JSON.parse(val);

    return defaultConfig[name];
  },
  set: function(name, val)
  {
    name = NAMESPACE + name;

    if (typeof val !== "number")
      val = JSON.stringify(val);

    return this.hasGM ?
        GM_setValue(name, val) :
        localStorage.removeItem(name, val),
        localStorage.setItem(name, val);
  }
},

这是我到目前为止所得到的,其中 val 被打印为未定义,即使我可以在控制台中完美地执行 result[NAMESPACE + name] 的 console.log 和值。

  hasGM: typeof GM_deleteValue !== "undefined",
  get: function(name)
  {
    names = NAMESPACE + name;
    var val = this.hasGM ?
          GM_getValue(names) :
          chrome.storage.local.get(names, function(result){return result[NAMESPACE + name];});

    if (val != undefined)
      return JSON.parse(val);
    console.log(val);
    return defaultConfig[name];
  },
  set: function(name, val)
  {
    name = NAMESPACE + name;
    setObj={};
    setObj[name]=val;


    if (typeof val !== "number" && this.hasGM)
      val = JSON.stringify(val);
    return this.hasGM ?
        GM_setValue(name, val) :
        chrome.storage.local.remove(name),
        chrome.storage.local.set(setObj);
  }

基本上我就是无法理解它并且需要一些帮助

    for (var key in defaultConfig)
      $SS.conf[key] = parseVal(key, this.get(key, function(_arg) {
        var val;

        val = _arg[key];
        return callback(val);
      }));

这是你的东西could做,我省略了hasGM让事情变得更简单的东西:

get: function(name, callback) {

  names = NAMESPACE + name;
  chrome.storage.local.get(names, function(val){
    if (val != undefined) {
      callback(JSON.parse(val));
    } else {
      callback(defaultConfig[name]);
    }
  })
},

所以这意味着调用你的代码get抱歉,功能也必须改变,但确实没有其他办法。您可以(大多数人都会)将同步内容转换为使用回调模式,如下所示:

get: function(name, callback) {

  names = NAMESPACE + name;
  if(this.hasGM) {
    callback(GM_getValue(names));
  } else {
    chrome.storage.local.get(names, function(val){
      if (val != undefined) {
        callback(JSON.parse(val));
      } else {
        callback(defaultConfig[name]);
      }
    })
  }
},

处理异步函数的一些规则:

  • 他们不返回任何东西! (除非它们是基于承诺的)
  • 在回调中返回一些东西是没有意义的,它不会去任何地方!
  • 回调外部的代码通常会在回调之前运行,始终假设回调将在稍后的某个时间执行,因此您不能依赖回调中发生的任何变量设置/获取!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将本地存储转换为 Chrome 存储以进行获取和设置 的相关文章

  • Jquery文件上传插件进度条

    这个插件 https github com blueimp jQuery File Upload wiki管理网页中的文件上传 并且可以在上传过程中添加很多 UI 元素 您创建一个输入文件类型元素 然后绑定 js 文件 使用实例化代码和 w
  • JS 在两个或多个点之间画线

    我需要在两个标签或标签之间画一条线 Example http caitriona github io connect the dots http caitriona github io connect the dots 我需要做这样的事情
  • 如何精确缩放已翻译的d3地图

    我有一张已翻译的地图 以使其正确适合画布 我正在尝试实现一种缩放它的方法 它确实有效 但是当您放大时它会远离中心 而不是以鼠标甚至画布为中心 这是我的代码 function map data total views var xy d3 ge
  • 如何在单页应用程序中使用 #-URL?

    本文 http danwebb net 2011 5 28 it is about the hashbangs提出了一个非常令人信服的论点 因为 URL 是长期存在的 它们被添加书签并传递 所以它们应该是有意义的 并且使用哈希进行真正的路由
  • mocha.opts 已弃用,如何迁移到 package.json?

    我正在开发一个大型项目 自从上周我更新了摩卡以来 现在我们收到警告 DeprecationWarning 通过 mocha opts 进行的配置已被弃用并且 将从 Mocha 的未来版本中删除 使用 RC 文件或 改为 package js
  • setTimeout 用于加载下拉列表中的项目

    我在用setTimeout克服 中提到的缓慢处理脚本警告 禁用 Internet Explorer 中的长时间运行脚本消息 https stackoverflow com questions 4460263 disabling the lo
  • 弃用警告:时刻构造回退到 js Date

    我正在尝试转换这个日期时间 150423160509 这是 utc 日期时间 改为以下格式 2015 04 24 00 05 09 本地时区 通过使用 moment js var moment require moment timezone
  • Javascript 无法正确排序 DECIMAL 数字

    我有一些代码可以按字母顺序对名称进行排序 我遇到的问题是它处理小数的方式 它对名称进行排序 如下所示 我宁愿它按数字递增 DOG 1 0510 DOG 1 1031 DOG 11 1792 DOG 12 0920 DOG 12 1170 D
  • 我可以用一个简单的函数制作一个迭代器吗? (没有生成器或 Symbol.iterator)

    我一直在尝试使用普通函数创建一个迭代器 而不使用生成器或使用Symbol iterator用于学术目的的协议 为此 我创建了一个函数 它返回一个带有next参数 但尝试将其作为iterable的论证for of循环会产生不需要的结果 这是到
  • 从 ES6 模块导入函数表达式或函数声明有什么区别?

    据我了解 参见第 16 3 2 1 节 http exploringjs com es6 ch modules html ES6 允许函数 类导出操作数使用不同的语法 区别在于导出的函数是否需要在导入时解释为函数声明 在这种情况下 您可以编
  • 如何将节点 sqlite3 与 q (promise) 一起使用

    我正在尝试将 Promise 与 sqlite3 一起使用 这是我的源代码的一部分 this deleteTag function tag project var db this db if project return q nfcall
  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • Chrome 跨域 PATCH 请求不起作用

    我有一个带有 REST Api 的网站 现在我正在创建一个浏览器扩展 它将从某些页面收集数据并将它们发送回 REST Api 因为我希望我的扩展能够与 Firefox 和 Chrome 兼容 并且易于维护 所以我将实际代码作为脚本标记注入到
  • Moment.js 动态更新时间(以秒为单位)

    我试图显示时钟 that 每秒更新一次 e g 2015 年 1 月 5 日 12 05 01 它似乎对我来说工作得很好 对于相同的代码 并且只有 moment min js 指向v2 11 0 看看代码 来源 MilkyWayJoe va
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • Kendo 刷新 (DropDownList.refresh()) 不起作用错误未定义

    我试图在另一个 DropDownList 更改后刷新下拉列表 但 Refresh 方法未定义错误正在升级 我尝试再次读取数据源 它显示它正在加载 但数据仍然相同 帮助解决这个问题请 Code DropDownList1 change fun
  • IE9 中的无效字符 DOM 异常

    以下这段 JS 曾经在 IE8 中工作 现在在 IE9 中失败 document createElement 我收到以下异常 SCRIPT5022 DOM 异常 INVALID CHARACTER ERR 5 上面这段代码是不是不符合标准呢
  • 如何获取从 Express (Node.js) 中的表单传递的数据

    我想获取使用表单从页面传递的数据 并在重定向的页面中使用该数据 我的客户端有这个表格
  • 如何更改数据表中标题单元格的内容?

    我正在使用数据表 http datatables net plugin 在我的可排序列上 我想用按钮替换列文本 但是这样做 oSettings aoColumns i nTh text 我可以检索相应列的文本 但是 oSettings ao
  • 为什么 phantomjs 不能在 MacOS Sierra 中工作?

    我们正在使用phantomjs 1 9 1 macosx phantomjs 2 0 0 macosx哪一个工作得很好OS X 埃尔卡皮坦更新后macOS 塞拉利昂它会引发以下错误 phantomjs 1 9 1 macosx phanto

随机推荐