Открывать закладки левым кликом в новой вкладке не закрывая меню закладок(Firefox 24 +)
Автор: bunda1
Версия: от 11.10.2016.
Описание: Kод дает возможность открывать левым кликом закладки в новой вкладке не закрывая меню закладок, если папка с закладками находится на панели закладок или в меню закладкок.
Если нажать Ctrl левый клик откроет закладку в текущей вкладке и меню закроется.
Меню автоматически закроется при уходе курсора с меню.

В строке кода:

Выделить код

Код:

var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];

можно указать адреса страниц где левый клик откроет закладку в текущей вкладке

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

Выделить код

Код:

// Открывать закладки левым кликом в новой вкладке не закрывая меню закладок, от 11.10.2016. ................
function openBook(e, target = e.originalTarget) { 
   if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
   if ( e.button == 0 ) {         // ЛКМ 
        e.preventDefault();
        e.stopPropagation();
         
        // открыть в новой или в текущей вкладке если это указанная вкладка ....
        var itemUri = target._placesNode.uri;
        var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
        ~current.indexOf(content.location.href) || e.ctrlKey ? gBrowser.loadURI(itemUri) : gBrowser.addTab(itemUri);

        setTimeout(()=> document.getElementById('placesContext').hidePopup(), 50);
        };
           

    // автоматически закрыть все меню закладок при уходе курсора .... 
    var menu = target.parentNode;
    if ( !menu || menu.localName !== 'menupopup' ) return;
                     
    menu.onmouseover =()=> menu.f = true;
    menu.onmouseleave =()=> { 
       menu.f = false;        
       setTimeout(()=> {   
          if ( menu.f ) return;
          for ( var node = menu; node; node = node.parentNode )
                node.nodeName == 'menupopup' && node.hidePopup();
          menu.onmouseleave = null;
       }, 500);    
    };        
}
!this.hasAttribute("initialized") && addEventListener("mouseup", openBook, true);

bunda1
Спасибо, замечательная кнопка. Даёт возможность отказаться от Stay-Open Menu. Вот только, если можешь добавь открытие закладки в текущей вкладке, например с Ctrl+ЛКМ

voqabuhe пишет

Спасибо, замечательная кнопка. Даёт возможность отказаться от Stay-Open Menu. Вот только, если можешь добавь открытие закладки в текущей вкладке, например с Ctrl+ЛКМ

09-10-2012 20:15:48

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

voqabuhe пишет

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

:( Не получается. Попробую открыть закладку в текущей вкладке двойным левым кликом.

bunda1 пишет

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

А если СКМ?

voqabuhe
Лучше не приучать себя к открытию через СКМ: ведь эта кнопка в ряде браузеров закрывает вкладки.

Открывать закладки левым кликом в новой вкладке не закрывая меню закладок +(Firefox 10 +)
Автор: bunda1
Описание: Kод дает возможность открывать левым кликом закладки в новой вкладке или удалять закладки средним кликом на закладке не закрывая меню закладок, если папка с закладками находится на панели закладок или в меню закладкок. Меню автоматически закроется при уходе курсора с меню.
Если адрес текущей страницы about:newtab, about:blank, chrome://browser/content/bookmarks/bookmarksPanel.xul левый клик откроет закладку в текущей вкладке.
Если нажать Ctrl левый клик откроет закладку в текущей вкладке и меню закроется.

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

Выделить код

Код:

/* Открывать закладки левым кликом в новой вкладке не закрывая меню закладок
   удалять закладки средним кликом на закладке .............................*/
function openRemoveBook(aEvent) { 
   
    var target = aEvent.originalTarget;
        
    // стоп, если не левый клик и закладка из меню закладок ....
    if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
         var bookMenu = target.parentNode;
        
         // стоп, если не левый клик и закладка из меню закладок ....
         if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
         // если левый клик ....    
         if ( aEvent.button == 0) {
              aEvent.preventDefault();
              aEvent.stopPropagation();
         
              // открыть в новой или в текущей вкладке если это указанная вкладка ....
              var itemUri = target._placesNode.uri; // получить адрес закладки 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              (current.indexOf(content.location.href) !== -1 || aEvent.ctrlKey)? gBrowser.loadURI( itemUri ): gBrowser.addTab( itemUri );
              };
       
         // если средний клик ....    
         if ( aEvent.button == 1) {
              aEvent.preventDefault();
              aEvent.stopPropagation();
              
              // удалить закладку ....
              var itemId = target._placesNode.itemId;
              PlacesUtils.bookmarks.removeItem(itemId);
              };
          
         // блокировать повторный запуск обработчика при открытии несколько закладок из одного меню закладок ....
         if ( this.stopListener ) return;
             this.stopListener = true;
              
         // обработчик закрывает меню при ухода мыши с меню и удаляет себя ....
         window.addEventListener('mouseover', function(event) { 
         var name = event.target.nodeName; 
         if  ( name == 'menu' || name == 'menupopup' || name == 'menuitem' || name == 'menuseparator') return;
               setTimeout(function() { bookMenu.hidePopup() }, 400); // закрыть меню через 400 ms
               window.removeEventListener("mouseover", arguments.callee, false);
               this.stopListener = false; // удалить флаг
         }, false);                
}
window.addEventListener("mouseup", openRemoveBook, false);

this.onDestroy = function() {
    window.removeEventListener("mouseup", openRemoveBook,  false);
};

А вариант с удалением закладок по Ctrl+СКМ будет?

voqabuhe пишет

А вариант с удалением закладок по Ctrl+СКМ будет?

вариант с удалением закладок по Ctrl+СКМ

Выделить код

Код:

/* Открывать закладки левым кликом в новой вкладке не закрывая меню закладок
   удалять закладки Ctrl+ средним кликом на закладке .............................*/
function openRemoveBook(aEvent) { 
   
    var target = aEvent.originalTarget;
        
    // стоп, если не закладка из меню закладок ....
    if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
         var target = aEvent.originalTarget;
         var bookMenu = target.parentNode;
        
         // стоп, если не левый клик и закладка из меню закладок ....
         if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
         // если левый клик ....    
         if ( aEvent.button == 0) {
              aEvent.preventDefault();
              aEvent.stopPropagation();
         
              // открыть в новой или в текущей вкладке если это указанная вкладка ....
              var itemUri = target._placesNode.uri; // получить адрес закладки 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              (current.indexOf(content.location.href) !== -1 || aEvent.ctrlKey)? gBrowser.loadURI( itemUri ): gBrowser.addTab( itemUri );
              };
       
         // если Ctrl+ средний клик ....    
         if ( aEvent.ctrlKey && !aEvent.shiftKey && !aEvent.altKey && !aEvent.metaKey && aEvent.button == 1 ) {
              aEvent.preventDefault();
              aEvent.stopPropagation();
              
              // удалить закладку ....
              var itemId = target._placesNode.itemId;
              PlacesUtils.bookmarks.removeItem(itemId);
              };
          
         // блокировать повторный запуск обработчика при открытии несколько закладок из одного меню закладок ....
         if ( this.stopListener ) return;
             this.stopListener = true;
              
         // обработчик закрывает меню при ухода мыши с меню и удаляет себя ....
         window.addEventListener('mouseover', function(event) { 
         var name = event.target.nodeName; 
         if  ( name == 'menu' || name == 'menupopup' || name == 'menuitem' || name == 'menuseparator') return;
               setTimeout(function() { bookMenu.hidePopup() }, 400); // закрыть меню через 400 ms
               window.removeEventListener("mouseover", arguments.callee, false);
               this.stopListener = false; // удалить флаг
         }, false);                
}
window.addEventListener("mouseup", openRemoveBook, false);

this.onDestroy = function() {
    window.removeEventListener("mouseup", openRemoveBook,  false);
};

bunda1
Спасибо.:beer: Конечно СКМ удалять удобней, но не для тех, кто привык так открывать закладки, я так десятка два закладок по удалял.:dumb: А с Ctrl+СКМ вполне безопасно.

Открывать/удалять закладки средним кликом не закрывая меню закладок

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

  • Middle Click = Открыть закладку в фоновой вкладке
  • Shift + Middle Click = Открыть закладку в активной вкладке
  • Ctrl + Middle Click = Действие по умолчанию для СКМ  ([about:config - browser.tabs.loadBookmarksInBackground;false] - открыть закладку в активной вкладке и закрыть меню)
  • Ctrl + Shift + Middle Click = Удалить закладку
Выделить код

Код:

function openBookMC(e) {
    if ( e.target.localName !== 'menuitem' ) return;
    if ( e.button == 1 && !e.ctrlKey && !e.shiftKey )  {
        e.stopPropagation();    
        openUILinkIn( e.originalTarget._placesNode.uri, "tabshifted" );       
    }; 
    if ( e.button == 1 && !e.ctrlKey && e.shiftKey )  {
        e.stopPropagation();
        openUILinkIn( e.originalTarget._placesNode.uri, "tab" );       
    };
    if ( e.button == 1 && e.ctrlKey && e.shiftKey )  {
        e.stopPropagation();
        PlacesUtils.bookmarks.removeItem( e.originalTarget._placesNode.itemId );           
    };    
};
window.addEventListener("click", openBookMC, true);

this.onDestroy = function() {
    window.removeEventListener("click", openBookMC, true);
};


v2

Выделить код

Код:

function openBookMC(e) {
    if ( e.target.localName == 'menuitem' ) {
        if ( e.target.getAttribute("scheme") != 'javascript' ) {
            if ( e.button == 1 && !e.ctrlKey && !e.shiftKey ) {
                    e.stopPropagation();
                   openUILinkIn( e.target._placesNode.uri, "tabshifted" );    
            } 
            if ( e.button == 1 && !e.ctrlKey && e.shiftKey ) {
                    e.stopPropagation();
                    openUILinkIn( e.target._placesNode.uri, "tab" );       
            }
        }
        if ( e.button == 1 && e.ctrlKey && e.shiftKey ) {
            e.stopPropagation();
            PlacesUtils.bookmarks.removeItem( e.target._placesNode.itemId );      
        }
    }
}

var popUpMenus = ["PlacesToolbar","bookmarks-menu-button","appmenu_bookmarksPopup","appmenu_historyMenupopup","bookmarksMenu","history-menu"];

for ( var i = 0; i < popUpMenus.length; i++ ) {
    var mItiemPopup = document.getElementById( popUpMenus[i] );
    mItiemPopup.addEventListener( "click", openBookMC, true );        
}

this.onDestroy = function() {
    for ( var i = 0; i < popUpMenus.length; i++ ) {
        var mItiemPopup = document.getElementById( popUpMenus[i] );
        mItiemPopup.removeEventListener( "click", openBookMC, true );    
    }
};

Открывать закладки левым кликом в новой вкладке не закрывая меню закладок + 2( Firefox 10 + )
Автор: bunda1
Версия: от 02.05.2013.
Описание: Kод даёт возможность:
1. открывать закладки левым кликом в новой вкладке,
2. открывать закладки средним кликом в текущей вкладке,
3. удалять закладки двойным правым кликом на закладке не закрывая меню закладок.
Код работает для папок с закладками которые находятся на панели закладок или в меню закладок.

Меню закладок автоматически закроется при уходе курсора с меню, это можно отключить если в начале кода переключить переменную: autoClose на false.

Если адрес текущей страницы about:newtab, about:blank, chrome://browser/content/bookmarks/bookmarksPanel.xul левый клик откроет закладку в текущей вкладке.
Если нажать Ctrl левый клик откроет закладку в текущей вкладке и меню закроется.

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

Код инициализации:

Выделить код

Код:

/* Открывать закладки левым кликом в новой вкладке или открывать закладки средним кликом на закладке не закрывая меню закладок
   или двойным правым кликом удалять закладки от 02.05.2013. */
function openOrRemoveBook(e) {
    
    var type = e.type;
    var target = e.originalTarget;
    var bookMenu = target.parentNode;
        
    // стоп, если не закладка из меню закладок .... 
    if ( target.localName !== "menuitem" || !target._placesNode ) return;
    
         var autoClose = true; // true => автоматически закрывать меню закладок
            
         // если левый клик открыть закладку в новой или в текущей вкладке если это указанная вкладка ....    
         if ( type == 'mouseup' && e.button == 0 ) {
              e.preventDefault();
              e.stopPropagation();
              var itemUri = target._placesNode.uri; // получить адрес закладки
              var bookmarklet = ( itemUri.substr(0, 11) == "javascript:"); 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              ( bookmarklet || current.indexOf(content.location.href) !== -1 || e.ctrlKey ) ? gBrowser.loadURI( itemUri ) : gBrowser.addTab( itemUri );
              };
       
         // если средний клик открыть закладку в текущей ....    
         if ( type == 'click' && e.button == 1 ) {
              e.stopPropagation();
              gBrowser.loadURI( target._placesNode.uri )
              };
              
         // если это двойной правый клик удалить закладку и закрыть контекстное меню ......
         if ( type == 'mouseup' && e.button == 2 ) {
              if ( bookMenu.open == true ) {
                   e.preventDefault();
                   setTimeout(function() { document.getElementById("placesContext").hidePopup() }, 0);
                   try { PlacesUtils.bookmarks.removeItem( target._placesNode.itemId )}
                   catch(e) { };                  
                   }
              bookMenu.open = true;
              setTimeout(function() { bookMenu.open = false }, 400); // сбросить флаг по таймеру
              };
         
        // автоматически закрыть все меню закладок при уходе курсора .... 
        if ( !autoClose ) return;    
        
        if ( bookMenu.stopListener ) return; // блокировать повторный запуск обработчика для текущего меню закладок
             bookMenu.stopListener = true;    
       
        // обработчик закрывает меню при ухода мыши с меню и удаляет себя
        addEventListener("mouseover", function close(e) { 
           if ( !/menu/.test( e.originalTarget.nodeName ) ) { 
                clearTimeout( bookMenu.timer );
                bookMenu.timer = setTimeout(function() {
                   removeEventListener("mouseover", close, false, window );                  
                   bookMenu.stopListener = false; // отключить блокировку запуска                    

                   for ( var node = bookMenu; node; node = node.parentNode ) {
                         if ( node.nodeName == 'menupopup' ) node.hidePopup(); // закрыть все меню закладок
                         }    
                   
                   }, 700 ); // закрыть меню через 700 ms
                }
            else clearTimeout( bookMenu.timer );              
                
        }, false );       
};               
addEventListener("mouseup", openOrRemoveBook, true, window );
addEventListener("click", openOrRemoveBook, true, window );


За помощь в создании кода спасибо 2k1dmg и Dumby

bunda1
С этой кнопкой перестают работать практически все Bookmarklet

voqabuhe пишет

С этой кнопкой перестают работать практически все Bookmarklet

Ой, я про это не подумал.
Буду исправлять.

bunda1
Спасибо, теперь всё ОК, просто высший класс:beer:

bunda1
После открытия редактора кнопки её производительность увеличивается в три раза. :) т.е открывает по ПКМ сразу три вкладки

10-11-2012 02:56:02
зы Первый клик после закрытия редактора срабатывает нормально, а потом начинает троить.

voqabuhe

Просто опечатка. Там, в самом конце кода,
вместо removeBook должно быть openOrRemoveBook

Dumby
А, спасибо.

А почему после открытия из Закладок открывается 2 одинаковые ссылки?

mettis пишет

А почему после открытия из Закладок открывается 2 одинаковые ссылки?

С которым кодом проблема ?

bunda1 пишет

mettis пишет: А почему после открытия из Закладок открывается 2 одинаковые ссылки?С которым кодом проблема ?

Открывать закладки левым кликом в новой вкладке не закрывая меню закладок + 2(Firefox 10 +)

mettis
B коде есть ошибки, буду исправлять.

А можно просто чтобы меню не закрывалось?
Кнопки мыши оставить по умолчанию.
А меню закрывалось только по клику либо по странице либо по другим элементам интерфейса браузера.

questman пишет

А можно просто чтобы меню не закрывалось?
Кнопки мыши оставить по умолчанию.
А меню закрывалось только по клику либо по странице либо по другим элементам интерфейса браузера.

Выделить код

Код:

/* Открывать закладки левым кликом в новой вкладке или открывать закладки средним кликом на закладке не закрывая меню закладок
   или двойным правым кликом удалять закладки от 20.04.2013. */
function openOrRemoveBook(e) {
   
    var type = e.type;
    var target = e.originalTarget;
    var bookMenu = target.parentNode;
    
    // стоп, если не закладка из меню закладок .... 
    if ( target.localName !== "menuitem" || !target._placesNode ) return;
            
         // если левый клик открыть закладку в новой или в текущей вкладке если это указанная вкладка ....    
         if ( type == 'mouseup' && e.button == 0 ) {
              e.preventDefault();
              e.stopPropagation();
              var itemUri = target._placesNode.uri; // получить адрес закладки
              var bookmarklet = ( itemUri.substr(0, 11) == "javascript:"); 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              ( bookmarklet || current.indexOf(content.location.href) !== -1 || e.ctrlKey ) ? gBrowser.loadURI( itemUri ) : gBrowser.addTab( itemUri );
              };
       
         // если средний клик открыть закладку в текущей ....    
         if ( type == 'click' && e.button == 1 ) {
              e.stopPropagation();
              gBrowser.loadURI( target._placesNode.uri )
              };
              
         // если это двойной правый клик удалить закладку и закрыть контекстное меню ......
         if ( type == 'mouseup' && e.button == 2 ) {
              if ( bookMenu.open == true ) {
                   e.preventDefault();
                   setTimeout(function() { document.getElementById("placesContext").hidePopup() }, 0);                   
                   PlacesUtils.bookmarks.removeItem( target._placesNode.itemId );
                   }
              bookMenu.open = true;
              setTimeout(function() { bookMenu.open = false }, 400); // сбросить флаг по таймеру
              };
         
 };               
addEventListener("mouseup", openOrRemoveBook, true, window );
addEventListener("click", openOrRemoveBook, true, window );

Мне нужно вот так:

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

Выделить код

Код:

function openOrRemoveBook(e){
    var type = e.type;
    var target = e.target;
    // стоп, если не закладка из меню закладок ....
    if(target.localName !== "menuitem" || !target._placesNode) return;
         // если левый клик меню не закрывается    
         if(type == 'mouseup' && e.button == 0){
            e.preventDefault();
            e.stopPropagation();
            var itemUri = target._placesNode.uri; // получить адрес закладки
            var bookmarklet = ( target.getAttribute("scheme") == 'javascript' ); 
            var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul", bookmarklet];
            (bookmarklet || current.indexOf(content.location.href) !== -1 || e.ctrlKey) ? gBrowser.loadURI(itemUri): gBrowser.addTab(itemUri);
         };
         // если средний клик меню не закрывается
        if(type == 'click' && e.button == 1){
            e.stopPropagation();
            gBrowser.addTab(target._placesNode.uri)
        };       
};               
window.addEventListener("mouseup", openOrRemoveBook, true);
window.addEventListener("click", openOrRemoveBook, true);
this.onDestroy = function(){
     window.removeEventListener("click", openOrRemoveBook, true);
     window.removeEventListener("mouseup", openOrRemoveBook, true);
};


bunda1 проверь пожалуйста верна ли редакция кода под себя

bunda1 а что поводу открытия одинаковых ссылок из закладок? нашли ошибку?

questman пишет

Мне нужно вот так:
bunda1 проверь пожалуйста верна ли редакция кода под себя

Нормально все :)

07-03-2013 00:02:29

mettis пишет

bunda1 а что поводу открытия одинаковых ссылок из закладок? нашли ошибку?

Нет, и у меня открывается только одна ссылка.  В коде есть проблема с авто закрытием которую я пока не решил.

у меня тоже на 20м открывается по 3-7 вкладок

sissterr пишет

у меня тоже на 20м открывается по 3-7 вкладок

Проблема наблюдается сразу после запуска браузера ?
Используешь расширения для работы с закладками ?
В кнопке с кодом [CB]Открывать закладки левым кликом... есть другие коды ?

bunda1,
да
нет
нет

sissterr пишет

у меня тоже на 20м открывается по 3-7 вкладок

А версия CustomButtons какая? У меня такое было со старой. Нужно поставить самую последнюю dev-версию отсюда, например: custombuttons-0.0.5.6pre5-20130226
На версиях [firefox] 20 - 23 кнопка нормально работает.

adidharma, пасибки, эта работает. хотя предыдущую скачала с другого места с точно  таким названием.
А что можно поправить в коде что б меню закладок сразу закрывалось после клика без увода курсора?

sissterr пишет

закрывалось после клика без увода курсора?

http://forum.mozilla-russia.org/viewtopic.php?pid=575006#p575006

sissterr пишет

А что можно поправить в коде что б меню закладок сразу закрывалось после клика без увода курсора?

Такое уже есть в FF или я что то не понял :/

bunda1
А к этому коду http://forum.mozilla-russia.org/viewtopic.php?pid=575006#p575006
нельзя прикрутить меню закладок, мне нужно что бы просто открывалось в новой активной вкладке по левому клику и всё. Или код какой другой,чтобы открывалось в активной и меню при клике пряталось.

villa7 пишет

bunda1
Или код какой другой,чтобы открывалось в активной и меню при клике пряталось.

Выделить код

Код:

function openBookmark(e) {
    
    var type = e.type;
    var target = e.originalTarget;
    var bookMenu = target.parentNode;
        
    // стоп, если не закладка из меню закладок .... 
    if ( target.localName !== "menuitem" || !target._placesNode ) return;
            
         // если левый клик открыть закладку в новой вкладке ....    
         if ( type == 'mouseup' && e.button == 0 ) {
              e.preventDefault();
              e.stopPropagation();
              var itemUri = target._placesNode.uri; // получить адрес закладки
              var bookmarklet = ( itemUri.substr(0, 11) == "javascript:"); 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              ( bookmarklet || current.indexOf(content.location.href) !== -1 || e.ctrlKey ) 
              ? gBrowser.loadURI( itemUri ) 
              : gBrowser.selectedTab = gBrowser.addTab( itemUri );
              };        
};               
addEventListener("mouseup", openBookmark, true, window );

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

villa7

Выделить код

Код:

function openBookmark(e) {
    
    var type = e.type;
    var target = e.originalTarget;
    var bookMenu = target.parentNode;
        
    // стоп, если не закладка из меню закладок .... 
    if ( target.localName !== "menuitem" || !target._placesNode ) return;
            
         // если левый клик открыть закладку в новой вкладке ....    
         if ( type == 'mouseup' && e.button == 0 ) {
              e.preventDefault();
              e.stopPropagation();
              var itemUri = target._placesNode.uri; // получить адрес закладки
              var bookmarklet = ( itemUri.substr(0, 11) == "javascript:"); 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              ( bookmarklet || current.indexOf(content.location.href) !== -1 || e.ctrlKey ) 
              ? gBrowser.loadURI( itemUri ) 
              : gBrowser.selectedTab = gBrowser.addTab( itemUri );
              
              for ( var node = bookMenu; node; node = node.parentNode ) {
                      if ( node.nodeName == 'menupopup' ) node.hidePopup(); // закрыть все меню закладок
                      }
              };        
};               
addEventListener("mouseup", openBookmark, true, window );

bunda1
Вот,то что нужно, давно хотел, спасибо большое.

решил приспособить этот код под среднюю кнопку мыши.
В итоге открываются две одинаковые вкладки. Получается, что e.preventDefault(); e.stopPropagation(); не срабатывают в данной ситуации?

Inko7 пишет

решил приспособить этот код под среднюю кнопку мыши.
В итоге открываются две одинаковые вкладки. Получается, что e.preventDefault(); e.stopPropagation(); не срабатывают в данной ситуации?

Это потому что по умолчанию средняя кнопка открывает закладку по клику а не при отпускании кнопки, то есть если произошло событие click

Выделить код

Код:

function openBookmark(e) {
    
    var type = e.type;
    var target = e.originalTarget;
    var bookMenu = target.parentNode;
        
    // стоп, если не закладка из меню закладок .... 
    if ( target.localName !== "menuitem" || !target._placesNode ) return;
            
         // если левый клик открыть закладку в новой вкладке ....    
         if ( type == 'click' && e.button == 0 ) {
              e.preventDefault();
              e.stopPropagation();
              var itemUri = target._placesNode.uri; // получить адрес закладки
              var bookmarklet = ( itemUri.substr(0, 11) == "javascript:"); 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              ( bookmarklet || current.indexOf(content.location.href) !== -1 || e.ctrlKey ) 
              ? gBrowser.loadURI( itemUri ) 
              : gBrowser.selectedTab = gBrowser.addTab( itemUri );
              };        
};               
addEventListener("click", openBookmark, true, window );
bunda1 пишет

то есть если произошло событие click

наверное и внутри условия нужно поменять на type == 'click' ?
иначе все равно две вкладки открывает...
а как можно вставить проверку загружаемой вкладки? иначе открывает в ней...

Inko7 пишет

наверное и внутри условия нужно поменять на type == 'click' ?
а как можно вставить проверку загружаемой вкладки? иначе открывает в ней...

Точно, а что за проверка ?

bunda1 пишет

а что за проверка ?

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

Inko7 пишет

нужно еще добавить проверку: если текущая вкладка занята загрузкой, то открывать в новой

Вот, кстати, пример: https://forum.mozilla-russia.org/viewto … 33#p621233

Infocatcher
о, точно! как я позабыл :sick:
спасибо

Все получилось! :rock:

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

Выделить код

Код:

// Открывать закладки средним кликом в новой вкладке не закрывая меню закладок, от 16.09.2013. ................................
(function() {
    const str = 'p"', rep = 'p" && !aEvent.button', obj = BookmarksEventHandler, func = obj.onClick;
    eval("BookmarksEventHandler.onClick = " + String.replace(func, str, rep));
    addDestructor(function() obj.onClick = func);
})();

У меня есть ряд вопросов-предложений касательно СВ в контексте работы с закладками.
Заранее прошу прощения у асов - я дилетант и если некоторые мои предложения будут выглядеть бредовыми в их глазах - просьба быть снисходительными.

1. Возможно ли создание кнопки которая будет имитировать открытие какого-то фолдера из бара закладок? Если да, то такая кнопка по мощности будет в 3 раза сильнее.
Левым кликом можно будет открыть один фолдер, средним - второй, а правым - третий.
Учитывая дичайший дефицит места для кнопок - 3-х кратный выигрыш видится мне привлекательным.
Хочу подчеркнуть особо - речь не идёт о создании такой кнопки, речь идёт о принципиальной возможности создания. Почему - объясню далее.

2. Возможна ли работа кнопки не по кликам, а по фазам клика? Поясню подробнее, что я имею в виду.
Любой клик по факту состоит из 3-х фаз - нажатие, удержание и отпускание, где 2-я фаза просто нивелирована по времени.
Если бы была возможность работы по фазам клика, эффективность кнопок была бы увеличена ещё вдвое. Поясню - на примере.
По левому нажатию кнопки, имитирующей фолдер появлялось бы выпадающее меню-список закладок фолдера (и его подфолдеров).
Удерживая левую кнопку нажатой, можно было бы выбрать нужную закладку,  а отпускание кнопки - вызов этой закладки.
Хочу заметить, что если при нажатии кнопки выбирается заранее определённый элемент из этого списка (по умолчанию - первый), то такая кнопка сразу выполняет две функции - классический клик вызовет закладку, а удержание - позволит "путешествовать" по меню-списку - примерно так же, как стрелки вперёд-назад в навигации позволяют и перейти вперёд/назад и меню истории открыть.
Хочу подчеркнуть, что это была бы фундаментальная фича: список-действие (сейчас можно либо вызвать список, либо сделать действие). Работа с фазами клика повышает эффективность каждой кнопки в 6 раз (3-левый/средний/правый х 2-список/действие)

3. Возможна ли обработка двумерного списка?
Поясню, что я имею в виду.
На сегодня любое контекстное меню представляет собой одномерный список - каждый менюитем это строка этого меню (200-300 пикселей) и нажатие на любое место этой строки вызывает одно и то же действие, ассоциированное с этим менюитемом. На мой взгляд это - немного расточительно. Если бы нажатие на левую часть строки вызывало бы действие, несколько отличное от нажатия на правую часть - мы бы уже имели бы двукратный выигрыш. Например, открытие закладки в новой вкладке или в той же можно было бы выбирать. Учитывая, что строка довольно большая, если её расцветить в несколько цветов - мы бы имели существенно больше возможностей на каждый менюитем.
Вопрос - или это в принципе возможно. Если же это - бред, заранее извиняюсь :(

4. Возможно ли работать по сочетанию кнопок мышки?
Если да, то к трём вариантам (левое/среднее/правое нажатие) добавилось бы ещё 6: л-с, л-п, с-л, с-п, п-л, п-с и при этом на каждое такое сочетание имелось бы два активных действия, а не одно - одна такая суперкнопка была бы эквивалентна примерно 20-ти обычным.
---------------------------------
У меня есть ещё идеи, но я не хочу морочить вам голову. Если эти предложения выходят за рамки этой темы - тоже прошу прощения. Дайте мне знать - и я открою отдельную тему (если Вы посоветуете).

difabor пишет

1. Возможно ли создание кнопки которая будет имитировать открытие какого-то фолдера из бара закладок?

Custom_Buttons/Bookmarks_Folder at master · Infocatcher/Custom_Buttons · GitHub

23-09-2013 21:32:53

difabor пишет

2. Возможна ли работа кнопки не по кликам, а по фазам клика? Поясню подробнее, что я имею в виду.

Возможна конечно, я думаю с разным кликами + меню проблем нет. А вот как там открыть закладки не знаю, но думаю тоже возможно. Но лично мне такая кнопка субъективно не нравится.

23-09-2013 21:35:33

difabor пишет

4. Возможно ли работать по сочетанию кнопок мышки?
Если да, то к трём вариантам (левое/среднее/правое нажатие) добавилось бы ещё 6: л-с, л-п, с-л, с-п, п-л, п-с и при этом на каждое такое сочетание имелось бы два активных действия, а не одно - одна такая суперкнопка была бы эквивалентна примерно 20-ти обычным.

Вот это как раз легче всего.

23-09-2013 21:39:35

difabor пишет

3. Возможна ли обработка двумерного списка?
Учитывая, что строка довольно большая, если её расцветить в несколько цветов - мы бы имели существенно больше возможностей на каждый менюитем.

Обработка двумерного списка тоже возможна, насчёт расцветить не знаю.

bunda1 пишет
difabor пишет

1. Возможно ли создание кнопки которая будет имитировать открытие какого-то фолдера из бара закладок?

Custom_Buttons/Bookmarks_Folder at master · Infocatcher/Custom_Buttons · GitHub

difabor пишет

2. Возможна ли работа кнопки не по кликам, а по фазам клика? Поясню подробнее, что я имею в виду.

Возможна конечно, я думаю с разным кликами + меню проблем нет. А вот как там открыть закладки не знаю, но думаю тоже возможно. Но лично мне такая кнопка субъективно не нравится.

Спасибо! Но я и не собирался создавать отдельные кнопки на закладки/фолдеры. Я предполагал "растворить" закладки/фолдеры в функциональных кнопках.
Другими словами, я предполагал "пришить" к функциональной кнопке (например, Memory Restart, 6 фолдеров, открывающихся по сочетаниям нажатий (Правое нажатие, затем левое, Левое, затем правое и т.д. всего возможно 6 таких сочетаний) с тем или иным фолдером - чтобы по каждому из этих сочетаний открывался список закладок/подфолдеров этого фолдера, по отпусканию второй из нажатых кнопок вызывалась бы выбранная закладка, по отпусканию первой из нажатых кнопок - страница бы заносилась в закладки.
При этом, например, Левое нажатие, Правый клик - это было бы загрузка первой закладки, из фолдера соответстветствующего Левому, затем правому нажатию. Почти аналогично бы страница заносилась бы в фолдер. То есть, мы бы имели одновременно и возможность выбора по контекстному меню и быстрый выбор.

bunda1 пишет
difabor пишет

4. Возможно ли работать по сочетанию кнопок мышки?
Если да, то к трём вариантам (левое/среднее/правое нажатие) добавилось бы ещё 6: л-с, л-п, с-л, с-п, п-л, п-с и при этом на каждое такое сочетание имелось бы два активных действия, а не одно - одна такая суперкнопка была бы эквивалентна примерно 20-ти обычным.

Вот это как раз легче всего.

difabor пишет

3. Возможна ли обработка двумерного списка?
Учитывая, что строка довольно большая, если её расцветить в несколько цветов - мы бы имели существенно больше возможностей на каждый менюитем.

Обработка двумерного списка тоже возможна, насчёт расцветить не знаю.

Если расцветить невозможно - есть ли возможность как-то выделить участки - точками или каким-то другим путём?

difabor , :)

:offtopic:

Нет, я не в попытке оспорить первенство, а к тому что чтобы продвинуть эти идеи в жизнь, нужно приложить тинанические усилия :lol:  И после уже сложно будет себя считать неквалифицированным пользователем... но тогда потеряется первоночальный смысл начинания :sick: :angel:

bunda1, а есть такая же кнопка, только чтобы СКМ (колёсико) открывать ссылки в новой фоновой вкладке не закрывая меню, а остальные кнопки действовали как полагается по умолчанию?

Northtech пишет

bunda1, а есть такая же кнопка, только чтобы СКМ (колёсико) открывать ссылки в новой фоновой вкладке не закрывая меню, а остальные кнопки действовали как полагается по умолчанию?

27-10-2012 15:38:15

09-05-2015 14:04:46
15-09-2013 14:51:40

bunda1 благодарю, не заметил)

bunda1 пишет

Открывать закладки левым кликом в новой вкладке

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

becool пишет

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

Выделить код

Код:

// Управление закладками, от 25.10.2014. ................................ 
(function func() {
   // страницы где левый клик открывает закладку в текущей странице
   var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"]; 
   
   const background = true;      // открывать закладку в фоновой вкладке
   const nextToCurrent = false;  // открывать закладку рядом с текущей вкладкой
   const menuAutoClose = true;   // автоматически закрыть меню закладок при уходе курсора
   
   function handleClick(e) { 
      var target = e.originalTarget;
      var sidebar = target.ownerDocument.defaultView.top !== content 
                    && target.id == 'bookmarks-view-children';
                    
      if ( !sidebar && !target._placesNode ) return; // стоп, если не закладка, папка, разделитель 

      // получить закладку, адрес, папку и id закладки, другие переменные
      if ( sidebar ) {
           var tree = target.parentNode;
           var box = tree.treeBoxObject;
           var row = box.getRowAt(e.clientX, e.clientY); 
           var node = tree.view.nodeForTreeIndex(row);            
           }
      var node = sidebar ? node : target._placesNode,
      id = node.itemId, uri = node.uri, button = e.button, type = e.type,            
      isFolder = PlacesUtils.nodeIsContainer(node), isURI = PlacesUtils.nodeIsURI(node);

      // двойной клик добавляет закладку или удаляет закладку, разделитель ....
      if ( button !== 1 && type == 'mouseup' ) {                 
           if ( button == 0 && func.flag == true && isFolder ) {
                addBookmark(node, false);
                sidebar && tree.view.toggleOpenState(row);               
                }
           
           if ( button == 2 && func.flag == true && !isFolder ) {                     
                setTimeout(function() { 
                   target.ownerDocument.getElementById("placesContext").hidePopup()
                   try { PlacesUtils.bookmarks.removeItem(id) } catch(e) {};                   
                }, 0); 
                }
                                
           func.flag = true;
           setTimeout(function() func.flag = false, 400 );
           }
           
      if ( isFolder ) return;                                // стоп, если папка закладок
      if ( button == 0 ) window.clearTimeout( func.timer );  // сбросить таймер длинного клика           

      // блокировать действие по умолчанию для клика и отжатия ....
      if ( button !== 2 && /click|mouseup/.test(type) ) { 
           e.preventDefault(); e.stopPropagation();
           }
      
      // левый длинный клик добавляет текущую вкладку в закладки под нажатой закладкой ....
      if ( button == 0 && type == 'mousedown' ) {                      
           func.loadBook = true;       
           func.timer = setTimeout(function() {
               func.loadBook = false;
               addBookmark(node.parent, id);
           }, 400 );  
           }
           
      // левый клик открывает закладку в новой или текущей вкладке ....      
      if ( button == 0 && type == 'mouseup' && func.loadBook && isURI ) {
           ( uri.startsWith("javascript") || current.indexOf(content.location.href) !== -1 || e.ctrlKey ) 
           ? gBrowser.loadURI( uri ) 
           : gBrowser.loadOneTab( uri, {relatedToCurrent: nextToCurrent, inBackground: background,
                                        referrerURI: null } );
           }       
    
      // средний клик открывает закладку в текущей вкладке ....
      if ( button == 1 && type == 'click' && isURI ) {             
           gBrowser.loadURI( uri );
           }           

      // автоматически закрыть все меню закладок при уходе курсора .... 
      var menu = target.parentNode;
      if ( !menuAutoClose || !menu || menu.localName !== 'menupopup' || type !== 'click' || button == 2 ) return;
                              
      menu.onmouseover = function() menu.f = true;
      menu.onmouseleave = function() { 
         menu.f = false;        
         setTimeout(function() {   
           if ( menu.f ) return;
           for ( var node = menu; node; node = node.parentNode )
                 node.nodeName == 'menupopup' && node.hidePopup();
           menu.onmouseleave = null;
         }, 500);    
      };
            
   };
   ["click", "dragstart", "mouseup", "mousedown"]
   .forEach(function(type) addEventListener(type, handleClick, true) );
   
   
   // добавить страницу в закладки в указанной папке ....
   function addBookmark(folder, id) {
      var title = gBrowser.mCurrentTab.label;
      var folderId = PlacesUtils.getConcreteItemId(folder);
      var index = id ? PlacesUtils.bookmarks.getItemIndex(id) + 1 : 0;
      var readOnlyFolder = PlacesUtils.nodeIsQuery(folder) ||
                           PlacesUtils.annotations.itemHasAnnotation(folderId, PlacesUtils.LMANNO_FEEDURI);
      if ( !readOnlyFolder )
           PlacesUtils.bookmarks.insertBookmark(folderId, gBrowser.currentURI, index, title);

      // всплывающая подсказка
      if ( id ) return;
      var al = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
      if ( readOnlyFolder ) {   
           al.showAlertNotification("chrome://global/skin/icons/error-16.png", folder.title, "Не поддерживается");
           return;
           }
      var icon = gBrowser.mCurrentTab.image || "chrome://global/skin/icons/information-16.png";
      al.showAlertNotification(icon, "Добавил в папку " + (folder.title || "(без заголовка)") + ":", title.slice(0, 100));
   };    
})();

bunda1, СКМ сделай пожалуйста открыть в новой фоновой вкладке.

becool пишет

bunda1, СКМ сделай пожалуйста открыть в новой фоновой вкладке.

Выделить код

Код:

// Управление закладками, от 25.10.2014. ................................ 
(function func() {
   // страницы где левый длинный клик открывает закладку в текущей странице
   var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"]; 
   
   const background = false;      // открывать закладку в фоновой вкладке
   const nextToCurrent = true;  // открывать закладку рядом с текущей вкладкой
   const menuAutoClose = true;   // автоматически закрыть меню закладок при уходе курсора
   
   function handleClick(e) { 
      var target = e.originalTarget;
      var sidebar = target.ownerDocument.defaultView.top !== content 
                    && target.id == 'bookmarks-view-children';
                    
      if ( !sidebar && !target._placesNode ) return; // стоп, если не закладка, папка, разделитель 

      // получить закладку, адрес, папку и id закладки, другие переменные
      if ( sidebar ) {
           var tree = target.parentNode;
           var box = tree.treeBoxObject;
           var row = box.getRowAt(e.clientX, e.clientY); 
           var node = tree.view.nodeForTreeIndex(row);            
           }
      var node = sidebar ? node : target._placesNode,
      id = node.itemId, uri = node.uri, button = e.button, type = e.type,            
      isFolder = PlacesUtils.nodeIsContainer(node), isURI = PlacesUtils.nodeIsURI(node);

      // двойной клик добавляет закладку или удаляет закладку, разделитель ....
      if ( button !== 1 && type == 'mouseup' ) {                 
           if ( button == 0 && func.flag == true && isFolder ) {
                addBookmark(node, false);
                sidebar && tree.view.toggleOpenState(row);               
                }
           
           if ( button == 2 && func.flag == true && !isFolder ) {                     
                setTimeout(function() { 
                   target.ownerDocument.getElementById("placesContext").hidePopup()
                   try { PlacesUtils.bookmarks.removeItem(id) } catch(e) {};                   
                }, 0); 
                }
                                
           func.flag = true;
           setTimeout(function() func.flag = false, 400 );
           }
           
      if ( isFolder ) return;                                // стоп, если папка закладок
      if ( button == 0 ) window.clearTimeout( func.timer );  // сбросить таймер длинного клика           

      // блокировать действие по умолчанию для клика и отжатия ....
      if ( button !== 2 && /click|mouseup/.test(type) ) { 
           e.preventDefault(); e.stopPropagation();
           }
      
      // левый длинный клик добавляет текущую вкладку в закладки под нажатой закладкой ....
      if ( button == 0 && type == 'mousedown' ) {                      
           func.loadBook = true;       
           func.timer = setTimeout(function() {
               func.loadBook = false;
               addBookmark(node.parent, id);
           }, 400 );  
           }
           
      // левый клик открывает закладку в новой или текущей вкладке ....      
      if ( button == 0 && type == 'mouseup' && func.loadBook && isURI ) {
           ( uri.startsWith("javascript") || current.indexOf(content.location.href) !== -1 || e.ctrlKey ) 
           ? gBrowser.loadURI( uri ) 
           : gBrowser.loadOneTab( uri, {relatedToCurrent: nextToCurrent, inBackground: background,
                                        referrerURI: null } );
           }       
    
      // средний клик открывает закладку в текущей вкладке ....
      if ( button == 1 && type == 'click' && isURI ) {             
           gBrowser.loadOneTab( uri, {relatedToCurrent: nextToCurrent, inBackground: true, referrerURI: null } );
           }           

      // автоматически закрыть все меню закладок при уходе курсора .... 
      var menu = target.parentNode;
      if ( !menuAutoClose || !menu || menu.localName !== 'menupopup' || type !== 'click' || button == 2 ) return;
                              
      menu.onmouseover = function() menu.f = true;
      menu.onmouseleave = function() { 
         menu.f = false;        
         setTimeout(function() {   
           if ( menu.f ) return;
           for ( var node = menu; node; node = node.parentNode )
                 node.nodeName == 'menupopup' && node.hidePopup();
           menu.onmouseleave = null;
         }, 500);    
      };
            
   };
   ["click", "dragstart", "mouseup", "mousedown"]
   .forEach(function(type) addEventListener(type, handleClick, true) );
   
   
   // добавить страницу в закладки в указанной папке ....
   function addBookmark(folder, id) {
      var title = gBrowser.mCurrentTab.label;
      var folderId = PlacesUtils.getConcreteItemId(folder);
      var index = id ? PlacesUtils.bookmarks.getItemIndex(id) + 1 : 0;
      var readOnlyFolder = PlacesUtils.nodeIsQuery(folder) ||
                           PlacesUtils.annotations.itemHasAnnotation(folderId, PlacesUtils.LMANNO_FEEDURI);
      if ( !readOnlyFolder )
           PlacesUtils.bookmarks.insertBookmark(folderId, gBrowser.currentURI, index, title);

      // всплывающая подсказка
      if ( id ) return;
      var al = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
      if ( readOnlyFolder ) {   
           al.showAlertNotification("chrome://global/skin/icons/error-16.png", folder.title, "Не поддерживается");
           return;
           }
      var icon = gBrowser.mCurrentTab.image || "chrome://global/skin/icons/information-16.png";
      al.showAlertNotification(icon, "Добавил в папку " + (folder.title || "(без заголовка)") + ":", title.slice(0, 100));
   };    
})();

const menuAutoClose = true;   // автоматически закрыть меню закладок при уходе курсора
Это для боковой пнели не работает?

becool пишет

const menuAutoClose = true;   // автоматически закрыть меню закладок при уходе курсора
Это для боковой пнели не работает?

Нет.

bunda1, большое спасибо!

Пользуюсь кнопкой Открывать закладки левым кликом в новой вкладке не закрывая меню закладок, удалять закладки Ctrl+ средним кликом на закладке
Можно сделать так, чтобы по Ctrl+СКМ удалялись и папки тоже?

Для [seamonkey] такую кнопку можно сделать?

stluka пишет

Для [seamonkey] такую кнопку можно сделать?

Выделить код

Код:

// Открывать закладки левым кликом в новой вкладке не закрывая меню закладок, от 03.09.2016. ................
function openBook(e, target = e.originalTarget) { 
   if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
   if ( e.button == 0 ) {         // если правый клик 
        e.preventDefault();
        e.stopPropagation();
         
        // открыть в новой или в текущей вкладке если это указанная вкладка ....
        var itemUri = target._placesNode.uri;
        var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
        ~current.indexOf(content.location.href) || e.ctrlKey ? gBrowser.loadURI(itemUri) : gBrowser.addTab(itemUri);

        setTimeout(()=> document.getElementById('placesContext').hidePopup(), 50);
        };
           

    // автоматически закрыть все меню закладок при уходе курсора .... 
    var menu = target.parentNode;
    if ( !menu || menu.localName !== 'menupopup' ) return;
                     
    menu.onmouseover =()=> menu.f = true;
    menu.onmouseleave =()=> { 
       menu.f = false;        
       setTimeout(()=> {   
          if ( menu.f ) return;
          for ( var node = menu; node; node = node.parentNode )
                node.nodeName == 'menupopup' && node.hidePopup();
          menu.onmouseleave = null;
       }, 500);    
    };        
}
!this.hasAttribute("initialized") && addEventListener("mouseup", openBook, true);

Можно ли сделать так, чтобы закладка, у которой чекбокс "Открывать в боковой панели" установлен, открывалась бы в боковой панели?

bunda1 спасибо за ответ. НО ...

Вставил код в раздел /*Initialization Code*/ новой кнопки. Вытянул кнопку на панель. Жму ЛКМ  не реагирует, СКМ не реагирует, ПКМ выпадает меню для редактирования, удаления и т.д. для кнопки.

stluka пишет

Вставил код в раздел /*Initialization Code*/ новой кнопки. Вытянул кнопку на панель. Жму ЛКМ  не реагирует, СКМ не реагирует, ПКМ выпадает меню для редактирования, удаления и т.д. для кнопки.

Ну так и задумано, кнопка и не должна реагировать на ЛКМ и СКМ. Мой код дает возможность открывать левым кликом закладки в новой вкладке не закрывая меню закладок, если папка с закладками находится на панели закладок или в меню закладкок. Если нажать Ctrl левый клик откроет закладку в текущей вкладке и меню закроется. Меню автоматически закроется при уходе курсора с меню.

bunda1 пишет

Ну так и задумано

Понял, спасибо.

bunda1, сделай, пожалуйста, актуальный вариант кода, чтоб вместо ЛКМ было СКМ.

becool пишет

bunda1, сделай, пожалуйста, актуальный вариант кода, чтоб вместо ЛКМ было СКМ.

Выделить код

Код:

// Открывать закладки левым кликом в новой вкладке не закрывая меню закладок, от 11.10.2016. ................
function openBook(e, target = e.originalTarget) { 
   if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;

   if ( e.button == 1 ) {        // ЛКМ 
        e.preventDefault();
        e.stopPropagation();
         
        // открыть в новой или в текущей вкладке если это указанная вкладка ....
        var itemUri = target._placesNode.uri;
        var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
        ~current.indexOf(content.location.href) || e.ctrlKey ? gBrowser.loadURI(itemUri) : gBrowser.addTab(itemUri);

        setTimeout(()=> document.getElementById('placesContext').hidePopup(), 50);
        };
           

    // автоматически закрыть все меню закладок при уходе курсора .... 
    var menu = target.parentNode;
    if ( !menu || menu.localName !== 'menupopup' ) return;
                     
    menu.onmouseover =()=> menu.f = true;
    menu.onmouseleave =()=> { 
       menu.f = false;        
       setTimeout(()=> {   
          if ( menu.f ) return;
          for ( var node = menu; node; node = node.parentNode )
                node.nodeName == 'menupopup' && node.hidePopup();
          menu.onmouseleave = null;
       }, 500);    
    };        
}
!this.hasAttribute("initialized") && addEventListener("click", openBook, true);

bunda1, премного благоарен! good2.gif

bunda1, небольшая проблемка: например, я хочу удалить закладку, ПКМ по закладке вызывает контекстное меню закладки, при наведении мыши на "удалить", все меню закладок изчезает.

becool пишет

bunda1, небольшая проблемка: например, я хочу удалить закладку, ПКМ по закладке вызывает контекстное меню закладки, при наведении мыши на "удалить", все меню закладок изчезает.

Выделить код

Код:

// Открывать закладки средным кликом в новой вкладке не закрывая меню закладок, от 27.03.2017. ................
function openBook(e, target = e.originalTarget) { 
   if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;

   if ( e.button == 1 && e.type == 'click' ) {        // ЛКМ 
        e.preventDefault();
        e.stopPropagation();
         
        // открыть в новой или в текущей вкладке если это указанная вкладка ....
        var itemUri = target._placesNode.uri;
        var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
        ~current.indexOf(content.location.href) || e.ctrlKey ? gBrowser.loadURI(itemUri) : gBrowser.addTab(itemUri);

        setTimeout(()=> document.getElementById('placesContext').hidePopup(), 50);
        };
           

    // автоматически закрыть все меню закладок при уходе курсора .... 
    var menu = target.parentNode;
    if ( !menu || menu.localName !== 'menupopup' || e.type !== 'click' || e.button == 2 ) return;
                     
    menu.onmouseover =()=> menu.f = true;
    menu.onmouseleave =()=> { 
       menu.f = false;        
       setTimeout(()=> { 
          if ( menu.f ) return;
          for ( var node = menu; node; node = node.parentNode )
                node.nodeName == 'menupopup' && node.hidePopup();
          menu.onmouseleave = null;
       }, 500);    
    };
}
!this.hasAttribute("initialized") && ["click", "mouseup"].forEach(type=> addEventListener(type, openBook, true) );

bunda1, теперь порядок, спасибо!

bunda1
Вы бы не могли пожалуйста добавить в эту кнопку, чтобы закладки открывались в активной вкладке?

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

Выделить код

Код:

/* Открывать закладки левым кликом в новой вкладке не закрывая меню закладок
   удалять закладки средним кликом на закладке .............................*/
function openRemoveBook(aEvent) { 
   
    var target = aEvent.originalTarget;
        
    // стоп, если не левый клик и закладка из меню закладок ....
    if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
         var bookMenu = target.parentNode;
        
         // стоп, если не левый клик и закладка из меню закладок ....
         if ( target.localName !== "menuitem" || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
         // если левый клик ....    
         if ( aEvent.button == 0) {
              aEvent.preventDefault();
              aEvent.stopPropagation();
         
              // открыть в новой или в текущей вкладке если это указанная вкладка ....
              var itemUri = target._placesNode.uri; // получить адрес закладки 
              var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
              (current.indexOf(content.location.href) !== -1 || aEvent.ctrlKey)? gBrowser.loadURI( itemUri ): gBrowser.addTab( itemUri );
              };
       
         // если средний клик ....    
         if ( aEvent.button == 1) {
              aEvent.preventDefault();
              aEvent.stopPropagation();
              
              // удалить закладку ....
              var itemId = target._placesNode.itemId;
              PlacesUtils.bookmarks.removeItem(itemId);
              };
          
         // блокировать повторный запуск обработчика при открытии несколько закладок из одного меню закладок ....
         if ( this.stopListener ) return;
             this.stopListener = true;
              
         // обработчик закрывает меню при ухода мыши с меню и удаляет себя ....
         window.addEventListener('mouseover', function(event) { 
         var name = event.target.nodeName; 
         if  ( name == 'menu' || name == 'menupopup' || name == 'menuitem' || name == 'menuseparator') return;
               setTimeout(function() { bookMenu.hidePopup() }, 400); // закрыть меню через 400 ms
               window.removeEventListener("mouseover", arguments.callee, false);
               this.stopListener = false; // удалить флаг
         }, false);                
}
window.addEventListener("mouseup", openRemoveBook, false);

this.onDestroy = function() {
    window.removeEventListener("mouseup", openRemoveBook,  false);
};

Stkvsky пишет

чтобы закладки открывались в активной вкладке?

И чтобы в 66+ работала...

Stkvsky пишет

bunda1
Вы бы не могли пожалуйста добавить в эту кнопку, чтобы закладки открывались в активной вкладке?

Garalf пишет

И чтобы в 66+ работала...

:/

Выделить код

Код:

/* Открывать закладки левым кликом в новой вкладке не закрывая меню закладок
   удалять закладки средним кликом на закладке, от 09.06.2019. .............*/
function openBook(e, target = e.originalTarget) { 
   if ( target.localName != "menuitem" 
        || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
   e.preventDefault();
   e.stopPropagation();   
   
   // открыть закладку в новой вкладке ....
   if ( e.button == 0 && e.type == 'mouseup' ) {         // ЛКМ 
        // открыть в новой вкладке или для указанных адресов в текущей вкладке ....
        var itemUri = target._placesNode.uri;
        var array = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
        var where = (~array.indexOf(gBrowser.currentURI.spec) || e.ctrlKey) ? "current" : "tab"; 
       
        openLinkIn(itemUri, where, {
           inBackground: false,
           relatedToCurrent: true,
           triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
        });

        setTimeout(()=> document.getElementById('placesContext').hidePopup(), 50);
        };
    
    // удалить закладку ....
    if ( e.button == 1 ) {   // СКМ
         setTimeout(()=> {
            var itemId = target._placesNode.itemId;
            try { PlacesUtils.bookmarks.removeItem(itemId) } catch(e) {};                   
         }, 0);
         };       

    // автоматически закрыть все меню закладок при уходе курсора .... 
    var menu = target.parentNode;
    if ( !menu || menu.localName != 'menupopup' ) return;
                     
    menu.onmouseover =()=> menu.f = true;
    menu.onmouseleave =()=> { 
       menu.f = false;        
       setTimeout(()=> {   
          if ( menu.f ) return;
          for ( var node = menu; node; node = node.parentNode )
                node.nodeName == 'menupopup' && node.hidePopup();
          menu.onmouseleave = null;
       }, 500);    
    };        
}
!self.hasAttribute("initialized") && ["click", "mouseup"].forEach(type=> addEventListener(type, openBook, true));

bunda1
Кнопка работает на ура, но не вызывается контекстное меню закладок, расположенных в папках на панели закладок, а в боковой панели все ОК. Можно поправить?

bezuma пишет

не вызывается контекстное меню закладок, расположенных в папках на панели закладок

Да, подтверждаю. Есть такое. Просьба починить.

bezuma пишет

bunda1
Кнопка работает на ура, но не вызывается контекстное меню закладок, расположенных в папках на панели закладок, а в боковой панели все ОК. Можно поправить?

Выделить код

Код:

/* Открывать закладки левым кликом в новой вкладке не закрывая меню закладок
   удалять закладки средним кликом на закладке, от 11.06.2019. .............*/
function openBook(e, target = e.originalTarget) { 
   if ( target.localName != "menuitem" 
        || !(target._placesNode && PlacesUtils.nodeIsURI(target._placesNode) ) ) return;
               
   // блокировать действия по умолчанию для левого клика ....
   if ( e.button == 0 ) {   // ЛКМ 
        e.preventDefault();
        e.stopPropagation(); 
        };
        
   // открыть закладку в новой вкладке или для указанных адресов в текущей вкладке ....
   if ( e.button == 0 && e.type == "mouseup" ) {   // ЛКМ 
        var itemUri = target._placesNode.uri;
        var array = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"];
        var where = (~array.indexOf(gBrowser.currentURI.spec) || e.ctrlKey) ? "current" : "tab"; 
       
        openLinkIn(itemUri, where, {
           inBackground: false,
           relatedToCurrent: true,
           triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()
        });

        setTimeout(()=> document.getElementById('placesContext').hidePopup(), 50);
        };
    
    // удалить закладку ....
    if ( e.button == 1 && e.type == "mouseup" ) {   // СКМ
         setTimeout(()=> {
            var itemId = target._placesNode.itemId;
            try { PlacesUtils.bookmarks.removeItem(itemId) } catch(e) {};                   
         }, 0);
         };       

    // автоматически закрыть все меню закладок при уходе курсора .... 
    var menu = target.parentNode;
    if ( !menu || menu.localName != 'menupopup' || e.type != 'click' || e.button == 2 ) return;
                     
    menu.onmouseover =()=> menu.f = true;
    menu.onmouseleave =()=> { 
       menu.f = false;        
       setTimeout(()=> {   
          if ( menu.f ) return;
          for ( var node = menu; node; node = node.parentNode )
                node.nodeName == 'menupopup' && node.hidePopup();
          menu.onmouseleave = null;
       }, 500);    
    };  
}
!self.hasAttribute("initialized") && ["click", "mouseup", "mousedown"].forEach(type=> addEventListener(type, openBook, true));

bunda1
Благодарю

bunda1
Спасибо, маэстро :) Теперь ОК