【问题标题】:LocalStorage message passing issue - nearly worksLocalStorage 消息传递问题 - 几乎可以工作
【发布时间】:2012-06-04 01:07:41
【问题描述】:

过去两天我一直在努力让它发挥作用,作为最后的手段,我在这里问。我查看了 StackOverflow 上与消息传递相关的所有相关帖子、一些博客,当然还有 Google 的消息传递页面。

我构建的 APP 将在包含某些内容的页面中查找链接并替换它的开头。例如,将在 url 中查找“google.com”并将开头替换为“ask.com”。

我遇到的问题是我想将此变量存储在似乎发生的本地存储变量中。但是,当刷新页面时,不会使用传递的新 url。我已经去掉了一些杂乱无章的东西,制作了一个简化版本,以便于调试。请帮忙!很快就没有头发了!

localStorage["talktest1"] 包含一个应该更改为从 popup.js 传递的新 URL 的 URL。然后,当下次加载替换脚本时,它应该使用新的 talktest1 变量,但它会继续使用旧的“www.google.co.uk”变量。

Manifest.js:

{
  "name": "Talk Talk",
  "version": "1.0",
  "description": "Tests stuff.",  
    "browser_action": {
    "default_icon": "img/icon16.png",
    "default_popup": "popup.html"
  },
    "options_page": "options.html",
  "permissions": [
    "tabs", "*://*/*"
  ],
  "background": {
    "scripts": ["js/jquery-1.7.2.min.js","js/bg.js"]
  },
    "icons": { "16": "img/icon16.png",
               "48": "img/icon48.png",
               "128": "img/icon128.png" },
  "content_scripts": [
    {
      "matches": ["*://*/*"],
      "js": ["js/jquery-1.7.2.min.js","js/bg.js"],
      "run_at": "document_end"
    }
  ]
}

popup.js:

$(document).ready(function() {

    chrome.extension.getBackgroundPage().alert_this();

    $('.link_change').click(function() { // when a link is clicked - url is grabbed from a 'href'

        chrome.extension.sendRequest({localstorage: "http://www.something.com"}, function(response) {
            var email = response.value;
            chrome.extension.getBackgroundPage().alert_this();
        });     

        return false;
    });


});

bg.js:

if(!talktest1){
    var talktest1;
}
if(!localStorage["talktest1"]){
    localStorage["talktest1"] = "http://www.google.co.uk";
}

talktest1 = localStorage["talktest1"];


chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {       
        localStorage["talktest1"] = request.localstorage;
        talktest1 = request.localstorage;
        sendResponse({value: localStorage.talktest1});
    }
);

function alert_this(){
    alert("localstore|" + localStorage["talktest1"]);
    alert("talktest1|" + talktest1);
}


$("a[href*='google.com']").each(function(){ 
    this.href = this.href.replace('http://www.ask.com',talktest1);
});

【问题讨论】:

  • 为什么不在popup.html中设置localstorage?
  • 如果您在 popup.html 中设置 localstorage,它似乎只为该域设置变量。应用程序的其余部分仍然无法访问它。因此,如果您在不同 URL 的新选项卡中使用它,它将不会保留相同的值。

标签: google-chrome google-chrome-extension local-storage message-passing


【解决方案1】:
  1. 为什么你使用bg.js 作为背景页面和内容脚本?这没有任何意义。 chrome.extension.onRequest 不能在内容脚本中使用并在控制台上引发错误。将$("a[href*='google.com']")... 部分放入不同的脚本(类似于content.js)并更新您的manifest.json

  2. 您尚未设置manifest_version,默认为1,其中background 设置不可用(source),只有background_page

    李>
  3. popup.js 中的$('.link_change').click 仅对被点击的弹出窗口内的链接做出反应,而不是来自站点的链接。那是你的意图吗? Popup 有自己的生活,它不知道当前打开的网站。

  4. 我相信您无法从背景页面显示alert()。你的alert_this() 函数还能用吗?

  5. 弹窗或bg页面是否有错误?你调试过吗?您应该尝试在onRequest 侦听器函数 (bg.js) 中放置一个断点,看看那里会发生什么(request.localstorage,好吗?是否正确设置了值?)。要调试后台页面,请在 chrome 扩展页面上的扩展下使用 Inspect active views 选项。

【讨论】:

  • 我要做的是:安装扩展程序时,它使用默认 url 作为替代。然后根据在 popup.html 中单击的链接,它应该更改扩展的替换 url。那么在之后打开或重新加载的任何页面都会自动使用这个新的 url。我一直在尝试使用 localSorage。但是 popup.html 不想与 background.html 对话,这似乎由于某种原因无法访问 localStorage,我很困惑。我已经做到了你所说的。添加了带有 $("a[href*='google.com']") 的 content.js。请帮忙!!
  • 我实际上并不认为我需要背景页面。我认为我这样做的唯一原因是与将被替换的 url 的 localStorage 值进行交互
  • 我尝试在 background.html 中添加以下内容: function startup(){ localStorage.setItem("the_prox","lalala.com"); } 并将以下内容添加到 content.js 但是背景仍然没有 localStorage 项目:chrome.extension.getBackgroundPage().startup();
  • 1.每当用户单击弹出窗口中的链接时,您应该从后台页面调用一个函数,该函数将在localStorage 中存储一个新值(即saveSite('http://ask.com/'))。 2. 在内容脚本的开头,调用从localStorage 中检索值的后台函数(即getSite())。不要在弹出窗口或内容脚本中直接使用localStorage 变量。总是调用后台页面来获取值,你会没事的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多