0

我想提出一个Chrome扩展开。点击popup.html中的按钮打开一个新窗口并加载feedback-panel.html检查窗口已经从非父窗口(Chrome扩展)

这工作,但上点击,我想检查窗口已经打开,如果是集中于它,而不是创建一个新的。

JavaScript window.open only if the window does not already exist看上去很不错,但它依赖打开的窗口作为变量存储在父页面上,当打开窗口并在打开窗口之前检查它们。这不会为我工作,因为父窗口(popup.html)经常会被关闭并重新打开,我会失去变量。

我试图实现相同的想法,但窗口变量存储与chrome.storage,因为它可以让你存储对象。那么,它让你存储的对象,但它首先序列化他们,所以窗口变量失去它的所有功能,我结束了

result.feedbackPanel.focus()不是一个函数

这里是我的尝试:

function openFeedbackPanel(){ 
    chrome.storage.local.get('feedbackPanel', function (result) { 
     console.log(result.feedbackPanel); // logs window object sans all functions 
     if(result.feedbackPanel && ! result.feedbackPanel.closed){ 
      try{ 
       result.feedbackPanel.focus(); 
      } 
      catch(error){ 
       chrome.storage.local.remove('feedbackPanel', function() { 
       }); 
       createFeedbackPanel(); 
      } 
     } 
     else{ 
      createFeedbackPanel(); 
     } 
    }); 
} 
function createFeedbackPanel(){ 
    var win = window.open('feedback-panel.html', 'Feedback', 'width=935, height=675'); 
    console.log(win); // logs full object as expected 
    chrome.storage.local.set({"feedbackPanel": win}); 
} 



$('#some-button').click(openFeedbackPanel()); 

所以,因为这并不工作:

如何检查弹出窗口是否已经从非父窗口(未打开弹出窗口)打开?

回答

2

不需要跟踪窗口和存储。
如果你知道你的扩展ID,最简单的方法是测试所有选项卡的URL,看看它是否已经打开

chrome.tabs.query({}, function(tabs) { 
    var doFlag = true; 
    for (var i=tabs.length-1; i>=0; i--) { 
    if (tabs[i].url === "chrome-extension://EXTENSION_ID/feedback-panel.html") { 
     //your popup is alive 
     doFlag = false; 
     chrome.tabs.update(tabs[i].id, {active: true}); //focus it 
     break; 
    } 
    } 
    if (doFlag) { //it didn't found anything, so create it 
    window.open('feedback-panel.html', 'Feedback', 'width=935, height=675'); 
    } 
}); 

这里已经回答了如何让extension ID

+0

这看起来promissing但遗憾的是它不工作。当页面未打开时,它会打开它,但打开时没有任何反应。我设置了一个断点,代码被称为'chrome.tabs.update(tabs [i] .id,{active:true});'并且我有正确的标签ID,但是窗口没有获得焦点。我认为这是因为弹出窗口本身仍然是开放的 – DelightedD0D

+0

@ DelightedD0D我在Opera浏览器的win10上测试了它,弹出窗口集中(从背景)。也许它是不同的平台行为? –

+0

嗯,没有意识到你可以在opera中安装chrome扩展,你可以在实际的chrome中测试吗?编号爱,以确认它的工作原理,所以我可以专注于理由雷犯规 – DelightedD0D

1

您也可以使用消息系统。这是我用于扩展选项的示例。调用这样的功能在onclick的按钮:

// send message to the option tab to focus it. 
    // if not found, create it 
    showOptionsTab: function() { 
     chrome.runtime.sendMessage({window: 'highlight'}, null, function(response) { 
      if (!response) { 
       // no one listening 
       chrome.tabs.create({url: '../html/options.html'}); 
      } 
     }); 
    }, 

而在你的窗口/标签听这样这种方法不需要的选项卡

// listen for request to make ourselves highlighted 
chrome.runtime.onMessage.addListener(t.onMessage); 

... 

// message: highlight ourselves and tell the sender we are here 
t.onMessage = function(request, sender, response) { 
    if (request.window === 'highlight') { 
     chrome.tabs.getCurrent(function(t) { 
      chrome.tabs.update(t.id, {'highlighted': true}); 
     }); 
     response(JSON.stringify({message: 'OK'})); 
    } 
}; 

一个优点消息允许。