2012-06-08 85 views
0

我試圖創建一個返回當前選項卡的URL的功能:獲取當前選項卡,並把它傳遞給變量的Chrome擴展

function tabURL() { 
var url=""; 
chrome.tabs.getSelected(null, function(tab) {url = tab.url;}); 
return url; 
} 

當我使用:

chrome.tabs.getSelected(null, function(tab) {alert(tab.url);}); 

Chrome會顯示該網址,但如果我使用我的功能在鉻控制檯,該函數返回「」。

有沒有辦法將tab.url傳遞給一個變量,然後返回這個變量?

+0

我在回憶JavaScript的作用域規則可怕,但你傳遞'功能getSelected'具有相同的'url'變量您創建的一個在'tabURL()'中? – Collin

回答

6

chrome.tabs.getSelected異步。這意味着當調用回調函數時,return url「已經發生」。

你有兩個選擇來達到預期的效果。

  1. 正確地重寫您的代碼,以正確實現異步方面(具體細節取決於您的擴展的實現)。
    注意因爲鉻16.

  2. 保持的哈希使用chrome.tabs.onUpdated當前網址getSelected一直deprecated和替換chrome.tabs.query(添加tabID + URL),chrome.tabs.onRemoved(以除去過時的條目)和chrome.tabs.onActivated(設置當前活動標籤)。

守則2:

// Our hash 
var tabIdToURL = {}; 
var currentTabId = -1; 
// Add changes to the hash (tab creation, tab's page load) 
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    tabIdToURL[tabId] = tab.url; // also available as tab.id and changeInfo.url 
}); 
// Remove entries from closed tabs 
chrome.tabs.onRemoved.addListener(function(tabId) { 
    delete tabIdToURL[tabId]; 
}); 
// Set the ID of the current active tab 
chrome.tabs.onActivated.addListener(function(activeInfo) { 
    currentTabId = activeInfo.tabId; 
}); 

// Usage, based on the question's function 
function getURL() { 
    return tabIdToURL[currentTabId] || ''; 
} 
相關問題