Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Firefox、TabOpen事件及更高版本中重用选项卡_Firefox_Firefox Addon_Mozilla - Fatal编程技术网

在Firefox、TabOpen事件及更高版本中重用选项卡

在Firefox、TabOpen事件及更高版本中重用选项卡,firefox,firefox-addon,mozilla,Firefox,Firefox Addon,Mozilla,我遵循了关于在Firefox中重用选项卡的教程,现在我的扩展做得很好。但是,我还需要重用从外部打开的选项卡(从某些应用程序、开始菜单等)。我该怎么做 我尝试为TabOpen事件添加事件侦听器,但当我记录 event.target.linkedBrowser.currentURI.spec 它的值是“关于:空白”。我希望输入到地址栏中的实际地址(自动在新选项卡中打开),或者从其他应用程序打开的地址,这样我就可以立即关闭该选项卡,并将焦点放在正确的位置。我做错了什么 提前谢谢 以防万一,下面是当

我遵循了关于在Firefox中重用选项卡的教程,现在我的扩展做得很好。但是,我还需要重用从外部打开的选项卡(从某些应用程序、开始菜单等)。我该怎么做

我尝试为TabOpen事件添加事件侦听器,但当我记录

event.target.linkedBrowser.currentURI.spec
它的值是“关于:空白”。我希望输入到地址栏中的实际地址(自动在新选项卡中打开),或者从其他应用程序打开的地址,这样我就可以立即关闭该选项卡,并将焦点放在正确的位置。我做错了什么

提前谢谢


以防万一,下面是当从扩展请求新选项卡时重用该选项卡的代码

function openAndReuseOneTabPerURL(url) {
  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var browserEnumerator = wm.getEnumerator("navigator:browser");

  // Check each browser instance for our URL
  var found = false;
  while (!found && browserEnumerator.hasMoreElements()) {
    var browserWin = browserEnumerator.getNext();
    var tabbrowser = browserWin.getBrowser();

    // Check each tab of this browser instance
    var numTabs = tabbrowser.browsers.length;
    for(var index=0; index<numTabs; index++) {
      var currentBrowser = tabbrowser.getBrowserAtIndex(index);
      if (url == currentBrowser.currentURI.spec) {

        // The URL is already opened. Select this tab.
        tabbrowser.selectedTab = tabbrowser.mTabs[index];

        // Focus *this* browser-window
        browserWin.focus();

        found = true;
        break;
      }
    }
  }

  // Our URL isn't open. Open it now.
  if (!found) {
    var recentWindow = wm.getMostRecentWindow("navigator:browser");
    if (recentWindow) {
      // Use an existing browser window
      recentWindow.delayedOpenTab(url, null, null, null, null);
    }
    else {
      // No browser windows are open, so open a new one.
      window.open(url);
    }
  }
}
函数openandureonetabperurl(url){
var wm=Components.classes[“@mozilla.org/appshell/windowmediator;1”]
.getService(组件.接口.nsIWindowMediator);
var browserEnumerator=wm.getEnumerator(“导航器:浏览器”);
//检查每个浏览器实例的URL
var=false;
而(!found&&browserEnumerator.hasMoreElements()){
var browserWin=browserEnumerator.getNext();
var tabbrowser=browserWin.getBrowser();
//检查此浏览器实例的每个选项卡
var numTabs=tabbrowser.browsers.length;

对于(var index=0;index我想您可以从扩展中的实现中提取想要的行为

当您收到TabOpen事件时,仍然加载页面内容为时尚早。但是,当您收到TabOpen事件时,您应该注册load或DOMContentLoaded。当您收到该事件时,您应该能够访问URI。

谢谢,我发现这可能是一个可行的解决方案。这不是我所希望的,因为该选项卡打开的时间很短(如果存在另一个具有相同地址的选项卡,则在我关闭它之前)。应该很快。关于:blank会很快消失。如果你担心速度,你会想使用DOMContentLoaded。这正是我所做的,但我仍然可以在短时间内看到该选项卡。我真正需要的是某种“PreTabOpen”事件(:我得到了另一个关于如何做的建议,所以在这里寻求更多帮助之前,我会尝试一下。
function openAndReuseOneTabPerURL(url) {
  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var browserEnumerator = wm.getEnumerator("navigator:browser");

  // Check each browser instance for our URL
  var found = false;
  while (!found && browserEnumerator.hasMoreElements()) {
    var browserWin = browserEnumerator.getNext();
    var tabbrowser = browserWin.getBrowser();

    // Check each tab of this browser instance
    var numTabs = tabbrowser.browsers.length;
    for(var index=0; index<numTabs; index++) {
      var currentBrowser = tabbrowser.getBrowserAtIndex(index);
      if (url == currentBrowser.currentURI.spec) {

        // The URL is already opened. Select this tab.
        tabbrowser.selectedTab = tabbrowser.mTabs[index];

        // Focus *this* browser-window
        browserWin.focus();

        found = true;
        break;
      }
    }
  }

  // Our URL isn't open. Open it now.
  if (!found) {
    var recentWindow = wm.getMostRecentWindow("navigator:browser");
    if (recentWindow) {
      // Use an existing browser window
      recentWindow.delayedOpenTab(url, null, null, null, null);
    }
    else {
      // No browser windows are open, so open a new one.
      window.open(url);
    }
  }
}