【问题标题】:chrome.storage for Chrome extension用于 Chrome 扩展的 chrome.storage
【发布时间】:2018-05-04 04:41:26
【问题描述】:

我是 JavaScript 的新手,我正在创建一个扩展程序,用于保存用户数据以显示在特定页面(具体来说是 Google 课堂)上。我曾尝试使用 localStorage,但这会将其保存到特定页面的 local 存储中。我需要一个用户能够在 Chrome 中从 任何地方 保存和访问数据,并且我也需要它在新会话中可用。

总之,我需要三个函数。一种用于将用户数据保存到 chrome.storage,一种用于在给定键的情况下从 chrome.storage 中获取值,另一种用于列出 chrome.storage 中的所有键。

ma​​nifest.json

{
  "manifest_version": 2,
  "name": "AssignMe for Classroom",
  "short_name": "AssignMe",
  "description": "Create your own assignments on Google Classroom.",
  "version": "1.0",

  "browser_action": {
   "default_icon": "src/icon128.png",
   "default_popup": "popup.html"
  },

  "icons": {
   "16": "src/icon16.png",
   "19": "src/icon19.png",
   "48": "src/icon48.png",
   "128": "src/icon128.png"
  },

  "content_scripts": [{
   "matches": ["https://classroom.google.com/*/not-turned-in/all"],
   "js": ["displayBackground.js"],
   "run_at": "document_end"
  }],

  "permissions": [
   "activeTab",
   "storage",
   "tabs",
   "<all_urls>"
  ]
}

popup.html

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <form name="newAssignment" onsubmit="return display()">
      <fieldset>
        <legend><strong>New Assignment</strong></legend>
        <strong>Title</strong>
        <input type="text" id="title" spellcheck="false" name="title">
        <br /><br />
        <strong>Date</strong>
        <input type="date" id="date" spellcheck="false" name="date">
        <br />
        <p id="demo">0</p>
        <button type="button" id="do-count">Create Assignment</button>
        <script src="content.js"></script>
      </fieldset>
    </form>
  </body>
</html>

content.js

var title = document.getElementById("title").value;
var date = document.getElementById("date").value;

// Function that saves user data to chrome.storage
// Function that grabs user data from chrome.storage by key
// Function that grabs all keys from chrome.storage

【问题讨论】:

  • 您正在寻找文档。
  • 文档有点含糊。我试过使用他们的 chrome.storage.set 但我无法检索数据。

标签: javascript google-chrome google-chrome-extension user-data


【解决方案1】:

试试这个。

curAssignment = 0;
// save data (you can use .local or .sync)
function saveData() {
  chrome.storage.local.set({
    Data: {
      ["Assignment" + curAssignment]: {
        Title: title,
        Date: date
      }
    }
  }, function() {console.log("Data Saved");});
  curAssignment = curAssignment + 1;
}

["Assignment" + curAssignment] 根据已保存的项目数量为新项目提供唯一的 ID。


// load data
loadedAssignment = 0;
function loadData() {
  chrome.storage.local.get(["Data"], function(results) {
    while (loadedAssignment < results.Data.length) {
      loadedTitle = results.Data[loadedAssignment].Title;
      loadedDate = results.Date[loadedAssignment].Date;

      // your code that handles the loaded data

      loadedAssignment = loadedAssignment + 1;
    }
    curAssignment = results.Data.length;
  });
}

loadData 函数循环遍历 chrome.storage.local 中的“Data”项,并获取存储项的 Title 和 Date。

根据StackOverflow可以使用

// get all items
function getAllItems() {
  chrome.storage.local.get(null, function(items) {
    var allKeys = Object.keys(items);
  });
}

获取存储中的所有项目。

【讨论】:

    【解决方案2】:

    一种更奇特的方法(Set 和 Get),它也可以处理错误:

    const getStorageData = key =>
      new Promise((resolve, reject) =>
        chrome.storage.sync.get(key, result =>
          chrome.runtime.lastError
            ? reject(Error(chrome.runtime.lastError.message))
            : resolve(result)
        )
      )
    
    const { data } = await getStorageData('data')
    
    
    const setStorageData = data =>
      new Promise((resolve, reject) =>
        chrome.storage.sync.set(data, () =>
          chrome.runtime.lastError
            ? reject(Error(chrome.runtime.lastError.message))
            : resolve()
        )
      )
    
    await setStorageData({ data: [someData] })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-17
      • 2013-06-13
      • 2012-09-03
      • 2016-11-19
      • 2017-04-23
      • 1970-01-01
      • 2013-12-06
      • 2016-10-28
      相关资源
      最近更新 更多