Двойной клик левой кнопкой на табе, закрыть страницу(Firefox 3.6 + )
Автор: bunda1
Описание:Kод дает возможность двойным левым кликом на табе закрыть страницу.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    removeEventListener("dblclick", TabClose, false, gBrowser.mTabContainer);
};

// Двойной клик левой кнопкой на табе, закрыть страницу.
// If  double left click in Tab, remove Current Tab.
function TabClose(event){
if (event.button != 0) return;
          event.preventDefault();
          event.stopPropagation();
    //закрыть страницу
    gBrowser.removeCurrentTab();
};
addEventListener("dblclick", TabClose, false, gBrowser.mTabContainer);

Двойной клик левой кнопкой на табе, открыть домашнюю страницу(Firefox 3.6 + )
Автор: bunda1
Описание:Kод дает возможность двойным левым кликом на табе открыть домашнюю страницу в новой активной вкладке.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// удаление обработчика, при открытии настройки панелей
this.onDestroy = function() { removeEventListener("dblclick", NewTabHome, false, gBrowser.mTabContainer) };

// Двойной клик левой кнопкой на табе, открыть домашнюю страницу.
// If  double left click in Tab, the Homepage open in New Tab.
function NewTabHome(event){
if ( event.button == 0 && event.target.nodeName == 'tab') {
     event.preventDefault();
     event.stopPropagation();
 
     var HomeUrl = gPrefService.getCharPref("browser.startup.homepage");
     gBrowser.selectedTab = gBrowser.addTab(HomeUrl);
     }
};
addEventListener("dblclick", NewTabHome, false, gBrowser.mTabContainer);

Клик средней кнопкой на табе, закрыть все вкладки кроме текущей.(Firefox 3.6 + )
Автор: bunda1
Описание:Kод дает возможность кликом средней кнопки на табе закрыть все вкладки кроме текущей.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

//Клик средней кнопкой на табе, закрыть все вкладки кроме текущей
// midlle click tab - Close other Tabs..............................................
gBrowser.mTabContainer.addEventListener("mousedown", function (event){
  if (event.button != 1) {
        return;
    }
    event.preventDefault();
    event.stopPropagation(); 
            if (event.target.localName != "tab") return;
    //закрыть все вкладки кроме текущей
         getBrowser().removeAllTabsBut(getBrowser().mCurrentTab);
}, false);

Двойной клик правой кнопкой на табе, добавить страницу в закладки(Firefox 3.6 +)
Автор: bunda1
Описание:Kод дает возможность двойным правой кликом на табе добавить страницу в закладки
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    removeEventListener("dblclick", TabAddBook, false, gBrowser.mTabContainer);
};
// right dblclick tab - Add to Bookmarks..............................................
function TabAddBook(event){
if (event.button != 2) return;
          event.preventDefault();
          event.stopPropagation();
     if (event.target.localName != "tab") return;
       //зарыть контекстное меню таба
        document.getElementById("tabContextMenu").hidePopup();
       //Добавить страницу в закладки    
       PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId, content.location.href, content.document.title);
};
addEventListener("dblclick", TabAddBook, false, gBrowser.mTabContainer)

Двойной клик левой кнопкой на табе - закрепить/открепить вкладку(Firefox 7 + )
Автор: bunda1
Описание:Kод дает возможность двойным левым кликом на табе закрепить/открепить вкладку.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

//удаление обработчика, при открытии настройки панелей
this.onDestroy = function() {
    removeEventListener("dblclick", TabPin, false, gBrowser.mTabContainer);
};

// двойной клик левой кнопкой на табе - закрепить/открепить вкладку.
function TabPin(event){
if (event.button != 0) return;
          event.preventDefault();
          event.stopPropagation();
     
     //закрепить/открепить вкладку
    if(gBrowser.mCurrentTab.pinned)
    gBrowser.unpinTab(gBrowser.mCurrentTab);
    else
    gBrowser.pinTab(gBrowser.mCurrentTab); 
};
//добавляем обработчик для таба
addEventListener("dblclick", TabPin, false, gBrowser.mTabContainer);
bunda1 пишет

Двойной клик левой кнопкой на табе - закрепить/открепить вкладку(Firefox 7 + )

Есть джетпак Easy App Tabs делающий то же самое.

Открыть новый таб двойным кликом левой кнопкой на титлебаре(Titlebar)(Firefox 7 + )
Автор: bunda1
Версия: от 25.08.2013.
Описание: Kод дает возможность двойным левым кликом на титлебаре открыть новый таб, если табы сверху на титлебаре.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Двойной клик левой кнопкой на на титлебаре открывает новый таб, от 25.08.2013. ................................
addEventListener("dblclick", function(e) {
if ( e.button == 0 && document.getElementById('main-window').hasAttribute('tabsintitlebar') ) {
     e.preventDefault();
     gBrowser.selectedTab = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1]
     gBrowser.selectedTab = gBrowser.addTab('about:newtab')
     }
}, false, document.getElementById('TabsToolbar') );

Глядишь разрастется до замены TU/TMP :) может стоит писать сюда фичреквесты аналогичных фич из TU? Будете добавлять?

Kamui
Нет, не потяну.

Kamui
а смысл в ещё одном комбайне? Тем более, что 2 уже есть.

iDev.Pi пишет

а смысл в ещё одном комбайне? Тем более, что 2 уже есть.

Да просто там TU/TMP действительно комбайны, а хотелось бы чего-то попроще, с возможностью настройки порядка открытия/закрытия вкладок, да несколько пунктов в контекстном меню вкладок :)

Kamui пишет

а хотелось бы чего-то попроще, с возможностью настройки порядка открытия/закрытия вкладок, да несколько пунктов в контекстном меню вкладок

Что конкретно нужно?

bunda1 пишет

Что конкретно нужно?

Да ладно, все-таки многовато надо будет для CB думаю слишком будет :)

Активизировать вкладку наведением курсора(Firefox 3.6 + )
Автор: неизвестно
Описание: Kод дает возможность активизировать вкладку наведением курсора, без клика.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

//Активизировать вкладку наведением курсора......................
var tab_hover={
   event:null,
   tid:null,

   onLoad: function() {
      gBrowser.tabContainer.addEventListener("mouseout", tab_hover.onMouseOut, false);
      gBrowser.tabContainer.addEventListener("mouseover", tab_hover.onMouseOver, false);
   },
   onUnload: function() {
      gBrowser.tabContainer.removeEventListener("mouseover", tab_hover.onMouseOver, false);
      gBrowser.tabContainer.removeEventListener("mouseout", tab_hover.onMouseOut, false);
   },

   onMouseOver: function(event) {
      tab_hover.event=event.target;
      tab_hover.tid=setTimeout( function(){ gBrowser.selectedTab=tab_hover.event;   } , 0);
   },
   onMouseOut: function() {
      clearTimeout(tab_hover.tid);
   }
};
if (!this.tab_hoverRun) tab_hover.onLoad();
this.tab_hoverRun = true;

или

Выделить код

Код:

gBrowser.tabContainer.addEventListener("mouseover", function(event) {
gBrowser.selectedTab = event.target;
}, false);

Активизировать вкладку наведением курсора, если 'Панель меню' закрыт( Firefox 3.6 + )
Автор: bunda1
Описание: Kод дает возможность активизировать вкладку наведением курсора, если 'Панель меню' закрыт.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Активизировать вкладку наведением курсора, если 'Панель меню' закрыт ................................
(function () { 
   var menubar = document.getElementById('toolbar-menubar');

   addEventListener("mouseover", function(e) {
      if ( menubar.getAttribute("autohide") == 'true' && menubar.getAttribute("inactive") ) {
           gBrowser.selectedTab = e.target;
           }        
   }, false, gBrowser.tabContainer ); 
})();

Переключаться на левую вкладку после закрытии текущей вкладки( Firefox 3.6 + )
Автор: bunda1
Описание: Kод дает возможность автоматически переключаться на левую вкладку после закрытии текущей вкладки.
Версия: от 22.08.2013.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Переключаться на левую вкладку после закрытии текущей вкладки,  от 22.08.2013. ................................
function tabCloseHandler(e) {
   var tab = e.target;
   
   if ( tab == gBrowser.mCurrentTab ) { 
        if ( !gBrowser.visibleTabs.length ) gBrowser.addTab("about:blank");
        else             
             if ( !tab.hasAttribute('first-visible-tab') ) { gBrowser.mTabContainer.advanceSelectedTab(-1,true) }; 
        }
}
addEventListener("TabClose", tabCloseHandler, true, gBrowser.tabContainer );

Открывать любую новую вкладку справа от текущей( Firefox 17 + )
Автор: bunda1
Описание: Kод открывает любую новую вкладку справа от текущей.
Версия: от 08.04.2014.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 08.04.2014. ................................ 
addEventListener("TabOpen", function(e) {
   var newTab = e.target;
   var lab = newTab.label; 
   var tabpos = gBrowser.selectedTab._tPos;
   var newTabLab = gBrowser.mStringBundle.getString("tabs.emptyTabTitle");  

   if ( tabpos == 0 && lab == newTabLab ) return;      // если восстановление сессии 
   if ( new Error().stack.indexOf("openContainer") !== -1 ) return;   // если открыть всё во вкладках из папки закладок  
   
   lab == newTabLab
   ? setTimeout(function() gBrowser.moveTabTo( e.target, tabpos + 1 ), 50) // если восстановление вкладки
   : gBrowser.moveTabTo( e.target, tabpos + 1 );
   
   // автоматически закрывать "custombutton" вкладку
   if ( lab.startsWith("custombutton://%") ) setTimeout(function() gBrowser.removeTab( newTab ), 0);

}, false, gBrowser.tabContainer );
bunda1 пишет

Активизировать вкладку курсором мыши(Firefox 3.6 + )

курсором мыши -> наведением курсора


bunda1 пишет

Открывать любую новую вкладку справа от текущей(Firefox 3.6 + )

about:config -> browser.tabs.insertRelatedAfterCurrent ?

20-04-2012 19:11:46

bunda1 пишет

Переключаться на левую вкладку после закрытии текущей вкладки(Firefox 3.6 + )

about:config -> browser.tabs.selectOwnerOnClose ?

iDev.Pi пишет

курсором мыши -> наведением курсора

Ok

iDev.Pi пишет

Открывать любую новую вкладку справа от текущей(Firefox 3.6 + )
about:config -> browser.tabs.insertRelatedAfterCurrent ?

А вот и нет!


iDev.Pi пишет

Переключаться на левую вкладку после закрытии текущей вкладки(Firefox 3.6 + )
about:config -> browser.tabs.selectOwnerOnClose ?

А вот и нет!

Дублировать таб( Firefox 3.6 + )
Автор: bunda1
Версия: от 30.04.2013.
Описание: Kод добавляет новый пункт в контекстное меню вкладки: Дублировать таб, который дает возможность дублировать вкладку.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Добавить новый пункт "Дублировать таб" в контекстном меню вкладки ...................................
(function() {

   var node = document.getElementById("duplicateTab");
   if ( node ) node.parentNode.removeChild( node );
        
   var tabMenu = gBrowser.tabContainer.contextMenu || document.getAnonymousElementByAttribute(gBrowser, "anonid", "tabContextMenu");
   var menuItem = document.createElement("menuitem");                
   menuItem.setAttribute("label", "Дублировать вкладку");
   menuItem.setAttribute("id", "duplicateTab");
   menuItem.setAttribute("oncommand", "gBrowser.selectedTab = gBrowser.duplicateTab( gBrowser.mCurrentTab )");
   tabMenu.insertBefore( menuItem, tabMenu.firstChild.nextSibling );
})();

Копировать информацию о вкладках( Firefox 3.6 + )
Автор: Dumby
Версия: от 02.05.2013.
Описание: Kод дает возможность копировать разную информацию о открытых табах. Kод добавляет подменю Копировать информацию о табах в контекстное меню вкладки как последний пункт. Левый клик на пунктах подменю копирует информацию о всех вкладках, правый клик только о вкладках текущей группы.

Подменю содержит пункты:
Копировать адрес
Копировать название
Копировать адрес иконки
Копировать короткое название
Копировать адрес и название
Копировать адрес и название как BBCode
Копировать адрес и название как HTML
Копировать адреса всех табов
Копировать название всех табов
Копировать адреса и название всех табов
Копировать адреса и название всех табов как BBCode
Копировать адреса и название всех табов как HTML

Лишние пункты в подменю можно просто удалить из кода:
На пример если не нужен пункт Копировать адрес удалите:

Выделить код

Код:

["адрес", copySingle + url + ");"],


Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Копировать информацию о вкладках, от 02.05.2013. ..............
(function() {
    const id = "copyTabInfoMenu";

    function n(id) document.getElementById(id);
    function c(name) document.createElement(name);

    const root = n("tabContextMenu");
    var menu = n(id);
    if (menu) {
        root.removeChild(menu.previousSibling);
        root.removeChild(menu);
    }
    const ruCopy = "Копировать ";
    const tab = "document.popupNode.";
    const url = "linkedBrowser.currentURI.spec";
    const copySingle = "gClipboard.write(document.popupNode.";
    const copyAll = "gClipboard.write(Array.slice(gBrowser.tabs).map(function(tab) ";
    const copyAllEnd = ').join("\\r\\n"));';

    const data = [
                                          ["адрес", copySingle + url + ");"],
                                       ["название", copySingle + "label);"],
                                   ["адрес иконки", copySingle + "image);"],
                              ["короткое название", copySingle + "label.substring(0, 50) + (" + tab + 'label.length > 50 ? " ......" : ""));'],
                               ["адрес и название", copySingle + "label" + ' + "\\r\\n" + ' + tab + url + ");"],
                    ["адрес и название как BBCode", copySingle.replace("(", '(\'[url="\' + ') + url + ' + \'"]\' + ' + tab + 'label + "[/url]");'],
                      ["адрес и название как HTML", copySingle.replace("(", '(\'<a href="\' + ') + url + ' + \'">\' + ' + tab + 'label + "</a>");'],
                              ["адреса всех табов", copyAll + "tab." + url + copyAllEnd],
                            ["название всех табов", copyAll + "tab.label" + copyAllEnd],
                   ["адреса и название всех табов", copyAll + 'tab.label + "\\r\\n" + tab.' + url + copyAllEnd.replace('"))', '\\r\\n"))')],
        ["адреса и название всех табов как BBCode", copyAll + '\'[url="\' + tab.' + url + ' + \'"]\' + tab.label + "[/url]"' + copyAllEnd],
          ["адреса и название всех табов как HTML", copyAll + '\'<a href="\' + tab.' + url + ' + \'">\' + tab.label + "</a>"' + copyAllEnd]
    ];

    var menu = c("menu");
    var popup = c("menupopup");
    var sep = c("menuseparator");

    menu.id = id;
    menu.setAttribute("label", "Копировать информацию о вкладках");

    popup.setAttribute(
        "onclick", '\
        if (event.button != 2) return; event.preventDefault();\
        eval(event.target.getAttribute("oncommand").replace("tabs", "visibleTabs"));\
        this.parentNode.parentNode.hidePopup();'
    );
    data.forEach(function(attrs) {
        var menuitem = c("menuitem");
        menuitem.setAttribute("label", ruCopy + attrs[0]);
        menuitem.setAttribute("oncommand", attrs[1]);
        popup.appendChild(menuitem);
    });
    menu.appendChild(popup);
    root.appendChild(sep);
    root.appendChild(menu);

    addDestructor(function(reason) { if (reason == "delete") { root.removeChild(sep); root.removeChild(menu); }});
})();
bunda1 пишет

Что конкретно нужно?

А можешь сделать, что бы ЛКМ открывал абсолютно всё в новых не активных вкладках, СКМ в текущей?

voqabuhe пишет

А можешь сделать, что бы ЛКМ открывал абсолютно всё в новых не активных вкладках, СКМ в текущей?

Это сложно, надо подумать.

voqabuhe пишет

А можешь сделать, что бы ЛКМ открывал абсолютно всё в новых не активных вкладках

Выделить код

Код:

//ЛКМ откроет все ссылки в новых неактивных вкладках
(function() {
    //Стоп, если функция уже выполнялась
    if (this.linkInTab) return;
    this.linkInTab = true;

    function OnClick(e) {
        var href, sURI, target;

        for(target=(e.button==0?e.target:null); target!=null;
            target=target.parentNode) {
            if (!target.localName || target.localName=='A' ||
                target.localName=='a')
                break;
        }
        if (target!=null && target.href!=null) {
            href = target.href; sURI = gBrowser.currentURI.spec;
            gBrowser.loadOneTab(href, {
                    referrerURI: document.documentURIObject,
                    charset: target.charset, postData: null,
                    inBackground: true});
                e.preventDefault();
        }
    }

    try {
        gBrowser.addEventListener('click', OnClick, false);
    }catch(e) {}
})();

bunda1
Спасибо огромное, очень здорово.:beer: Но есть небольшой баг :), каждое ПКМ-настроить вызывает открытие дополнительного дубликата вкладки. И ещё хотелось бы распространить такое действие на закладки.

voqabuhe пишет

....есть небольшой баг, каждое ПКМ-настроить вызывает открытие дополнительного дубликата вкладки.

Я исправил: Сегодня 00:31:13

14-05-2012 13:12:16

voqabuhe пишет

И ещё хотелось бы распространить такое действие на закладки.

Выделить код

Код:

//Открывать закладки в новых фоновых вкладках......................................................................
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
prefs.setBoolPref("browser.tabs.loadBookmarksInBackground", true);
//
if (typeof PlacesUIUtils.__oretab_bload == 'undefined') {
   PlacesUIUtils.__oretab_bload = true;
   var __org_openNodeIn = PlacesUIUtils._openNodeIn;
   PlacesUIUtils._openNodeIn = function ORE_PU_openNodeIn(aNode, aWhere, aWindow) {
      var aWhere = 'tab';
      if(/^javascript:/.test(aNode.uri)) aWhere = 'current';
      return __org_openNodeIn.call(PlacesUIUtils, aNode, aWhere, aWindow);
}
 };
bunda1 пишет

Я исправил: Сегодня 00:31:13

У меня после исправления  перестала работать. А из закладок открывает нормально.

voqabuhe
Попробуй сейчас.

bunda1
Теперь просто великолепно, спасибо. good2.gifthank_you2.gif

bunda1
А вторую часть просьбы сможете сделать, есть надежда? Я про СКМ.

voqabuhe пишет

А можешь сделать, что бы ЛКМ открывал абсолютно всё в новых не активных вкладках, СКМ в текущей?

voqabuhe
Я попробую.

bunda1 пишет

Я попробую.

Вопрос снимается, уже привык к стандартной работе кнопок.:)

voqabuhe
:) Очень хорошо, а то никак руки не доходят до твоей просъбе.

Кто нибудь может сделать что-бы новая вкладка открывалась по двойному клику ЛКМ по свободному месту на панели вкладок, как в ТabMixPlus, в Firefox 14.01. Не могу найти нормально работающее, либо через кнопку как здесь, либо через userchrome.css, или user.js, я в этом не разбираюсь. Держать целое расширение ради одной опции как-то не разумно.

okkamas_knife пишет

а что в 14 фф убрали эту фичу?

Есть на СКМ, а двойной ЛКМ меняет размер окна.

voqabuhe
подозреваю, что только если tabs on top включен

iDev.Pi пишет

подозреваю, что только если tabs on top включен

А, точно, я уже и забыл, что они могут быть в другом месте.:)

iDev.Pi
подозреваю, что только если tabs on top включен

Точно, переключился работает, вопрос снимается, спасибо.

25-07-2012 13:55:32
villa7

Точно, переключился работает, вопрос снимается, спасибо.

Поспешил, переключил вкладки вверх а TabMix забыл отключить, так что не открывает новые вкладки, вопрос остался.

villa7
Открыть новый таб двойным кликом левой кнопкой на титлебаре(Titlebar)

bunda1

villa7
Открыть новый таб двойным кликом левой кнопкой на титлебаре(Titlebar)

Я пробовал Ваши несколько вариантов, но у меня почему-то на титлебаре вообще не работает, а "Двойной клик левой кнопкой на табе, открыть домашнюю страницу" работает не совсем так как нужно, новую вкладку добавляет по щелчку по панели вкладок, но при этом вкладки двойным щелчком перестает закрывать.

villa7
Двойным левым кликом на панели вкладок если табы сверху на титлебаре. И в about:config > browser.tabs.drawInTitlebar - true

TabMix отключил ?

villa7 пишет

"Двойной клик левой кнопкой на табе, открыть домашнюю страницу" работает не совсем так как нужно, новую вкладку добавляет по щелчку по панели вкладок, но при этом вкладки двойным щелчком перестает закрывать.

Поправил код:04-11-2011 21:15:56
Этот код не должен двойным щелчком закрывать вкладку.

bunda1

Что-то у меня не срабатывает, ладно, будем пользоваться по старинке. Спасибо за участие.

Открывать всё в новых вкладках( Firefox 17 + )
Автор: bunda1
Версия: от 16.12.2013.
Описание: Kод заставляет браузер всё открывать в новых вкладках - закладки, историю, адрес из адресной строки, результаты поиска из поисковой строки, домашнюю страницу.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Открывать всё в новых вкладках, от 16.12.2013. ......................................
(function () {
   // открывать всё из ниже перечисленного в новых вкладках, если пустая страница открывать в текущей ....
   const where = whereToOpenLink;
   eval("whereToOpenLink = " + where.toString()
   .replace('return "current";\n}', (function() {
      switch ( e.originalTarget.id ) {
        case "bookmarksMenuPopup":
        case "goPopup":
        case "appmenu_bookmarksPopup":
        case "appmenu_historyMenupopup":
        case "personal-bookmarks":
        case "bookmarks-menu-button":
        case "historymenu_history":
        case "home-button":
        case "page-proxy-stack":
        case "go-button":
        case "urlbar-go-button":
        case "PopupAutoCompleteRichResult":
        case "searchbar":
        case "PopupAutoComplete":
        return "tab";
        
        default: return "current";  
      }
   }).toString().replace(/^.*{|}$/g, "")+"}"));
     
   // открывать закладки и историю в новых вкладках, если букмарклети или пустая страница в текущей ....
   const openNode = PlacesUIUtils._openNodeIn;
   eval("PlacesUIUtils._openNodeIn = " + openNode.toString().replace(') {', '){\n if (["about:newtab", "about:blank"].indexOf(content.location.href)!= -1 ) aWhere = "current";\n aWhere = (aWhere == "tab" || aNode.uri.startsWith("javascript:") ) ? "current" : "tab";\n')
   );

   // если JavaScript ссылка или пустая страница открывать в текущей ....
   const linkIn = openLinkIn;
   eval("openLinkIn = " + linkIn.toString().replace(';', ';;\n if ( url.startsWith("javascript:") ) where = "current";\n if (["about:newtab", "about:blank"].indexOf(content.location.href)!= -1 ) where = "current";')
   );

   // команды адресной строки открывают всё связанное с адресной строкой в новых вкладках, если alt+ в текущей ....
   const handle = gURLBar.handleCommand;
   eval("gURLBar.handleCommand = " + handle.toString().replace('aTriggeringEvent.altKey;', 'aTriggeringEvent.altKey == false;'));
   
   // 'Вставить и перейти' из адресной строки  открывает в новых вкладках ....
   addEventListener("popupshowing", function(e) {
      var menupopup = e.originalTarget;
      var pasteAndGo = menupopup.getElementsByAttribute("anonid", "paste-and-go")[0];
      if ( !pasteAndGo ) return;
      pasteAndGo.setAttribute("oncommand", "event.preventDefault(); gURLBar.select(); goDoCommand('cmd_paste'); gURLBar.handleCommand(event);")
   }, false, document.getElementById("urlbar") );
   
   // удалять изменения из внутренних функций Firefox ....
   addDestructor(function() {
      eval("whereToOpenLink = " + where);
      eval("PlacesUIUtils._openNodeIn = " + openNode);
      eval("openLinkIn = " + linkIn);
      eval("gURLBar.handleCommand = " + handle);
   });
   
})();

Открыть в новой вкладке (Firefox 3.6 + )

bunda1,Хорошая кнопка вышла , и в [nightly] работает :) ... а можно добавить чтобы при клике на ссылку она открывалась в новой странице ? ,   потому что клик средней кнопкой теперь вообще не срабатывет :whistle:

Крошка Ру
С FF14 нет проблем, вот на Nightly действительно средняя кнопка перестала открывать ссылки. Вечно они что то испортят, уже не первый код который на Nightly отказывает. Попробую исправить, но код не мой.

bunda1 пишет

Открыть в новой вкладке(Firefox 3.6 +  )

кнопка глючит с расширением IE Tab

А возможно ли переназначит клик СКМ по панели вкладок, по умолчанию он открывает новую вкладку, а требуется закрытие активной вкладки.

Закрывать активный таб средним кликом на панели вкладок( Firefox 10 + )
Автор: bunda1, Dumby
Описание: Kод дает возможность закрывать активный таб средним кликом на панели вкладок.
Использование: создайте новую Custom Buttons кнопку и положите код в инициализацию. Можно положить код в уже существующую кнопку, но если в кнопке уже есть другие коды у которых есть this.onDestroy = function() {.. то надо поставить в начале кнопки вот этот код

Выделить код

Код:

function closeWithMiddle(e) {
    if (
        e.button !== 1 ||
        e.target.nodeName !== "tabs" ||
        e.originalTarget.localName !== "box" 
    ) return;

    e.stopPropagation();
    gBrowser.removeTab(gBrowser.selectedTab);
}
gBrowser.mTabContainer.addEventListener("click", closeWithMiddle, true);
this.onDestroy = function() {
     gBrowser.mTabContainer.removeEventListener("click", closeWithMiddle, true);    
};

bunda1
Спасибо, но есть небольшой изъян, после закрытия текущей вкладки, выделяется адрес в urlbar-е, предыдущей, и еще вкладка закрывается без анимации. Я так понимаю, просто используется другая команда закрытия?

vom
Выделение адреса в urlbar-е я убрал, а вот с анимацией я не знаю что делать. Тут проблема в том что по умолчанию средний клик открывает новую вкладку и не получается заблокировать это, и приходится её закрывать обработчиком который следит за открытием новых табов:

Выделить код

Код:

gBrowser.tabContainer.addEventListener("TabOpen", function(e) {
              gBrowser.removeTab( e.target );
              setTimeout(function() { window.content.focus() }, 0)
              this.removeEventListener("TabOpen", arguments.callee, false)
              }, false);

наверно новая вкладка не открывается до конца и потому так с анимацией. Kоманда закрытия тут ни при чем. Хотя можно закрывать новую вкладку после полной загрузки но тогда она будет появляться.

bunda1
Отлично, спасибо большое, а анимация это мелочь. Не могли бы вы помочь вот здесь Custom Buttons?

bunda1 пишет

проблема в том что по умолчанию средний клик открывает новую вкладку и не получается заблокировать это

Во, вроде блокируется

скрытый текст

Выделить код

Код:

function test(e) {
    if (
        e.button != 1 ||
        e.target.nodeName != "tabs" ||
        e.originalTarget.localName != "box" 
    ) return;

    e.stopPropagation();
    gBrowser.removeTab(gBrowser.selectedTab);
}
addEventListener("click", test, true, gBrowser.mTabContainer);

Dumby
Отлично, все работает. Я поменял свой код на твой. Спасибо :)

Да, теперь вообще хорошо. :)

Активизировать вкладку наведением курсора
Не подскажешь, чем отличаются эти коды, какой лучше? И возможно ли сделать так, что-бы вкладка активировалась только при попадании на 5 пикселей сверху таба, тогда было бы удобно закрывать вкладки посредством СКМ не переходя на них.

vom
В первом варианте можно указать как долго курсор должен находится над вкладкой что бы она активизировалась:
tab_hover.tid=setTimeout( function(){ gBrowser.selectedTab=tab_hover.event;   } , 0);
Насчет 5 пикселей сверху таба я не смогу помочь, не знаю как это сделать.

bunda1 пишет

Насчет 5 пикселей сверху таба

Хмм ?

скрытый текст

Выделить код

Код:

function test(e) {
    var node = e.target;
    if (
        e.screenY > node.boxObject.screenY + 5 ||
        node.nodeName != "tab" ||
        node == gBrowser.selectedTab
    ) return;
    gBrowser.selectedTab = node;
}
addEventListener("mousemove", test, false, gBrowser.mTabContainer);

Активировать вкладку наведением курсора немного над вкладкой(Firefox 3.6 + )
Автор: Dumby
Описание: Kод даёт возможность активизировать вкладку наведением курсора немного над вкладкой( 5 пикселей сверху ), без клика. В коде можно изменить высоту наведения.
Использование: создайте новую Custom Buttons кнопку и положите код в инициализацию. Можно положить код в уже существующую кнопку.

Выделить код

Код:

function tabHover(e) {
    var node = e.target;
    if (
        e.screenY > node.boxObject.screenY + 5 ||
        node.nodeName != "tab" ||
        node == gBrowser.selectedTab
    ) return;
    gBrowser.selectedTab = node;
}
addEventListener("mousemove", tabHover, false, gBrowser.mTabContainer);

bunda1Dumby
Не перестаете радовать, спасибо огромное. :) Кнопка вообще одна из must have получилась, мини-революция в эргономике. :cool:

vom пишет

Кнопка вообще одна из must have получилась, мини-революция в эргономике.

Эта правда.
Из этой темы собрал для себя кнопку использование которой позволило мне полностью отказаться от расширения TabMixPluse
Собственно говоря мне  TabMixPluse нужен быль лишь для того чтобы упорядочить открытие и закрытие вкладок.
А именно открывать сразу после текущей а закрывать с фокусом на левую.Плюс контекстное меню вкладки с возможностью дублировать текущую.
Осталась мелочь(наверно мелочь).
В TabMixPluse есть настройка позволяющая открывать вкладки из панели закладок(открыть всё во вкладках) в том порядке в котором они размещены.То есть верхняя закладка будет первой
вкладкой и так далее сверху вниз.Без TabMixPluse вкладки открываются наоборот первой вкладкой будет самая нижняя закладка и далее снизу вверх.Очень не удобно.
Не подскажите есть ли решение?
***
Не подскажите как можно отобрать кнопку закрытия на вкладках?
Мне нужно её скрыть но лёгких путей не хочу(userChrome.css)
Хочу добавить контекстный пункт к вкладкам для скрытия/показа кнопки закрытия
Пробовал вот так:
document.getAnonymousElementByAttribute(gBrowser.selectedTab, "class", "tab-close-button");
Но это только для текущей
***
Ещё хотелось бы добавить в контекстное меню вкладок пункт позволяющий перезагружать вкладку по таймеру.
Как обычно знаю как но не до конца.Не могу понять как воздействовать только на нужную вкладку.У меня перезагружаются
либо все либо текущая.

questman
Нужная для твоих пунктов меню вкладка это   this.parentNode.triggerNode   или   TabContextMenu.contextTab
Вот, кстати, незатейливая «перезагружалка», может быть пригодится...

скрытый текст

Выделить код

Код:

const reloadInterval = 5000; //ms
const labelReload = "Перезагружать вкладку";
const labelStopReload = "Остановить перезагрузку вкладки";

const tabContextMenu = document.getElementById("tabContextMenu");
const insertPoint = document.getElementById("context_reloadTab");
const id = "context_reloadTab_interval";
const attr = "reload-interval-id";

var menuitem = document.createElement("menuitem");
menuitem.id = id;
const command = '\
    var tab = this.parentNode.triggerNode;\n\
    var interval = tab.getAttribute("' + attr + '");\n\
    if (interval) {\n\
        clearInterval(interval);\n\
        tab.removeAttribute("' + attr + '");\n\
    }\n\
    else {\n\
        var interval = setInterval(function() {\n\
            gBrowser.reloadTab(tab);\n\
        }, ' + reloadInterval + ');\n\
        tab.setAttribute("' + attr + '", interval);\n\
    }';
menuitem.setAttribute("oncommand", command);
    
function insertMenuitem(e) {
    if (e.target != tabContextMenu) return;

    var tab = tabContextMenu.triggerNode;
    var interval = tab.hasAttribute(attr);

    var label = interval ? labelStopReload : labelReload;
    menuitem.setAttribute("label", label);
    tabContextMenu.insertBefore(menuitem, insertPoint.nextSibling);
}
function removeMenuitem(e) {
    if (e.target != tabContextMenu) return;
    tabContextMenu.removeChild(menuitem);
}
addEventListener("popupshowing", insertMenuitem, false, tabContextMenu);
addEventListener("popuphiding", removeMenuitem, false, tabContextMenu);

Dumby пишет

Вот, кстати, незатейливая «перезагружалка», может быть пригодится...

Ещё как пригодится.Спасибо огромное это больше на что я рассчитывал.

questman пишет

Не подскажите как можно отобрать кнопку закрытия на вкладках?

about:config
browser.tabs.closeButtons - 2

bunda1 пишет

browser.tabs.closeButtons - 2

Спасибо!
Переключение этого параметра реализовать в кнопке будет просто.

Dumby пишет

Вот, кстати, незатейливая «перезагружалка», может быть пригодится

Полезная вещь, а можно сделать её более затейливой - чтобы проверяла страницу на изменения и обновляла только тогда если изменения обнаружены или хотя бы что бы обновления происходили не заметно без вращения индикатора на табе, а то напрягает. Если конечно это не слишком сложно :/

Dumby
Присоединяюсь к bunda1, полезная вещь, а можно ли ее вкл/выкл повесить на ПКМ, а контекстное меню убрать?

Пришла в голову идея, чтобы не было холостой перезагрузки и не раздражал throbber, возможно ли сделать кнопку, перезагружающую таб только при активации. Т.е. находясь в этой теме, я нажимаю одинарный ПКМ по соседней вкладке http://forum.mozilla-russia.org/search. … n=show_24h и всегда при ее активации, она со свежими непрочитанными темами. Отключается тоже по ПКМ. Плюс к релоаду, будет удобен автоматический Scroll to Top.

bunda1
Я не знаю как проверить произошли ли изменения на странице,
для некоторых страниц, неверное, хтмл-текст можно сравнить, а может и нет...
С индикатором на табе, вроде, справился :)

скрытый текст

Выделить код

Код:

const checkInterval = 1 * 60 * 1000; //ms
const labelReload = "Перезагружать вкладку";
const labelStopReload = "Остановить перезагрузку вкладки";
const noThrob = true;

const tabContextMenu = document.getElementById("tabContextMenu");
const insertPoint = document.getElementById("context_reloadTab");

var menuitem = document.createElement("menuitem");
menuitem.id = "context_reloadTab_interval";

function setThrobberState(tab, throb) {

    const on = "tab-throbber";
    const off = "tab-throbber-off"
    var throbber = 
        document.getAnonymousElementByAttribute(tab, "class", on) ||
        document.getAnonymousElementByAttribute(tab, "class", off);
    throbber.className = throb ? on : off;
}
function tick(tab) {

    var oldDocs = tab.docs;
    if (!oldDocs) return;
    tab.docs = {};
    function fillTabDocs(tab, win) {

        var frames = win.frames;
        var loc = frames.location;
        if (loc != "about:blank") {
            tab.docs[frames.location] = oldDocs[frames.location] || "";
        }
        if (!frames.length) return;
        for(var i = 0; i < frames.length; i++)
            fillTabDocs(tab, frames[i]);
    }
    var br = tab.linkedBrowser;
    if (!br) return;
    fillTabDocs(tab, br.contentWindow);
    for(var loc in tab.docs) sendRequest(tab, loc);
    setTimeout(tick, checkInterval, tab);
}
function sendRequest(tab, loc) {

    var req = new XMLHttpRequest();
    req.open("GET", loc, true);
    req.responseType = "text";
//    reg.timeout = Math.round(checkInterval / 2);
    req.onloadend = function() {

//        if (req.status != 200) return;
        var res = req.responseText;

        var old = tab.docs[loc];
        if (old && old != res) {
            var wn = tab.linkedBrowser.webNavigation;
            wn.reload(wn.LOAD_FLAGS_BYPASS_CACHE);
        }
        tab.docs[loc] = res;
    }
    req.channel.loadFlags |= req.channel.LOAD_BYPASS_CACHE;
    req.send(null);
}
function onCommand(e) {

    var tab = e.target.parentNode.triggerNode;
    if (tab.docs) {
        delete tab.docs;
        setThrobberState(tab, true);
        return;
    }
    if (noThrob) setThrobberState(tab, false);
    tab.docs = {};
    tick(tab);
}
function insertMenuitem(e) {

    if (e.target != tabContextMenu) return;
    var tab = tabContextMenu.triggerNode;
    var protocol = tab.linkedBrowser.contentDocument.location.protocol;
    if (protocol != "http:" && protocol != "https:") return;

    var label = tab.docs ? labelStopReload : labelReload;
    menuitem.setAttribute("label", label);
    tabContextMenu.insertBefore(menuitem, insertPoint.nextSibling);
}
function removeMenuitem(e) {
    if (e.target != tabContextMenu) return;
    try {
        tabContextMenu.removeChild(menuitem);
    } catch(ex) {}
}
addEventListener("popupshowing", insertMenuitem, false, tabContextMenu);
addEventListener("popuphiding", removeMenuitem, false, tabContextMenu);
addEventListener("command", onCommand, false, menuitem);

this.onDestroy = function(reason) {
    if (reason == "update" || reason == "delete") {
        Array.slice(gBrowser.tabs).forEach(function(tab) {
            delete tab.docs;
            setThrobberState(tab, true);
        });
    }
};


vom
Так что-ли ?
скрытый текст

Выделить код

Код:

function reloader(e) {
    var tab = e.target;
    var br = tab.linkedBrowser;

    gBrowser.reloadTab(tab);
    br.addEventListener("DOMContentLoaded", function onLoad(e) {
        br.removeEventListener("DOMContentLoaded", onLoad, false);
        e.target.defaultView.scroll(0, 0);
    }, false);
}
function addListener(e) {
    if (e.button != 2 || e.target.nodeName != "tab") return;
    e.preventDefault();
    var tab = e.target;
    if (!tab.reloader) {
        addEventListener("TabSelect", reloader, false, tab);
        tab.reloader = true;
        return;
    }
    removeEventListener("TabSelect", reloader, false, tab);
    delete tab.reloader;
}
addEventListener("click", addListener, false, gBrowser.mTabContainer);

Dumby пишет

Так что-ли ?

В точку, спасибо большое. :) Опробовал, оказалось крайне удобно для многих сайтов, давно задумывался о подобном, т.к. простой перезагрузчик не рационален и не претенциозен.

Dumby
Хорошая кнопка, только как сделать чтобы была обычная перезагрузка, без прокрутки в начало страницы.

скрытый текст
function reloader(e) {
    var tab = e.target;
    var br = tab.linkedBrowser;

    gBrowser.reloadTab(tab);
    br.addEventListener("DOMContentLoaded", function onLoad(e) {
        br.removeEventListener("DOMContentLoaded", onLoad, false);
        e.target.defaultView.scroll(0, 0);
    }, false);
}
function addListener(e) {
    if (e.button != 2 || e.target.nodeName != "tab") return;
    e.preventDefault();
    var tab = e.target;
    if (!tab.reloader) {
        addEventListener("TabSelect", reloader, false, tab);
        tab.reloader = true;
        return;
    }
    removeEventListener("TabSelect", reloader, false, tab);
    delete tab.reloader;
}
addEventListener("click", addListener, false, gBrowser.mTabContainer);

villa7
Ну, вроде, дело нехитрое. Только не пойму, что хорошего в том,
что у табов нет контекстного меню. Давай хоть с Ctrl будет как обычно, мало-ли понадобиться :)

скрытый текст

Выделить код

Код:

function reloader(e) {
    gBrowser.reloadTab(e.target);
}
function onClick(e) {
    if (
        e.button != 2 ||
        e.ctrlKey ||
        e.target.nodeName != "tab"
    ) return;
    e.preventDefault();
    var tab = e.target;
    if (!tab.reloader) {
        addListener(tab, true);
        tab.reloader = true;
        return;
    }
    addListener(tab, false);
    delete tab.reloader;
}
function addListener(tab, add) {
    if (add) addEventListener("TabSelect", reloader, false, tab);
    else removeEventListener("TabSelect", reloader, false, tab);
}
for(var tab of gBrowser.tabs) if (tab.reloader) addListener(tab, true);
addEventListener("click", onClick, false, gBrowser.mTabContainer);

Dumby
Вот теперь то что нужно, спасибо. Почему нет контекстного меню у табов, у меня есть,  при двойном клике ПКМ все появляется, меня вполне устраивает.

Dumby пишет

bunda1
Я не знаю как проверить произошли ли изменения на странице,
для некоторых страниц, неверное, хтмл-текст можно сравнить, а может и нет...
С индикатором на табе, вроде, справился

Спасибо, спасибо :)

bunda1 пишет
Открывать любую новую вкладку справа от текущей

(Firefox 3.6 + )
Автор: bunda1
Описание: Kод дает возможность открывать любую новую вкладку справа от текущей.

Это очень полезный код.Но при "Открыть всё во вкладках" порядок вкладок меняется с ног на голову.
Нельзя ли сделать так чтобы этот код давал  возможность открывать всё во вкладках по порядку.

У меня при различных манипуляциях с кодом получается что то одно.Либо новая вкладка открывается справа
от текущей либо все вкладки открываются по порядку.Как это объединить не могу приложить ума.

questman
Да есть такой глюк, но я не знаю как с ним справиться.

questman пишет

при "Открыть всё во вкладках" порядок вкладок меняется с ног на голову.

Кривая распорка:

Выделить код

Код:

var multiTabPos = 0;
var lastMultiTab = 0;
addEventListener("TabOpen", function(event) {
    if(new Error().stack.indexOf("\nPUIU_openContainerInTabs@") == -1)
        multiTabPos = 0;
    else {
        var now = Date.now();
        if(now - lastMultiTab > 100)
            multiTabPos = 0;
        ++multiTabPos;
        lastMultiTab = now;
    }
    var tabpos = gBrowser.selectedTab._tPos + 1 + (multiTabPos && multiTabPos - 1);
    gBrowser.moveTabTo(event.target, tabpos);
}, false, gBrowser.tabContainer);
Infocatcher пишет

Кривая распорка:

Спасибо!!!
Это то что надо!
Теперь кнопочка собранная из этой темы полностью заменяет TabMixPlus вплоть до перезагрузки странички по таймеру.
Помню было лёгкое расширение для упорядочивания открытия и закрытия вкладок Tabberwocky но оно уже давно не работает.
Так не хотелось в своё время ставить TabMixPlus из за пары нужных функций.
А сейчас ещё лучше стало,нужные функции в одной махонькой кнопке.
Спасибо ещё раз.

А нельзя добавить в код инструкцию которая бы позволяла открывать все всплывающие окна в новой вкладке справа от текущей?

browser.link.open_newwindow.restriction = 0 ?

Infocatcher пишет

browser.link.open_newwindow.restriction = 0 ?

Да,оно!Спасибо!
Но тогда в код добавлять не нужно,раз в about:config можно изменить.
***
А есть где почитать информацию о документированных настройках about:config?

К сожалению эта кнопка не работает в Seamonkey 2.22. С этим можно что-нибудь сделать? Очень уж нужная кнопочка (хотя бы чтоб результат поиска в новой вкладке открывало, мне, собственно, только это и нужно).
Нашёл нужные настройки для поиска в самом Seamonkey.
А кнопка, кстати, ругается на то, что "openNode is undefined". Понятия не имею, что это значит, но на текущий момент моя проблема, кажется, решена.

MySh пишет

А кнопка, кстати, ругается на то, что "openNode is undefined". Понятия не имею, что это значит, но на текущий момент моя проблема, кажется, решена.

Код изменяет внутренние функции Firefox и если openNode is undefined то это значит что в Seamonkey такой функции нет.

bunda1 пишет

Копировать информацию о вкладках( Firefox 3.6 + )
Автор: Dumby

Удобный код .Спасибо.
 
                   
у меня (Aurora 28.0a2) не работает этот пункт,

Выделить код

Код:

["адрес и название как BBCode", copySingle.replace("(", '(\'[url="\' + ') + url + ' + \'"]\' + ' + tab + 'label + "[/url]");'],

а так работает (без кавычек)   url="....+ \'"] 

Выделить код

Код:

["адрес и название как BBCode", copySingle.replace("(", '(\'[url=\' + ') + url + ' + \']\' + ' + tab + 'label + "[/url]");'],
bunda1 пишет

Копировать информацию о вкладках( Firefox 3.6 + )
Автор: Dumby
Версия: от 02.05.2013.
Описание: Kод дает возможность копировать разную информацию о открытых табах. Kод добавляет подменю Копировать информацию о табах в контекстное меню вкладки как последний пункт.

Подменю содержит пункты:
Копировать адрес
Копировать название
Копировать адрес иконки
Копировать короткое название
Копировать адрес и название
Копировать адрес и название как BBCode
Копировать адрес и название как HTML
Копировать адреса всех табов
Копировать название всех табов
Копировать адреса и название всех табов
Копировать адреса и название всех табов как BBCode
Копировать адреса и название всех табов как HTML

Лишние пункты в подменю можно просто удалить из кода:
На пример если не нужен пункт Копировать адрес удалите:

Выделить код

Код:

["адрес", copySingle + url + ");"],


Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Очень полезная кнопка, но не хватает одной важной составляющей - выделенного текста: "Копировать адрес,  название и выделенный текст как BBCode".
Возможно, тогда само подменю должно вызываться из Главного контекстного меню, хотя меня бы больше устроило именно из таб меню.
Кроме того - возможно ли сделать так же как копировать - но paste, то есть вставить - на то место, где курсор в поле ввода?
P.S. Дополнительного подпункта меню "Копировать адрес,  название и выделенный текст как BBCode" - не надо, просто вместо "Копировать адрес и название как BBCode" должен быть "Копировать адрес,  название и выделенный текст как BBCode", но если текст не выделен, то это работает как сейчас в "Копировать адрес и название как BBCode"

difabor пишет

Очень полезная кнопка, но не хватает одной важной составляющей - выделенного текста: "Копировать адрес,  название и выделенный текст как BBCode".

Нужный пункт Адрес и редактированное название как BBCode

При клике ЛКМ копирует информацию всех вкладок
При клике ПКМ копирует информацию вкладок только из текущей группы вкладок

Выделить код

Код:

// Добавить подменю "Копировать адрес и название как BBCode или" в контекстном меню вкладки, от 09.04.2014. ................................
(function() {
   const tabContextMenu = document.getElementById("tabContextMenu"); 
   
   var separator = tabContextMenu.appendChild( document.createElement("menuseparator") );
   var menu = tabContextMenu.appendChild( document.createElement("menu") );      
   menu.setAttribute("label", "Копировать адрес и название как BBCode или ....");
    
   addDestructor(function() {
      tabContextMenu.removeChild( menu )
      tabContextMenu.removeChild( separator )        
   });      
        
   var array = [     
        { label: "Адрес", arg: 'url'},
        { label: "Название", arg: 'label'},
        { label: "Адрес иконки", arg: 'image'},
        { label: "Название коротко", arg: 'shortTitle'},
        { label: "Адрес и название", arg: 'tabInfo'},
        { label: "Адрес и название как HTML", arg: 'tabInfoHtml'},
        { label: "Адрес и редактированное название как BBCode", arg: 'tabChangedInfoBbcode'},
        { separator: '' },
        { label: "Адреса всех табов", arg: 'allTabsURL'},
        { label: "Название всех табов", arg: 'allTabsLabels'},
        { label: "Адреса и название всех табов", arg: 'allTabsInfo'},
        { label: "Адреса и название всех табов как HTML", arg: 'allTabsInfoHtml'},
        { label: "Адреса и название всех табов как BBCode", arg: 'allTabsInfoBbcode'},
              ];
   var menuPopup = menu.appendChild( document.createElement("menupopup") );              
   array.forEach(function( m ) {
        if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return };  
        var mItem = document.createElement("menuitem");
        mItem.setAttribute("label", m.label);
        mItem.arg = m.arg;
        menuPopup.appendChild( mItem );
   });
   addEventListener("click", function(e) {
      var tab = document.popupNode;
      tabContextMenu.hidePopup();
      var tabs = e.button ? gBrowser.visibleTabs : gBrowser.tabs;
      var arg = (e.target.nodeName == "menu") ? "tabInfoBbcode" : e.target.arg;
      
      switch(arg) {
         case "url": var info = tab.linkedBrowser.currentURI.spec; break;            
         case "label": var info = tab.label; break;
         case "image": var info = tab.image; break;
         case "shortTitle": var info = tab.label.slice(0,50) + (tab.label.length > 50 ? ' ......' : ""); break;
         case "tabInfo": var info = buildTabInfo(tab,arg); break;
         case "tabInfoHtml": var info = buildTabInfo(tab,arg); break;
         case "tabInfoBbcode": var info = buildTabInfo(tab,arg); break;
         case "tabChangedInfoBbcode": var text = tab.label; tab.label = custombuttons.promptBox("Измените название вкладки:",null, tab.label)[1]; var info = buildTabInfo(tab,arg); tab.label = text; break;
         case "allTabsURL": var info = Array.map(tabs, function(node) { return node.linkedBrowser.currentURI.spec }).join("\n"); break;
         case "allTabsLabels": var info = Array.map(tabs, function(node) { return node.label }).join("\n"); break;
         case "allTabsInfo": var info = Array.map(tabs, function(node) { return buildTabInfo(node,arg) }).join("\n"); break;
         case "allTabsInfoHtml": var info = Array.map(tabs, function(node) { return buildTabInfo(node,arg) }).join("\n"); break;
         case "allTabsInfoBbcode": var info = Array.map(tabs, function(node) { return buildTabInfo(node,arg) }).join("\n"); break;
      }
      gClipboard.write( info );
      
   }, false, menu );
      

   function buildTabInfo( tab, arg ) {
      var url = tab.linkedBrowser.currentURI.spec;
      switch( arg.slice(-4) ) {
         case "code":
            var info = '[url="' + url + '"]' + tab.label + '[/url]';
            break;
         case "Html":
            var info = '<a href="' + url + '">' + tab.label + '</a>';
            break;
         default:
            var info = tab.label + "\n" + url;
      }
      return info;
   };
   
})();

Кроме того - возможно ли сделать так же как копировать - но paste, то есть вставить - на то место, где курсор в поле ввода?

Лень делать и не нужно это.

Спасибо большое! Но насчёт ЛКМ/ПКМ - не понял - у меня работает одинаково, что ЛКМ, что ПКМ

difabor пишет

Спасибо большое! Но насчёт ЛКМ/ПКМ - не понял - у меня работает одинаково, что ЛКМ, что ПКМ

Значит ты не открываешь группы вкладок и речь идёт о пунктах которые которые информацию о всех вкладках.

Да, не открываю.
Спасибо

Копировать информацию о вкладках+( Firefox 64 + )
Авторы: bunda1, Dumby
Версия: от 08.11.2022.
Описание: Kод даёт возможность копировать разную информацию о открытых вкладках. Kод добавляет подменю Копировать адрес и название как BBCode или: в контекстное меню вкладки как последний пункт, клик на котором копирует адрес и название вкладки как BBCode, подменю содержит пункты:
   Адрес,
   Название,
   Адрес иконки,
   Адрес коротко
- копирует короткий адрес от сервиса сокращения ссылок - is.gd
   Название коротко - копирует название вкладки до 50 символов,
   Адрес и название,
   Адрес и название как HTML,
   Адрес и редактированное название как BBCode,
- даёт возможность редактировать название вкладки перед копированием,
   ...................................................................................
   Адреса всех вкладок,
   Название всех вкладок,
   Адреса и название всех вкладок,
   Адреса и название всех вкладок как HTML,
   Адреса и название всех вкладок как BBCode.

Левый клик на пунктах подменю копирует информацию о всех вкладках, средний или правый клик только о вкладках текущей группы.

Лишние пункты в подменю можно просто удалить из кода:
Пример, если не нужен пункт Адрес удалите:

Выделить код

Код:

url:                  "Адрес",


Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Добавить подменю "Копировать адрес и название как BBCode или" в контекстном меню вкладки, от 07.11.2022. ..............
(()=> {
   var tabContextMenu = document.getElementById("tabContextMenu");   

   var separator = tabContextMenu.appendChild(document.createElementNS(xulns, "menuseparator"));
   var menu = tabContextMenu.appendChild(document.createElementNS(xulns, "menu"));      
   menu.setAttribute("label", "Копировать адрес и название как BBCode или:");
   
   addDestructor(()=> {
      tabContextMenu.removeChild(menu);
      tabContextMenu.removeChild(separator);        
   });      
        
   var data = {
       url:                  "Адрес",
       label:                "Название",
       image:                "Адрес иконки",
       shortUrl:             "Адрес коротко",
       shortLabel:           "Название коротко",
       tabInfo:              "Адрес и название",
       tabInfoHtml:          "Адрес и название как HTML",
       tabChangedInfoBbcode: "Адрес и редактированное название как BBCode",
       separator1: 0,
       allTabsURL:           "Адреса всех вкладок",
       allTabsLabels:        "Название всех вкладок",
       allTabsInfo:          "Адреса и название всех вкладок",
       allTabsInfoHtml:      "Адреса и название всех вкладок как HTML",
       allTabsInfoBbcode:    "Адреса и название всех вкладок как BBCode"
   }
   var menuPopup = menu.appendChild(document.createElementNS(xulns, "menupopup"));              
   for (var key in data) {
        if (key.startsWith("separator")) { menuPopup.appendChild(document.createElementNS(xulns, "menuseparator")); continue; };
        var menuitem = menuPopup.appendChild(document.createElementNS(xulns, "menuitem"));
        menuitem.setAttribute("label", data[key]);
        menuitem.arg = key;
        };
   
   addEventListener("click", e=> {
      var info, tab = TabContextMenu.contextTab, lab = tab.label;
      var tabs = e.button == 0 ? [...gBrowser.tabs] : gBrowser.visibleTabs;
      var arg = (e.target == menu) ? "tabInfoBbcode" : e.target.arg;

      switch(arg) {
         case "url": info = tab.linkedBrowser.currentURI.spec; break;            
         case "label": info = lab; break;
         case "image": info = tab.image.replace("#-moz-resolution=16,16",""); break;
         case "shortUrl": copyShortUrl(tab); break;         
         case "shortLabel": info = lab.slice(0,50) + (lab.length > 50 ? ' ......' : ""); break;
         case "tabInfo": info = getInfo(tab, arg); break;
         case "tabInfoHtml": info = getInfo(tab, arg); break;
         case "tabInfoBbcode": info = getInfo(tab, arg); break;
         case "tabChangedInfoBbcode": info = getInfo({__proto__: tab, label: custombuttons.promptBox("Измените название вкладки:", null, lab)[1]}, arg); break;
         case "allTabsURL": info = tabs.map(node=> node.linkedBrowser.currentURI.spec).join("\n"); break;
         case "allTabsLabels": info = tabs.map(node=> node.label).join("\n"); break;
         case "allTabsInfo": info = tabs.map(node=> getInfo(node, arg)).join("\n"); break;
         case "allTabsInfoHtml": info = tabs.map(node=> getInfo(node, arg)).join("\n"); break;
         case "allTabsInfoBbcode": info = tabs.map(node=> getInfo(node, arg)).join("\n"); break;
      }
      gClipboard.write(info);

      tabContextMenu.hidePopup();      
   }, false, menu);
   
   function copyShortUrl(tab) { 
      fetch('https://is.gd/create.php?format=simple&url=' + encodeURIComponent(tab.linkedBrowser.currentURI.spec))
      .then(response => response.text())
      .then(shortUrl => gClipboard.write(shortUrl))
      .catch(error => alert(error));
   };  

   function getInfo(tab, arg) {
      var info, url = tab.linkedBrowser.currentURI.spec;      
      
      switch(arg.slice(-4)) {
        case "code": info = '[url="' + url + '"]' + tab.label + '[/url]'; break;
        case "Html": info = '<a href="' + url + '">' + tab.label + '</a>'; break;
        case "Info": info = tab.label + "\n" + url;
      }
      return info;
   };
   
})();

Тоже хотелось бы избавиться от TU ибо почти ничего их того множества опций не нужно или могу обойтись, очень редко юзаецца. Но есть необходимые, мож уже есть кнопки для этого:
- ЛКМ по текущей открытой вкладке - переход на последнюю посещенную(т.е. предыдущую где был, поведение из Оперы)
- при закрытии вкладки - переход тоже на последнюю посещенную.
подскажите или пните в нужном направлении.

HaGEN пишет

- при закрытии вкладки - переход тоже на последнюю посещенную.

:/

Выделить код

Код:

const tc = gBrowser.tabContainer;
let tabs = [];
function onTabSelect(e) {
    for (let i = 0; i < tabs.length; i++) {
        if (e.target.linkedPanel != tabs[i])
            continue;
        tabs.splice(i, 1);
        break;
    }
    tabs.push(e.target.linkedPanel);
}
function onTabClose(e) {
    let allTabs = Array.slice(tc.childNodes);
    let allTabsLP = allTabs.map(function(tab) {
        return tab.linkedPanel;
    });
    if (e.target == gBrowser.selectedTab &&
            tabs.length >= 1) {
        let tab;
        let lp = tabs[tabs.length - (tabs.length == 1 ? 1 : 2)];
        for (let i = 0; i < allTabsLP.length; i++) {
            if (lp != allTabsLP[i])
                continue;
            tab = allTabs[i];
            break;
        }
        if (tab)
            gBrowser.selectedTab = tab;
    }
    if (tabs.length != 0) {
        tabs = tabs.filter(function(tab) {
            return allTabsLP.indexOf(tab) != -1 ? true : false;
        });
        tabs.splice(tabs.length - (tabs.length == 1 ? 1 : 2), 1);
    }
}
addEventListener("TabSelect", onTabSelect, false, tc);
addEventListener("TabClose", onTabClose, false, tc);

я чета запутался да запатятовал. Благодарю bunda1 , но одно без другого ... хехех. В общем нашел плуг мааахонький, именно для этого. Наз. FLST - FocusLastSelectedTab делает именно то что нужно. И "click-по-текущей-вкл-ке" и "закрытие-вкл-ки" - переход на посл. посещенную.
TU таки удалил, хехех..., ибо и не нужно ни для чего более.
Благодарю bunda1 за желание помощи  *THANKS*

bunda1, Dumby
Долгое время использую вашу кнопку перезагрузки вкладки, при активации, спасибо большое. Но вот хотелось бы немного её модифицировать, чтобы ПКМ по левым 29 пикселям, т.е. по фавиконке, делали тоже самое, но без Scroll to Top, а ПКМ по остальной площади вкладки оставить со Scroll to Top, возможно ли это?

Dumby
Присоединяюсь к bunda1, полезная вещь, а можно ли ее вкл/выкл повесить на ПКМ, а контекстное меню убрать?

Пришла в голову идея, чтобы не было холостой перезагрузки и не раздражал throbber, возможно ли сделать кнопку, перезагружающую таб только при активации. Т.е. находясь в этой теме, я нажимаю одинарный ПКМ по соседней вкладке https://forum.mozilla-russia.org/search … n=show_24h и всегда при ее активации, она со свежими непрочитанными темами. Отключается тоже по ПКМ. Плюс к релоаду, будет удобен автоматический Scroll to Top.

function reloader(e) {
    var tab = e.target;
    var br = tab.linkedBrowser;

    gBrowser.reloadTab(tab);
    br.addEventListener("DOMContentLoaded", function onLoad(e) {
        br.removeEventListener("DOMContentLoaded", onLoad, false);
        e.target.defaultView.scroll(0, 0);
    }, false);
}
function addListener(e) {
    if (e.button != 2 || e.target.nodeName != "tab") return;
    e.preventDefault();
    var tab = e.target;
    if (!tab.reloader) {
        addEventListener("TabSelect", reloader, false, e.target);
        tab.reloader = true;
        return;
    }
    removeEventListener("TabSelect", reloader, false, e.target);
    delete tab.reloader;
}
addEventListener("click", addListener, false, gBrowser.mTabContainer);

Dexu
Да, это возможно. Вариант

скрытый текст

Выделить код

Код:

(trg => {
    var left = 29;

    var attr = "reload-onselect-mode";
    var url = "data:application/x-javascript," + encodeURIComponent("content.scrollTo(0, 0);");
    function scroll(tab) tab.linkedBrowser.messageManager.loadFrameScript(url, true);

    addEventListener("TabSelect", e => {
        if (!e.target.hasAttribute(attr)) return;
        var tab = e.target;
        gBrowser.reloadTab(tab);
        tab.getAttribute(attr) == 1 && scroll(tab);
    }, false, trg);

    addEventListener("click", e => {
        if (e.button != 2 || e.target.nodeName != "tab") return;
        e.preventDefault();
        var tab = e.target;
        if (tab.hasAttribute(attr)) tab.removeAttribute(attr);
        else {
            var mode = Number(e.clientX - tab.boxObject.x > left);
            tab.setAttribute(attr, mode);
            if (!tab.hasAttribute("pending") || !mode) return;
            var state = JSON.parse(SessionStore.getTabState(tab));
            if (state.scroll) {
                delete state.scroll;
                SessionStore.setTabState(tab, JSON.stringify(state));
            }
        }
    }, false, trg);
})(gBrowser.tabContainer);

Dumby
Спасибо огромнейшее, ещё в добавок моментальный Top, просто незаменимая кнопка. :music:

Подскажите, пожалуйста. При выборе "Адрес" на неактивной вкладке копируется URL открытой, а при выборе "Название" или "Адрес иконки" всё нормально – информация с таба на который наведён курсор. Необходимо что-бы и URL копировался того таба который под курсором.

vitalii201 пишет

Подскажите, пожалуйста. При выборе "Адрес" на неактивной вкладке копируется URL открытой, а при выборе "Название" или "Адрес иконки" всё нормально – информация с таба на который наведён курсор. Необходимо что-бы и URL копировался того таба который под курсором.

Вот исправил: Копировать информацию о вкладках

Dexu
Dumby

Dumby пишет

Спасибо огромнейшее, ещё в добавок моментальный Top, просто незаменимая кнопка. :music:

Можно пожалуйста по подробнее как сделать Scroll to Top?

P.S.
Создаю новую кнопку в Сustom Buttons-ложу этот код  в код-сохроняю кнопку-вытаскиваю на панель-нажимя на не -не чего не происходит.(что делаю не так?)

скрытый текст
(trg => {
    var left = 29;

    var attr = "reload-onselect-mode";
    var url = "data:application/x-javascript," + encodeURIComponent("content.scrollTo(0, 0);");
    function scroll(tab) tab.linkedBrowser.messageManager.loadFrameScript(url, true);

    addEventListener("TabSelect", e => {
        if (!e.target.hasAttribute(attr)) return;
        var tab = e.target;
        gBrowser.reloadTab(tab);
        tab.getAttribute(attr) == 1 && scroll(tab);
    }, false, trg);

    addEventListener("click", e => {
        if (e.button != 2 || e.target.nodeName != "tab") return;
        e.preventDefault();
        var tab = e.target;
        if (tab.hasAttribute(attr)) tab.removeAttribute(attr);
        else {
            var mode = Number(e.clientX - tab.boxObject.x > left);
            tab.setAttribute(attr, mode);
            if (!tab.hasAttribute("pending") || !mode) return;
            var state = JSON.parse(SessionStore.getTabState(tab));
            if (state.scroll) {
                delete state.scroll;
                SessionStore.setTabState(tab, JSON.stringify(state));
            }
        }
    }, false, trg);
})(gBrowser.tabContainer);

KOMMEHTATOP пишет

Можно пожалуйста по подробнее как сделать Scroll to Top?
Создаю новую кнопку в Сustom Buttons-ложу этот код  в код-сохроняю кнопку-вытаскиваю на панель-нажимя на не -не чего не происходит.(что делаю не так?)

Код при переключении на вкладку делает Scroll to Top и обнавляет вкладку, код также должен обнавлять вкладку по ПКМ на вкладке но на FF41 это не работает.

Привет.
Прошу проверить: у меня на 43 версии [firefox] не работает код отсюда https://forum.mozilla-russia.org/viewto … 06#p575006

bunda1 пишет

Открывать всё в новых вкладках

bunda1 пишет

Открывать любую новую вкладку справа от текущей( Firefox 17 + )
Автор: bunda1
Описание: Kод открывает любую новую вкладку справа от текущей.
Версия: от 08.04.2014.
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 08.04.2014. ................................ 
addEventListener("TabOpen", function(e) {
   var newTab = e.target;
   var lab = newTab.label; 
   var tabpos = gBrowser.selectedTab._tPos;
   var newTabLab = gBrowser.mStringBundle.getString("tabs.emptyTabTitle");  

   if ( tabpos == 0 && lab == newTabLab ) return;      // если восстановление сессии 
   if ( new Error().stack.indexOf("openContainer") !== -1 ) return;   // если открыть всё во вкладках из папки закладок  
   
   lab == newTabLab
   ? setTimeout(function() gBrowser.moveTabTo( e.target, tabpos + 1 ), 50) // если восстановление вкладки
   : gBrowser.moveTabTo( e.target, tabpos + 1 );
   
   // автоматически закрывать "custombutton" вкладку
   if ( lab.startsWith("custombutton://%") ) setTimeout(function() gBrowser.removeTab( newTab ), 0);

}, false, gBrowser.tabContainer );

кажется это кнопка работает не полностью на 45 мозиле. не все вкладки открываются справа от текущей.
скажем внешние из скайпа например или из расширения forum.ru-board bookmarks checker идут в конец списка вкладко

кажется это код работает

Выделить код

Код:

// Открывать любую новую вкладку справа от текущей, от 25.11.2015. ................................ 
addEventListener("TabOpen", (e)=> {
   var newTab = e.target,
       tabpos = gBrowser.selectedTab._tPos,
       err = new Error().stack; 

   // если восстановление сессии или открыть всё во вкладках из папки закладок 
   if ( /ssi_restore|openContainer/.test(err) ) return;  
   
   
// if ( tabpos == 0 && lab == newTabLab ) return;                     // если восстановление сессии
// if ( tabpos == 0 && lab == '' ) return;                            // если восстановление сессии с Bookmarks Tab     
// if ( new Error().stack.indexOf("openContainer") !== -1 ) return;   // если открыть всё во вкладках из папки закладок  
// if ( /handleLinkClick/.test(new Error().stack) ) return;           // если открыть ссылку по СКМ 
   

   /undoCloseTab/.test(err)
   ? setTimeout(()=> gBrowser.moveTabTo(newTab, tabpos + 1), 50) // если восстановление вкладки
   : gBrowser.moveTabTo(newTab, tabpos + 1);
   
      // автоматически закрывать "custombutton" вкладку
   if ( lab.startsWith("custombutton://%") ) setTimeout(function() gBrowser.removeTab( newTab ), 0);

}, false, gBrowser.tabContainer );

Копировать адрес … в [firefox] 69 "ломает" меню табов. Можно исправить?

Исправил Копировать информацию о вкладках+ для FF64+