javascript - 如何使用 WebExtensions 存储 API 恢复复选框的状态

标签 javascript html checkbox firefox-addon firefox-addon-webextensions

我正在构建一个 Firefox Web 扩展,我想为其用户提供一些可以选中/取消选中的选项。复选框的状态通过 WebExtensions 存储 API 保存在本地,但我不太确定如何恢复每个选项的保存状态。

这是options.html 文件:

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
  </head>

<body>
    <form method="post">
        <fieldset>
                <legend>My favorite veggies</legend>
                        <input type="checkbox" name="eggplant" id="eggplant" />Eggplant<br />
                        <input type="checkbox" name="zucchini" id="zucchini" />Zucchini<br />
                        <input type="checkbox" name="tomatoe" id="tomatoe" />Tomatoe<br />
                        <input type="submit" value="Submit" />
        </fieldset>
    </form>
    <script src="options.js"></script>
</body>

</html>

保存/恢复复选框状态的options.js文件如下:

function onError(error) {
  console.log(`Error: ${error}`);
}

function saveOptions(e) {
  // List of search engines to be used
  let eggplant = {
      name: "Eggplant", 
      imageUrl: "https://www.organicfacts.net/wp-content/uploads/2013/06/Eggplant-1020x765.jpg",
      show: form.eggplant.checked
  };
  let zucchini = {
      name: "Zucchini", 
      imageUrl: "https://www.organicfacts.net/wp-content/uploads/zucchini.jpg",
      show: form.zucchini.checked
  };
  let tomatoe = {
      name: "Tomatoe", 
      imageUrl: "https://www.organicfacts.net/wp-content/uploads/2013/05/Organictomato1-1020x765.jpg",
      show: form.tomatoe.checked
  };
  let setting = browser.storage.sync.set({
    eggplant,
    zucchini,
    tomatoe
  });
  setting.then(null,onError);
  e.preventDefault();
}

function restoreOptions() {
  var gettingItem = browser.storage.sync.get({
    'show'
  });
  gettingItem.then((res) => {
    document.getElementById("eggplant").checked = eggplant.show;
    document.getElementById("zucchini").checked = zucchini.show;
    document.getElementById("tomatoe").checked = tomatoe.show;
  });
}

document.addEventListener('DOMContentLoaded', restoreOptions);
document.querySelector("form").addEventListener("submit", saveOptions);

最佳答案

以下是设置操作后的存储状态:

{
  eggplant: {
    name: "Eggplant", 
    imageUrl: "https://www.organicfacts.net/wp-content/uploads/2013/06/Eggplant-1020x765.jpg",
    show: true
  },
  zucchini: { /* ... */ },
  tomatoe: { /* ... */ }
}

但是,在 restoreOptions 中,您可以使用键 "show" 查询存储 - 或者更具体地说,使用语法不正确的对象文字 {"show “}

即使您将其修复为“show”也不是这样的顶级键(这是您允许的唯一查询类型),因此结果显示为空。

  • 如果要查询整个存储,请传递null
  • 如果您想查询单个顶级键,请将其作为字符串传递。
  • 如果您想要一组预先知道的顶级 key ,请传递一个 key 字符串数组。
  • 如果您想提供默认值以防 key 不在存储中,请传递将 key 映射到默认值的对象。

以下是如何使用默认值组织代码:

const defaults = {
  eggplant: {
    name: "Eggplant", 
    imageUrl: "(redacted for brevity)",
    show: false
  },
  zucchini: {
    name: "Zucchini", 
    imageUrl: "(redacted for brevity)",
    show: false
  },
  tomatoe: {
    name: "Tomatoe", 
    imageUrl: "(redacted for brevity)",
    show: false
  }
};

function saveOptions() {
  let settings = {}
  for (let setting in defaults) {
    settings[setting] = {
      ...defaults[setting],       // spread the default values
      show: form[setting].checked // override show with real data
    }
  } 
  browser.storage.sync.set(settings).then(null, onError);
}

function restoreOptions() {
  browser.storage.sync.get(defaults).then(
    (data) => {
      document.getElementById("eggplant").checked = data.eggplant.show;
      document.getElementById("zucchini").checked = data.zucchini.show;
      document.getElementById("tomatoe").checked = data.tomatoe.show;
    }
  );
}

值得注意的是:不要使用submitpreventDefault,只需使用type="button"输入并click.

小编辑:对象传播(...defaults[setting])仍处于实验阶段(尽管最近的 Chrome/FF 支持),更多 ES6-compliant code将会是

for (let setting in defaults) {
  // shallow copy default settings
  settings[setting] = Object.assign({}, defaults[setting]);
  // override show property
  settings[setting].show = form[setting].checked;
}

不太简洁,但更具兼容性。

关于javascript - 如何使用 WebExtensions 存储 API 恢复复选框的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45587933/

相关文章:

javascript - 调用音频元素在 html5 中播放的更快方法

jquery - fetch 和 jquery ajax 有什么区别?

php - PHP通知抑制

php - 对每个检查的元素执行函数

javascript - React-Native 获取,网络请求失败。不使用本地主机

javascript - Angular 6 错误 TS8011 类型参数只能在 .ts 文件中使用

javascript - 输入数据列表在动态添加的元素中不起作用

javascript - addEventListener 或从 HTML 调用函数?

java - 将 RTF/HTML 字符串绘制到自定义 swing 组件中

ruby-on-rails - Rails 4 字符串复选框从不返回空数组