0

如果 URL/HTML 内容满足某些要求,我创建了一个基本的扩展程序来搜索 Google。它在大多数情况下都有效,但是当有多个扩展实例时会失败。例如,如果我加载选项卡 A,然后加载选项卡 B,但单击选项卡 A 的页面操作,我将被定向到搜索选项卡 B 的内容。

我不知道如何将脚本存储到每个选项卡,因此单击选项卡 A 的页面操作将始终导致搜索选项卡 A 的内容。怎么可能呢?我会很感激你的建议!

背景.js

title = "";
luckySearchURL = "http://www.google.com/search?btnI=I%27m+Feeling+Lucky&ie=UTF-8&oe=UTF-8&q=";

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if (request.title != "") {
            title = request.title;
            sendResponse({confirm: "WE GOT IT."});
        }
    });

chrome.tabs.onUpdated.addListener(function(tabId, change, tab) {
    if (change.status === "complete" && title !== "") {
        chrome.pageAction.show(tabId);
    }
});

chrome.pageAction.onClicked.addListener(function(tab) {
    chrome.tabs.create({url: luckySearchURL + title})
})

内容脚本.js

function getSearchContent() {
    url = document.URL;
    if (url.indexOf("example.com/") > -1)
        return "example";
}

if (window === top) {
    content = getSearchContent();
    if (content !== null) {
        chrome.runtime.sendMessage({title: content}, function(response) {
        console.log(response.confirm); })
  };
}
4

2 回答 2

1

您可以执行一些操作,例如将 thetitle与其关联的 一起存储tabId,这样当您单击pageAction它时,它会使用正确的标题。更改将是这些:

背景.js

title= [];

[...]

chrome.runtime.onMessage.addListener(function(request,sender,sendResponse){
  if (request.title != "") {
    title.push({tabId:sender.tab.id, title:request.title});
    sendResponse({confirm: "WE GOT IT."});
  }
});

[...]

chrome.pageAction.onClicked.addListener(function(tab) {
  title.forEach(function(v,i,a){
    if(v.tabId == tab.id){
      chrome.tabs.create({url: luckySearchURL + v.title});

      // Here I am going to remove it from the array because otherwise the 
      // array would grow without bounds, but it would be better to remove
      // it when the tab is closed so that you can use the pageAction more
      // than once.
      a.splice(i,1);
    }
  });
});
于 2013-05-13T23:08:22.507 回答
0

你正面临这个问题是因为window === top. 因此,您的title变量从最后打开的选项卡中获取其值。因此,如果 B 在 A 之后打开,title则从 B 获取其值。试试这个:检测调用脚本的选项卡 ID,获取该选项卡的 url 然后将其变为您的title变量。如下:

chrome.pageAction.onClicked.addListener(function(tab) {
    chrome.tabs.query({active:true},function(tabs){
           //this function gets tabs details of the active tab, the tab that clicked the pageAction

           var urltab = tabs[0].url;
           //get the url of the tab that called this script - in your case, tab A or B.

           chrome.tabs.create({url: urltab + title});
    });
});
于 2013-05-13T22:54:18.130 回答