0

我想制作一个 Chrome 扩展来执行操作(自动登录到网站,可能不是最好的方法,因为这是我第一次做 JS)并且有一个选项页面,用户可以在其中设置他的信息并保存它(localstorage ?) 以便内容脚本可以访问它以及选项页面。

这是我经过大量研究、查看示例等后得出的结论:http: //pastebin.com/yTiXp4VY(那里所有文件的源代码)。

最后我放弃了,只是使用了反复试验,所以那里有很多错误。出于安全原因,控制台报告它无法运行。请解释一下这个版本有什么问题。我不需要你修复我的代码,我只是在学习 JS。

4

1 回答 1

0

在大多数情况下,您的代码似乎是正确的。只有一点:您的选项页面可以localStorage直接访问,它不需要后台页面。但主要问题似乎是您的内容脚本的构建方式 - 它假设用户/密码数据将立即(同步)可用。这不是它的工作原理:您正在向后台页面发送消息,最终后台页面将回答并且您在内容脚本中的回调将被调用。最简单的方法是延迟所有操作,直到发生这种情况并且您拥有数据。将一条消息发送到将为您提供所有数据的后台页面应该更容易。像这样的东西:

var userName = null;
var passWord = null;

chrome.extension.sendRequest( { eventName: "getLogin" },
    function(response) {
        userName = response.user;
        passWord = response.pass;

        // Now we can continue doing whatever we are doing
        checkIfAutoUrl();
    }
);

您的后台页面中的消息处理将如下所示:

function onRequest(request, sender, sendResponse) {
    if (request.eventName == "getLogin") {
        sendResponse({user: getStorage("user"), pass: getStorage("pass")});
    }
}

请注意,响应是一个具有两个属性的对象,user并且pass在这里 - 这样内容脚本可以在收到响应后立即继续,它具有所有必要的数据并且不需要等待第二个响应。

更新:关于您收到的错误消息:内容安全策略旨在保护您的扩展程序不被恶意网站利用。这种保护的一部分是禁止在 HTML 中使用内联脚本onload="load_options()"。所有将要运行的脚本都需要放在您的 JavaScript 文件中。因此,onload您可以将以下内容放入options.js

window.addEventListener("load", load_options, false);

请参阅addEventListenerMDN 上的文档

于 2012-05-21T10:30:34.263 回答