javascript - chrome.storage.sync.get 未返回完整的 JS 对象

标签 javascript google-chrome google-chrome-extension

我正在尝试编写一个 Chrome 扩展程序,允许用户轻松登录内部网页。该扩展将显示一个包含预定义凭据的菜单,用户可以从中选择一个凭据并立即登录到相应的网页。(想想书签++)。

作为第一步,我想在“扩展选项”页面中编写接受“名称”、“网址”、“用户名”和“密码”信息的功能,并使用 chrome.storage.sync 保留该信息。设置。用户可以使用 chrome.storage 保存多组此类信息(例如同一网站的不同用户名)。我能够成功地做到这一点,并且选项页面还能够列出所有保存的信息。请暂时忽略与客户端密码加密相关的安全问题。

这是我的 list .json

{
    "name": "My Chrome Extension",
    "version": "1.0",
    "manifest_version": 2,
    "description": "Easy login to My Webapp",

    "browser_action": {
        "default_icon": "images/Cloud16.png",
        "default_popup": "html/popup.html"
    },
    "options_page": "html/options.html",
    "permissions": ["<all_urls>", "storage", "unlimitedStorage"]    
}

这是选项页面中的保存处理程序(在 options.js 中):

function saveHandler() {
    var name = $("#name").val(),
        url = $("#url").val(),
        password = $("#password").val(),
        key = Date.now() + "",   //key based on currentTimeInMillis
        obj = {
            "id": key,
            "name": name,
            "url": url,
            "password": password
        };
    chrome.storage.sync.get('LOGIN_COLLECTION', function(items) {
            //Create a new collection if not exists
        if(items && !items['LOGIN_COLLECTION']) {
            items['LOGIN_COLLECTION'] = {};         
        }
        items['LOGIN_COLLECTION'][obj.id] = obj;
        chrome.storage.sync.set(items, function() {
            // Notify that we saved.
            console.log('Settings saved');
            chrome.storage.sync.get('LOGIN_COLLECTION', function(data) {            
                console.dir(data);
            });
        });
        $("#addUrlDialog").slideUp();
        loadExistingInfo(); //Read persisted data, and show. This works fine!!
    });
}

当用户单击工具栏中的扩展图标时,我会显示一个弹出 html,其中包含一个脚本来获取保留在选项页面中的数据(使用 chrome.storage.get)。在弹出窗口中获取数据的代码如下所示:

chrome.storage.sync.get('LOGIN_COLLECTION', function(items) {
    var container = $("#listContainer"),
    data = items['LOGIN_COLLECTION'];
    for(item in data) {          
        console.dir(item); //**Outputs empty object**
        $("<div></div>").text(item.name).appendTo(container);
    }
});

Screenshot of the js console for popup page

正如您所看到的,提取只能获取顶级对象信息,但无法获取其任何属性。我应该使用内容脚本或后台页面来读取 chrome.storage.sync.set 设置的数据吗?对此的任何帮助将不胜感激。

最佳答案

您没有正确使用 for...in 循环。它们的键是迭代的,而不是值。

for(key in data) {
    var item = data[key];
    console.dir(item);
    $("<div></div>").text(item.name).appendTo(container);
}

关于javascript - chrome.storage.sync.get 未返回完整的 JS 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24461202/

相关文章:

javascript - 如何在加载 JavaScript 后更改动态创建的元素

javascript - 这是 Chrome 的错误吗?我该如何解决? : It skips some alert comments in the opener's Function

java - 为 Selenium 创建 HTTP Basic auth Chrome 扩展(MWE 可用)

css - 如何在 Chrome 中启用 CSS 选择器分析

javascript - 为什么常在对象声明中使用Const,而它的属性却可以改变?

javascript - Node 脚本需要向调用它的 Angular 服务返回成功/失败

jQuery .load() 在 Chrome 浏览器中无法正常工作

javascript - 从页面 DOM 访问 NPAPI

javascript - Chrome 扩展程序徽章文本 - ✔ 呈现为 “”

javascript - 使用图像代替 Canvas