2013-05-13 4 views
0

Я создал базовое расширение, которое ищет Google, если содержание URL/HTML соответствует определенным требованиям. Он работает по большей части, но терпит неудачу, когда есть несколько экземпляров расширения. Например, если я загружаю вкладку A, а затем вкладку B, но нажимаю на действие страницы для вкладки A, я буду перенаправлен на поиск содержимого вкладки B.Многократная вкладка Chrome Extension Issue

Я не знаю, как использовать скрипт для каждой вкладки, так что нажатие на вкладку «А» действие страницы всегда приведет к поиску вкладки «А». Как это можно сделать? Буду признателен за ваши предложения!

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); }) 
    }; 
} 

ответ

0

Вы столкнулись с этой проблемой из-за window === top. Таким образом, ваша переменная title получает свое значение с последней открытой вкладки. Поэтому, если B открывается после A, title получает свое значение из B. Попробуйте это: Определите идентификатор вкладки, который вызвал скрипт, введите 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}); 
    }); 
}); 
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); 
    } 
    }); 
}); 
Смежные вопросы