在大多数情况下,您的代码似乎是正确的。只有一点:您的选项页面可以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);
请参阅addEventListener
MDN 上的文档。