0

URL/HTML コンテンツが特定の要件を満たしている場合に Google を検索する基本的な拡張機能を作成しました。ほとんどの場合は機能しますが、拡張機能のインスタンスが複数ある場合は悲惨に失敗します。たとえば、タブ A を読み込んでからタブ B を読み込んだときに、タブ A のページ アクションをクリックすると、タブ B のコンテンツの検索に誘導されます。

スクリプトを各タブにサイロ化する方法がわかりません。そのため、タブ A のページ アクションをクリックすると、常にタブ A の検索が行われます。どうすればそれができますか?あなたの提案に感謝します!

background.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})
})

contentscript.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

title関連する を保存するようなことを行うことができます。これtabIdにより、 をクリックするpageActionと正しいタイトルが使用されます。変更は次のとおりです。

background.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変数は最後に開いたタブから値を取得します。したがって、A の後に B が開かれた場合、Btitleからその値を取得します。これを試してください: スクリプトを呼び出したタブ ID を検出し、そのtitleタブの URL を取得します。これが変数になります。以下のように:

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 に答える