Страницы: 1
Подсакажите, как выполнить поиск в бок.панели? Сделал кнопку, чтоб при открытити бок.панели History, подставлялся домен активной вкладки в строку поиска. Но выполнить поиск не знаю как(жмакнуть Enter).
Кнопка такая:
toggleSidebar('viewHistorySidebar'); setTimeout( ()=> { const sb = document.getElementById("sidebar"); if(sb) { let sbDoc = sb.contentDocument, tb = sbDoc.getElementById("search-box"), dom; if(tb) { dom = getDomain(gBrowser.currentURI.spec); tb.value = dom; // значение в панель ставиццо, как выполнить? // gClipboard.write(dom); } } },500); function getDomain(url) { let dom = (url.toString().startsWith("http")) ? Services.eTLD.getBaseDomain(Services.io.newURI(url, null, null)) : false; return dom; };
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Но выполнить поиск не знаю как(жмакнуть Enter).
... tb.value = dom; // значение в панель ставиццо, как выполнить? tb._enterSearch();
Отсутствует
Благодарю!
... чтоб не подтормаживало, лучше ставить 1сек(1000 в таймере), 0,5 мало. Открылась бок.панель и через миг фильтр срабатывает. Отлично.
Отредактировано mokujin (03-03-2021 20:40:49)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Ещё созрел вопрос: склепал кнопку сортировки вкладок по-домену(чтоб сортировала без http, www и верхних доменов). Подсмотрел в одном расширении...
Но работает наполовину. Что-то собирает вкучу как и хочется, чтоб домены шли подряд, а что-то нет. Сортирует, ЕЯПП с любого места, а не с сначала\слева и поэтому может домен на "A" оказаться вконце(справа).
Подскажите что нитак:
function sortTabs3() { let allTabs = Array.from(gBrowser.visibleTabs), sorted = new Array(); tabs = allTabs.filter(tab => !tab.pinned); sorted = tabs.sort(function(a, b) { let aStr = getDomain(a.linkedBrowser.currentURI.spec), bStr = getDomain(b.linkedBrowser.currentURI.spec), ret; return ret = (aStr && bStr) ? aStr.localeCompare(bStr) : false; }) sorted.forEach(gBrowser.moveTabTo, gBrowser); function getDomain(url) { // console.log("Переданный Url: " + url); let dom = (url.toString().startsWith("http")) ? Services.eTLD.getBaseDomain(Services.io.newURI(url, null, null)) : false; // console.log("Полученный домен из Url: " + dom); return dom; } };
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
mokujin
Так получше?
function sortTabs3() { var num = gBrowser._numPinnedTabs; var tabs = gBrowser.visibleTabs.slice(num); var re = /^https?$/; var sortVal = tab => { var res, uri = tab.linkedBrowser.currentURI; if (re.test(uri.scheme)) try { res = Services.eTLD.getBaseDomain(uri); } catch(ex) { res = uri.asciiHost; } return res ? res + uri.path : "\uffff" + uri.spec; } tabs.sort((a, b) => sortVal(a).localeCompare(sortVal(b))); for(var tab of tabs) gBrowser.moveTabTo(tab, num++); }
Отсутствует
Очень и очень лучше Сотирует как дОлжно. Замечтатаельная и полезная ф-ция получилась.
Благодарю!
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Подскажите ф-цию (где живёт и как называется) в Mozilla и\или PaleMoon коде, что отвечает за остановку видео. Та, что зависима от настройки:
media.block-autoplay-until-in-foreground.
Сейчас (да и всегда с момента появления) бравзер останавливает, довольно неплохо, видео в фоновых вкладках. Но стоит переключиться на неё - и видео стартует; тот, кто придумал такое поведение - лучипоноса заслуживает, однозначно.
Хочу изменить это поведение. Поменять, чтоб при этой настройке видео стопорилось везде и всегда; и в фоне(что уже есть) и в активной вкладке, и не стартовало при переходе на вкладку с остановленным видео. Чтоб вообще ничто нигде не шевелилось, пока я не жмакну кнопку play!
Облазил сорцы но т.к. слабо знаю это всё дело, то ничего я не нашёл. Если кому известно, что это за ф-ция, где живёт - дайте знать. Ну, а если вдруг, кто уже делал_патч\знает_где_такой_патч_лежит, былоб вообще шикарно
(все эти расширения, скрипты - это не то. лишние ресурсы, да и пропускают все равно. особо на ютубе или пронхабе и др. тяжелых сайтах. видос часто запускается несмотря на плугин\скрипт)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Кнопка для Ютуб и плееров Pot \ Cherry . В зависимости что в буфере и что открыто, либо будет запрос, либо просто запуск плеера.
Сильно подозреваю, что алго\код можно улучшить, но ничего лучше не могу придумать... в оди момен даж запутался. Но получилось в итоге как хотелось.
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EPot%20%5C%20Cherry%20players%20run%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAE+ElEQVRIid2VXW9UVRiF+ROGX9E5MyDGdubMtJUWjIlELyRGhM5QaWlroICJigkmthi1UUQDpH4kBjEBoVgKCGIMBAl12juV6RRo7Nnvxz6H2srXFGL2Xl7gXecP6Hu136tnr6y18i5b9r+ZWTO7T1gnmHmClSeEeFJVy6w6ocoTQjLJxJPCPEnMkyI8YdWWVWyZmSdUpaxWytbachTRW0sAkYmIVcDGgJghKiBisKpjESizU1WoiGMWxyqOhSGizpCBsIBZHBkCK08sARgmw6JgVbf+hfU4c2YMwuwjY1xzcyumqlWvKiBhL6JOlZ2wgMiAiLyogFUcEXkrtrwEwMyRKkOYcfnKFTQ2NYGZMTAwiMG9e8HM+GN2Fhd++BEzMzehKqj8/juYFZGJUJmqQoTBKmDWpQqIjFFlsCEoq9vS1Y2P9n3kwzDvIjK4eeOGb2rKYWd/v2tsanSVahVtbe0gEj9eLvvNxSKICIYIQjJZB8ARs0JYHTGjWqlg+WPL3ejJUS+sOHRoGO/ufRfE5D8c+hCf7t/v2le3QYT8+NVxFEtFCJEXYScsSxWwcKSqYBYIK5QVTdksyEQQFXzw/hCGPxsGs+Crw4cxOPAO2tvbocq4+ss4SqUSRBSPjK8DiAwRs8IQQUUdqyDb2OhMFHlVxumzp/2GDRshKq5U6nTHR074NWva8Nu139yBAwd9sVgEGQYLe9H6HhArP4opGagq+vu3e0PkH/1M3J49b2PtmrV+9+7dMIYxcvwEWlpb/Juvv46hD4agKk6Vndo6KTLGkDCD2ECq05BqBTw95aVyDTJdAVUr4Okq5Pq0o0oFUpmCVKfAU1Uv0xUvN2fAbMDEXrhOD5jI6MWfEL+4DrfWtWLu2aeQrGuFbXsSSZiGDQMkhQzillVIVj+OOB8gCdOI8xnYQgZJIQ3d0Q2+OQOVOgCKiOLn2rHQV/K1s6P+b57Fg7On3Ny2VxCHadhc4JNCBrd3bnV/vrENNmzwSSGDJEw5G6a8DQNomPIyNOBF6sSUKxWT5NOwYQZJIcD9c6eRFNKw+RVY6NuEOB9gvncz5nduxb0vD+HuJ0OI25+AfWoV7nz8Hm6/tR1xmIHt3QQWqgO4do2SMIDNNjjJNqD2/Rg01+Bvtax0949/A5tLoXbyKP7a2eNqYyexsL3T3/niIO4O73cLu7bizucHMd+1wSXdm5zWa7Kp/EpJmEaSbXBxNuVr58YQ5wJ/qyXjat9+A5sN/L2Ro1jY1eX/2tHjbS6F2ugIHv580d0/dcIvXryAO/vfc9r9sq+voDoVxWEGST6DuBBg8fwY4jBA3JxB7btjSPIBFs+NYeG1Hizs2YW4eSUWR49j8cwIktZVmHt+NeZeWoe4eyNE68SUpqeNLaRhcykkuZS7f+4UNNvg41zgFi9fwr2Ro6hduoD5HV3+YXncPTx/2s33d2K+f6t/cOF7/+DKJdxa/4yz2zsd12sykSG7bQskm4LNpWDzK2BzgY9zDc62rsDc2iedbc4gzqV9XFjp7dNNsPkAcS7wydomH69ehSQMnBz92tf1QEgMz1yHDg1CX90M7S0h7u2A9nUg7uuA9pSgfR3Q3kdv21eE9pVge4vQng7E/V2QY0fALNB698AYOULChkQiExExGWLiSJiifxejLBERG0OGmDlilogiQyYiEhJDZIgNmVlD+5YA/rPzD38G0jODeDzrAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A//%20%20%20const%20btnFunc%20%3D%20document.getElementById%28%22custombuttons-button37%22%29%2C%0A%20%20%20const%20profDir%20%3D%20Services.dirsvc.get%28%27ProfD%27%2C%20Ci.nsIFile%29%3B%0A%20%20%20%20%20%20%20%20%20let%20clipbrd%20%3D%20readFromClipboard%28%29%2C%20re%20%3D%20new%20RegExp%28/.*youtube.com%5C/watch.+/i%29%2C%20curl%20%3D%20gBrowser.currentURI.spec%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mod%20%3D%20%28%20e.ctrlKey%20%7C%7C%20e.altKey%20%7C%7C%20e.shiftKey%20%29%20%3F%20true%20%3A%20false%2C%20progPath%2C%20arg%3B%0A%0A%20%20this.oncontextmenu%20%3D%28%29%3D%3E%20%7Breturn%20false%7D%3B%0A%0A%20%20switch%28e.button%29%20%7B%0A%20%20%20%20%20case%200%3A%20progPath%20%3D%20%28navigator.platform%20%3D%3D%20%22Win64%22%29%20%3F%20%28progPath%20%3D%20profDir.path%20+%20%22%5C%5CSOFT_PM%5C%5CPotplayer%5C%5Cpotx64%5C%5CPotPlayer.exe%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%28progPath%20%3D%20profDir.path%20+%20%22%5C%5CSOFT_PM%5C%5CPotplayer%5C%5Cpotx86%5C%5CPotPlayer.exe%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20runPlayer%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20case%201%3A%20custombuttons.editButton%28this%29%3B%20break%3B%0A%20%20%20%20%20case%202%3A%20if%28mod%29%20%7Bthis.oncontextmenu%20%3D%28%29%3D%3E%20%7Breturn%20true%7D%3B%20break%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20progPath%20%3D%20profDir.path%20+%20%22%5C%5CSOFT_PM%5C%5CCherryPlayer%5C%5CCherryPlayer.exe%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20runPlayer%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%0A%20function%20runPlayer%28%29%20%7B%0A%20%20if%28%20re.test%28clipbrd%29%20%29%20%7B%20%20%20//%20%u0437%u0430%u043F%u0440%u043E%u0441%20%u0432%u044B%u0432%u043E%u0434%u0438%u043C%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0435%u0441%u043B%u0438%20%u0432%20%u0431%u0443%u0444%u0435%u0440%u0435%20%u0443%u0440%u043B%20%u0441%20%u044E%u0442%u0443%u0431%2C%20%u0438%u043D%u0430%u0447%u0435%20%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u0441%20%u0443%u0440%u043B%20%u043E%u0442%u043A%u0440.%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%20%u044E%u0442%u0443%u0431.%20%u0418%u043D%u0430%u0447%u0435%20-%20%u043F%u0440%u043E%u0441%u0442%u043E%20%u0437%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20%u043F%u043B%u0435%u0435%u0440%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u043E%u0432.%0A%20%20%20%20%20let%20choice%20%3D%20custombuttons.confirmBox3%28%20%22PotPlayer%20%5C%5C%20CherryPlayer%22%2C%20%22%u0417%u0430%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%u0441...%20%22%2C%20%22%u0421%u0441%u044B%u043B%u043A%u0430%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%22%2C%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%2C%20%22%u0421%20%u043E%u0442%u043A%u0440.%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%22%20%29%2C%0A%20%20%20%20%20%20%20%20%20result%20%3D%20%7B%200%3A%20clipbrd%2C%201%3A%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%2C%202%3A%20curl%20%7D%3B%0A%20%20%20%20if%28result%5Bchoice%5D%20%3D%3D%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%29%20%7B%20return%20%7D%20%20%20else%20%20%20%7B%20arg%20%3D%20re.test%28result%5Bchoice%5D%29%20%3F%20%5Bresult%5Bchoice%5D%5D%20%3A%20%5B%5D%20%7D%0A%20%20%20%7D%0A%20%20%20%20%20else%20%7B%20arg%20%3D%20re.test%28curl%29%20%3F%20%5Bcurl%5D%20%3A%20%5B%5D%20%7D%0A%0A%20%20%20//btnFunc.startProcess%28progPath%2C%20arg%29%3B%20%0A%20%20%20startProcess%28progPath%2C%20arg%29%3B%20%0A%20%20%7D%3B%0A%20%0A%7D%3B%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20function%20startProcess%28path%2C%20args%29%20%7B%0A%20let%20file%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Components.interfaces.nsILocalFile%29%2C%20process%3B%0A%20%20file.initWithPath%28path%29%3B%0A%20%20%20if%28file.exists%28%29%29%20%7B%0A%20%20%20%20%20%20%20process%20%3D%20Components.classes%5B%22@mozilla.org/process/util%3B1%22%5D.createInstance%28Components.interfaces.nsIProcess%29%3B%0A%20%20%20%20%20%20%20process.init%28file%29%3B%0A%20%20%20%20%20%20%20process.runw%28false%2C%20args%2C%20args.length%29%3B%0A%20%20%20%20%7D%20else%20%7B%20custombuttons.%20alertBox%20%28%22%u0424%u0430%u0439%u043B%20%u043D%u0435%20%u043D%u0430%u0439%u0434%u0435%u043D%22%2C%20%22%u041D%u0435%u0442%u0443%20%u0442%u0430%u043A%u043E%u0433%u043E%20%u0444%u0430%u0439%u043B%u0430%28%u043F%u0440%u043E%u0432%u0435%u0440%u044C%20%u043F%u0443%u0442%u044C%29%3A%5Cn%22%20+%20path%29%3B%20%7D%3B%0A%20%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
this.onclick = function(e) { // const btnFunc = document.getElementById("custombuttons-button37"), const profDir = Services.dirsvc.get('ProfD', Ci.nsIFile); let clipbrd = readFromClipboard(), re = new RegExp(/.*youtube.com\/watch.+/i), curl = gBrowser.currentURI.spec, mod = ( e.ctrlKey || e.altKey || e.shiftKey ) ? true : false, progPath, arg; this.oncontextmenu =()=> {return false}; switch(e.button) { case 0: progPath = (navigator.platform == "Win64") ? (progPath = profDir.path + "\\SOFT_PM\\Potplayer\\potx64\\PotPlayer.exe") : (progPath = profDir.path + "\\SOFT_PM\\Potplayer\\potx86\\PotPlayer.exe"); runPlayer(); break; case 1: custombuttons.editButton(this); break; case 2: if(mod) {this.oncontextmenu =()=> {return true}; break}; progPath = profDir.path + "\\SOFT_PM\\CherryPlayer\\CherryPlayer.exe"; runPlayer(); break; }; function runPlayer() { if( re.test(clipbrd) ) { // запрос выводим только если в буфере урл с ютуб, иначе пускаем без запроса с урл откр.страницы, если это страница ютуб. Иначе - просто запускаем плеер без запросов. let choice = custombuttons.confirmBox3( "PotPlayer \\ CherryPlayer", "Запустить с... ", "Ссылка из буфера", "Отмена", "С откр.страницы" ), result = { 0: clipbrd, 1: "Отмена", 2: curl }; if(result[choice] == "Отмена") { return } else { arg = re.test(result[choice]) ? [result[choice]] : [] } } else { arg = re.test(curl) ? [curl] : [] } //btnFunc.startProcess(progPath, arg); startProcess(progPath, arg); }; }; function startProcess(path, args) { let file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile), process; file.initWithPath(path); if(file.exists()) { process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); process.init(file); process.runw(false, args, args.length); } else { custombuttons. alertBox ("Файл не найден", "Нету такого файла(проверь путь):\n" + path); }; };
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Скрутил две кнопки в одну. Обе кнопки сделаны bunda1 , просто соединил в одну, как сумел.
// ======== Копировать выделенный текст СКМ (колесом) ============================== // простой способ // addEventListener("mouseup", (e)=>{ e.button==1 && goDoCommand("cmd_copy") }, false, gBrowser ); // =========== С отменой прокрутки autoscroller-a ================================= // плюс, так же, вставка СКМ с заменой выделенного текста в поля ввода. // Нужно отключить в самом PaleMoon настройку middlemouse.paste = false иначе будет дублироваться вставка // и да, это должна быть стандартная ф-ция _любого_ бравзера уже давным-давно(10лет минимум). // А тот факт, что вставка, где она есть(например Cent или та же Мозилла), по СКМ всё ещё вставляет без замены, тупо туда-куда жмакнул, оставляя выделенный текст - это кретинизм т.н. "разработчиков" и никак иначе! (function() { addEventListener("mousedown", (e) => { if ( e.button !== 1 ) return; let sel = getBrowserSelection() ? true : false, elem = document.commandDispatcher.focusedElement ? document.commandDispatcher.focusedElement : false, re = new RegExp(/input|password|text|textarea|textbox|searchbar|findbar/gi); //console.log("elem = " + elem + "\nBoxType = " + elem.type ); switch(true) { case re.test(elem): middleMousePaste(e); break; case sel: e.preventDefault(); e.stopPropagation(); goDoCommand("cmd_copy"); setTimeout(()=> document.activeElement.blur(), 200); setTimeout(()=> window.content.focus(), 1000); break; default: return; } function middleMousePaste(e) { e.preventDefault(); e.stopPropagation(); // вставить текст .... let cmd = "cmd_insertText", commandDispatcher = ( this.document || document ).commandDispatcher, controller = commandDispatcher.getControllerForCommand(cmd); if ( controller && controller.isCommandEnabled(cmd) ) { const params = Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams); controller = controller.QueryInterface(Components.interfaces.nsICommandController); params.setStringValue( "state_data", gClipboard.read() ); controller.doCommandWithParams(cmd, params); } }; }, true, gBrowser ); })();
Отредактировано mokujin (07-04-2023 22:50:08)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Кнопка закрытия вкладок справа-слева-всех, с задержкой; типа, по-очереди. Автор Dumby.
Переделал чуть для себя, добавил фильтр некоторых аттрибутов вкладок и задержку закрытия.
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEI0lEQVQ4jXVUz4tTVxT+zv2R9yY/mhHHYC1owHEh1srAQFbiwln5BwgKBWdTunAlAemiv6C0CDKbLrqSGToLsWL3LoQBNx2QFpFhmNEhqRImExIzj5fkvbx37z1dmKSp1A/O5nzn3nPu+c49YGY457LMjDAMV7rd7hYzq5FJZsaU0civmVm9fft2q9frrUzfIQBkiWgwHA6rw+HwGhHtAjDMbJjZWmvJOSfwDgzAAEgBGCHETr/fvxZFUZWIBgCyxMxIkuSrwWBw2xhTJKK/hRB/OOcEM6t8Pv+D53l/EREPh8NPe73e10QEImLnXMUYU9ZaB7lc7o7neT+pJEl+TpLkCwAZIURijDmVJMkpay2cc8hms78S0Z8AYIz5pNfrXSUiSCmhlIJSKmHm4nA4/I6ZTyjn3CVm1qMnyVH2iQGwIw5EZIUQ7/NyRGtr7SXl+/5nzLxujLnKzJKIQqXUgRCCnHMgog7+RayU2iMiEkI4Iioxcw5AopT6LZvNfo6RYuj3+/eazaYLguDRtLJpmsqxMEmSyDRNkaYpGWPQ7XZ/39/fd2EY3hvFa5WmKVlrc1rrqtb6oyiKFnO5HKSUsNaCmclaq6ZUhlKK0zRFFEWLnuc9ymQy1TiOs1JKg/+Zs4+ZGXEcZ9/jJjbFnRidmXB08+bNX4jI+b6vc7lcu9lspmfOnBncunXrTrVa/X5vb69ULBYNAARBoE6fPt26e/futysrK7dfvnyZPX78uO73+3NxHKfMLNTjx4+/tNbi9evXMMYAABYXF92xY8eCMAy/AQDn3ESVMAyxvr6+f//+/R+fPXsmRi3AyZMnIaUELS8vR6VSCVtbW3jx4gVVKhUuFAqZtbU1Yd5lMABoqodKKaVu3LjhwjBMNjc36fz583zu3Dm0Wi1QoVDgy5cvo1wuI45jZDIZvHr1ire3t83Tp09VqVSiceVKKbRaLb548aI5e/asmp+fpyRJ4Ps+6vU6njx5AuF5HqSUSNMUUko0Gg1sbGyQMUYzM2mtYa2FtRZaazAzGWP0xsYGNRqN/5z1PA9qaWkJxWIRRASlFKIowmAwwNGjRxEEAWZnZ9Htdic9DIIAADAYDBBFEbTWMMZgbm4OS0tLUPPz89jc3ES9XseFCxewsLAAANje3kan00E+n8fh4SHG4nQ6HSilcOXKFSwsLGBnZwfPnz9HuVxGpVKBevDgAWq1GowxaDabqNVqaLfbaDQaaLfbyOfzkwqttWi323jz5g2cczg4OMDu7i7CMEStVkO9Xgddv36dZ2ZmoLVGHMeI4xjWWszOzmJ5eRlHjhxBFEUAgJmZGXS7XayuruLw8BBSSvi+D9/3Mfo5oIcPH7JzDsyM8SYZVxOGIUYL4t3MjGIKhQKklBPfOEYIASoWi4wPYDrBGOMLPoR/ALStuTNCCz0XAAAAAElFTkSuQmCC
this.setAttribute("context", ""); this.onclick =(e)=> { let mod = ( e.ctrlKey || e.altKey ) ? true : false, pinned = gBrowser.selectedTab.pinned ? true : false; switch(e.button) { case 0: pinned ? '' : tabsindex(0); break; case 1: mod ? custombuttons.editButton(this) : tabsindex(1); break; case 2: mod ? gShowPopup(this) : tabsindex(2); break; } function tabsindex(btn) { let visTabs = gBrowser.visibleTabs.filter(tab => !tab.pinned), index = visTabs.indexOf(gBrowser.selectedTab), q=0; switch (btn) { case 0: visTabs = visTabs.slice(0, index); break; case 1: pinned ? '' : visTabs.splice(index, 1); break; case 2: visTabs = visTabs.slice(index + 1); break; default: return; } visTabs.forEach( tab => { q++; closeTabTimer(tab, 100*(q+1)) } ); } function closeTabTimer(tab, timer) { setTimeout( ()=> gBrowser.removeTab(tab, {animate: false, byMouse: false}), timer) }; }; this.tooltipText = " ЛКМ - Закрыть вкладки СЛЕВА от активной\n\ СКМ - Закрыть ВСЕ кроме активной\n\ ПКМ - Закрыть вкладки СПРАВА от активной\n\ ---------------------------------------------\n\ CTRL или ALT + ПКМ \| СКМ - вызов меню \| edit_Button\n\ id: " + this.id;
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESpeedCloseTabs%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEI0lEQVQ4jXVUz4tTVxT+zv2R9yY/mhHHYC1owHEh1srAQFbiwln5BwgKBWdTunAlAemiv6C0CDKbLrqSGToLsWL3LoQBNx2QFpFhmNEhqRImExIzj5fkvbx37z1dmKSp1A/O5nzn3nPu+c49YGY457LMjDAMV7rd7hYzq5FJZsaU0civmVm9fft2q9frrUzfIQBkiWgwHA6rw+HwGhHtAjDMbJjZWmvJOSfwDgzAAEgBGCHETr/fvxZFUZWIBgCyxMxIkuSrwWBw2xhTJKK/hRB/OOcEM6t8Pv+D53l/EREPh8NPe73e10QEImLnXMUYU9ZaB7lc7o7neT+pJEl+TpLkCwAZIURijDmVJMkpay2cc8hms78S0Z8AYIz5pNfrXSUiSCmhlIJSKmHm4nA4/I6ZTyjn3CVm1qMnyVH2iQGwIw5EZIUQ7/NyRGtr7SXl+/5nzLxujLnKzJKIQqXUgRCCnHMgog7+RayU2iMiEkI4Iioxcw5AopT6LZvNfo6RYuj3+/eazaYLguDRtLJpmsqxMEmSyDRNkaYpGWPQ7XZ/39/fd2EY3hvFa5WmKVlrc1rrqtb6oyiKFnO5HKSUsNaCmclaq6ZUhlKK0zRFFEWLnuc9ymQy1TiOs1JKg/+Zs4+ZGXEcZ9/jJjbFnRidmXB08+bNX4jI+b6vc7lcu9lspmfOnBncunXrTrVa/X5vb69ULBYNAARBoE6fPt26e/futysrK7dfvnyZPX78uO73+3NxHKfMLNTjx4+/tNbi9evXMMYAABYXF92xY8eCMAy/AQDn3ESVMAyxvr6+f//+/R+fPXsmRi3AyZMnIaUELS8vR6VSCVtbW3jx4gVVKhUuFAqZtbU1Yd5lMABoqodKKaVu3LjhwjBMNjc36fz583zu3Dm0Wi1QoVDgy5cvo1wuI45jZDIZvHr1ire3t83Tp09VqVSiceVKKbRaLb548aI5e/asmp+fpyRJ4Ps+6vU6njx5AuF5HqSUSNMUUko0Gg1sbGyQMUYzM2mtYa2FtRZaazAzGWP0xsYGNRqN/5z1PA9qaWkJxWIRRASlFKIowmAwwNGjRxEEAWZnZ9Htdic9DIIAADAYDBBFEbTWMMZgbm4OS0tLUPPz89jc3ES9XseFCxewsLAAANje3kan00E+n8fh4SHG4nQ6HSilcOXKFSwsLGBnZwfPnz9HuVxGpVKBevDgAWq1GowxaDabqNVqaLfbaDQaaLfbyOfzkwqttWi323jz5g2cczg4OMDu7i7CMEStVkO9Xgddv36dZ2ZmoLVGHMeI4xjWWszOzmJ5eRlHjhxBFEUAgJmZGXS7XayuruLw8BBSSvi+D9/3Mfo5oIcPH7JzDsyM8SYZVxOGIUYL4t3MjGIKhQKklBPfOEYIASoWi4wPYDrBGOMLPoR/ALStuTNCCz0XAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%20this.setAttribute%28%22context%22%2C%20%22%22%29%3B%0A%0A%20this.onclick%20%3D%28e%29%3D%3E%20%7B%0A%20%20%20%20let%20mod%20%3D%20%28%20e.ctrlKey%20%7C%7C%20e.altKey%20%29%20%3F%20true%20%3A%20false%2C%20pinned%20%3D%20gBrowser.selectedTab.pinned%20%3F%20true%20%3A%20false%3B%20//force%20%3D%20e.shiftKey%3B%0A%20%20%20switch%28e.button%29%20%7B%0A%20%20%20%20%20case%200%3A%20pinned%20%3F%20%27%27%20%3A%20tabsindex%280%29%3B%20break%3B%0A%20%20%20%20%20case%201%3A%20mod%20%3F%20custombuttons.editButton%28this%29%20%3A%20tabsindex%281%29%3B%20break%3B%20//gBrowser.removeAllTabsBut%28gBrowser.selectedTab%29%3B%20-%20%u043D%u0435%20%u0441%u0440%u0430%u0431%u0430%u0442%u044B%u0432%u0430%u0435%u0442%20%u0435%u0441%u043B%u0438%20%u043D%u0430%20%u0437%u0430%u043A%u0440%u0435%u043F%u043B%u0435%u043D%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%u043D%u0430%u0445%u043E%u0434%u0438%u0448%u044C%u0441%u044F%0A%20%20%20%20%20case%202%3A%20mod%20%3F%20gShowPopup%28this%29%20%3A%20tabsindex%282%29%3B%20break%3B%0A%20%20%20%20%20%7D%0A%0A%20%0A%20function%20tabsindex%28btn%29%20%7B%0A%20%20%20let%20visTabs%20%3D%20gBrowser.visibleTabs.filter%28tab%20%3D%3E%20%21tab.pinned%29%2C%20index%20%3D%20visTabs.indexOf%28gBrowser.selectedTab%29%2C%20q%3D0%3B%0A%0A%20%20%20%20switch%20%28btn%29%20%7B%0A%20%20%20%20%20%20%20case%200%3A%20visTabs%20%3D%20visTabs.slice%280%2C%20index%29%3B%20break%3B%0A%20%20%20%20%20%20%20case%201%3A%20pinned%20%3F%20%27%27%20%3A%20visTabs.splice%28index%2C%201%29%3B%20break%3B%0A%20%20%20%20%20%20%20case%202%3A%20visTabs%20%3D%20visTabs.slice%28index%20+%201%29%3B%20break%3B%0A%20%20%20%20%20%20%20default%3A%20return%3B%0A%20%20%20%20%20%20%20%7D%0A%20%20%20%20visTabs.forEach%28%20tab%20%3D%3E%20%7B%20q++%3B%20closeTabTimer%28tab%2C%20100*%28q+1%29%29%20%7D%20%29%3B%0A%20%20%20%20%7D%0A%0A%20%20function%20closeTabTimer%28tab%2C%20timer%29%20%7B%20setTimeout%28%20%28%29%3D%3E%20gBrowser.removeTab%28tab%2C%20%7Banimate%3A%20false%2C%20byMouse%3A%20false%7D%29%2C%20timer%29%20%7D%3B%0A%0A%20%7D%3B%0A%0A%0A%0Athis.tooltipText%20%3D%20%22%20%20%u041B%u041A%u041C%20-%20%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u041B%u0415%u0412%u0410%20%u043E%u0442%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%5Cn%5C%0A%20%20%u0421%u041A%u041C%20-%20%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0412%u0421%u0415%20%u043A%u0440%u043E%u043C%u0435%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%5Cn%5C%0A%20%20%u041F%u041A%u041C%20-%20%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u041F%u0420%u0410%u0412%u0410%20%u043E%u0442%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%5Cn%5C%0A%20%20---------------------------------------------%5Cn%5C%0A%20%20CTRL%20%u0438%u043B%u0438%20ALT%20+%20%u041F%u041A%u041C%20%5C%7C%20%u0421%u041A%u041C%20-%20%u0432%u044B%u0437%u043E%u0432%20%u043C%u0435%u043D%u044E%20%5C%7C%20edit_Button%5Cn%5C%0A%20%20id%3A%20%22%20+%20this.id%3B%0A%20%20%0A%20%20%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%20%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отредактировано mokujin (20-04-2023 22:01:23)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Сортировать вкладки по домену(без www и верхних), а домен - по имени. Автор Dumby
+ остановка загрузки(ПКМ).
Button Url
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESort%20%5C%5C%20Stop%20Tabs%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACkUlEQVQ4y62VQWsUWRSFv/OqOt10SAbtlYqaoElsUBe6iiDGoURxER1hgsL8gXEhKrpTjDoQCcgMWWQx21mIkUG3atCAgguXKqRjgulggwkMRIOBJFV1XaQrVmt6ZiLeVfEe73v3nXvPLfFFBEFXBlBqyYaHR5b4n7Fy8OnTJ25dYeNbZBuApYmxl5sGBv6YrQfrGTIDkDh4+2eNJOsu+WjIN++vwgAyW1rbjqwlsxpgEHRlstlcdzrxXK6xm28Il2jmnDsGEEd2y/M8gKOVSiW/FlgQdGUcoGt9/budtA0Il/z4PGhGUv7DfBisBQbIATTmfjgGwjlvMe9yfyHzlh9uP/0XyOKopjMcgOe5457n4ZzLSwRChWoLdD9+bH5dmBm2MOenu8X19va3+pnMTsCcxfuI2GZeXAT7iLR+w+bygXow4hAsXlnr7e1v9QuFplk5HSLUYlvHlmfJZmli6kew5kjx+KrpxeFXdxQKTbN+sVicLk2Ud+FbQ2minCqCAdDk+zN1CsCXbioWi9N+9ezDejp9jKJWYLKuNeVIG8Cv5vJnSpws8Iskz2DBD8P5f/E5yjaFq3q5KrQrjZdvSeoxsxh0akfb1qEE1nD4SnN+U+ddoUakPTgfpDHBHDG/Dp3Uc5cGlsanfpfUUzX9uQSW+Hvx/tU5ouhRApOEoB14P3RSz2uGw+jr8nWJM9VcL3dsbxlY7an26v5NnP9GWnlcZHC2ZjiMjk2dlrhUhQ12bG/5rY5u9veNE3MyXfwsE4N3evSiRsPR15ORtGxDjEkTsZkRRSHTlXdBX9+lCuAPD4/Mp+bhA2Dvok/7vRP6p6bKK7DlK1owI44iBChLYr2a2ejEhdjoTMO+qvL3+A18AkID97c+x04gAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%0A%20this.setAttribute%28%22context%22%2C%20%22%22%29%3B%0A%0A%20this.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20//this.oncontextmenu%20%3D%28%29%3D%3E%20%7Breturn%20false%7D%3B%0A%20%20%20%20%20let%20mod%20%3D%20%28%20e.ctrlKey%20%7C%7C%20e.altKey%20%7C%7C%20e.shiftKey%20%29%20%3F%20true%20%3A%20false%3B%0A%0A%20%20switch%28e.button%29%20%7B%0A%20%20%20%20%20case%200%3A%20sortTabs4%28%29%3B%20break%3B%0A%20%20%20%20%20case%201%3A%20custombuttons.editButton%28this%29%3B%20break%3B%0A%20%20%20%20%20case%202%3A%20mod%20%3F%20gShowPopup%28this%29%20%3A%20allStop3%28%29%3B%20break%3B%0A%20%20%20%20%7D%3B%0A%0A%7D%3B%0A%0A%0A%0A//%20---%20%u0421%u043E%u0440%u0442%u0438%u0440%u0443%u0435%u0442%20%u043F%u043E%20%u0434%u043E%u043C%u0435%u043D%u0443%2C%20%u0431%u0435%u0437%20%u0443%u0447%u0435%u0442%u0430%20www%20%u0438%20%u0432%u0435%u0440%u0445%u043D%u0438%u0445%20%u043F%u0440%u0438%u0441%u0442%u0430%u0432%u043E%u043A%2C%20%u0430%20%u0434%u043E%u043C%u0435%u043D%20%u043F%u043E%20%u0438%u043C%u0435%u043D%u0438%20%20---%0Afunction%20sortTabs4%28%29%20%7B%0A%20%20%20%20%20%20%20%20let%20tabs%20%3D%20Array.from%28gBrowser.visibleTabs%29.filter%28tab%20%3D%3E%20%21tab.pinned%29%2C%20num%20%3D%20gBrowser._numPinnedTabs%2C%20sorted%20%3D%20%5B%5D%3B%0A%0A%20%20sorted%20%3D%20tabs.sort%28%20%28a%2C%20b%29%3D%3E%20%7B%0A%20%20%20%20%20let%20aUrl%20%3D%20getDomain%28a.linkedBrowser.currentURI.spec%29%2C%20bUrl%20%3D%20getDomain%28b.linkedBrowser.currentURI.spec%29%2C%0A%20%20%20%20%20%20%20%20%20%20aLab%20%3D%20cleanText%28a.label%29%2C%20bLab%20%3D%20cleanText%28b.label%29%2C%20ret%20%3D%20false%3B%0A%20%20%20%20%20%20if%28aUrl%20%26%26%20bUrl%29%20%7B%20ret%20%3D%20aUrl.localeCompare%28bUrl%29%20%3F%20aUrl.localeCompare%28bUrl%29%20%3A%20aLab.localeCompare%28bLab%29%3B%20%7D%0A%20%20%20%20%20%20return%20ret%3B%0A%20%20%20%20%20%7D%29%3B%0A%20%20sorted.forEach%28%20tab%20%3D%3E%20gBrowser.moveTabTo%28tab%2C%20num++%29%20%29%3B%0A%0A%20function%20getDomain%28url%2C%20dom%29%20%7B%0A%20%20%20%20%20%20return%20dom%20%3D%20%28url.toString%28%29.startsWith%28%22http%22%29%29%20%3F%20Services.eTLD.getBaseDomain%28Services.io.newURI%28url%2C%20null%2C%20null%29%29%20%3A%20%221%22%3B%0A%20%20%20%20%20%20%7D%0A%0A//%20--------------%20%u041E%u0447%u0438%u0441%u0442%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u043E%u0442%20%u0441%u043F%u0435%u0446%u0441%u0438%u043C%u0432%u043E%u043B%u043E%u0432%20--------------------------%0A%20function%20cleanText%28text%29%20%7B%0A%20%20%20let%20title%2C%20badSymbols%20%3D%20new%20RegExp%28/%5B%5C%21%5C@%5C%23%5C%24%5C%25%5C%5E%5C+%5C%3D%5C%3A%5C%3B%5C.%5C%2C%5C%60%5C%22%5C%27%5C%3F%5C%29%5C%28%5C%5D%5C%5B%5C%7C%5C*%5C%5C%5C/%5C/%5C%3C%5C%3E%5C%BB%5D+/ig%29%3B%0A%20%20%20%20%20%20%20title%20%3D%20text.replace%28badSymbols%2C%20%27%27%29.replace%28/%5C%26/%2C%20%27and%27%29.replace%28/%5Cs+/g%2C%20%27%20%27%29%3B%0A%20%20%20%20%20%20%20//console.log%28%22LinkText%20clean%20func%20%3D%20%22%20+%20title%29%3B%0A%20%20%20%20%20%20return%20title.trimStart%28%29.substring%280%2C60%29%3B%0A%20%20%20%7D%3B%0A%0A%0A%7D%3B%0A%0A%0A%0Afunction%20%20allStop3%28%29%20%7B%0A%20%20%20let%20visTabs%20%3D%20gBrowser.visibleTabs.filter%28tab%20%3D%3E%20%21tab.pinned%29%3B%0A%0A%20%20%20%20%20%20%20visTabs.forEach%28%20%28tab%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20let%20browser%20%3D%20gBrowser.getBrowserForTab%28tab%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20browser.stop%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20browser.webNavigation.stop%282%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%20%7D%3B%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Init
this.setAttribute("context", ""); this.onclick = function(e) { //this.oncontextmenu =()=> {return false}; let mod = ( e.ctrlKey || e.altKey || e.shiftKey ) ? true : false; switch(e.button) { case 0: sortTabs4(); break; case 1: custombuttons.editButton(this); break; case 2: mod ? gShowPopup(this) : allStop3(); break; }; }; // --- Сортирует по домену, без учета www и верхних приставок, а домен по имени --- function sortTabs4() { let tabs = Array.from(gBrowser.visibleTabs).filter(tab => !tab.pinned), num = gBrowser._numPinnedTabs, sorted = []; sorted = tabs.sort( (a, b)=> { let aUrl = getDomain(a.linkedBrowser.currentURI.spec), bUrl = getDomain(b.linkedBrowser.currentURI.spec), aLab = cleanText(a.label), bLab = cleanText(b.label), ret = false; if(aUrl && bUrl) { ret = aUrl.localeCompare(bUrl) ? aUrl.localeCompare(bUrl) : aLab.localeCompare(bLab); } return ret; }); sorted.forEach( tab => gBrowser.moveTabTo(tab, num++) ); function getDomain(url, dom) { return dom = (url.toString().startsWith("http")) ? Services.eTLD.getBaseDomain(Services.io.newURI(url, null, null)) : "1"; } // --- Очистить текст от спецсимволов --- function cleanText(text) { let title, badSymbols = new RegExp(/[\!\@\#\$\%\^\+\=\:\;\.\,\`\"\'\?\)\(\]\[\|\*\\\/\/\<\>\»]+/ig); title = text.replace(badSymbols, '').replace(/\&/, 'and').replace(/\s+/g, ' '); //console.log("LinkText clean func = " + title); return title.trimStart().substring(0,60); }; }; function allStop3() { let visTabs = gBrowser.visibleTabs.filter(tab => !tab.pinned); visTabs.forEach( (tab)=> { let browser = gBrowser.getBrowserForTab(tab); browser.stop(); browser.webNavigation.stop(2); }); };
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACkUlEQVQ4y62VQWsUWRSFv/OqOt10SAbtlYqaoElsUBe6iiDGoURxER1hgsL8gXEhKrpTjDoQCcgMWWQx21mIkUG3atCAgguXKqRjgulggwkMRIOBJFV1XaQrVmt6ZiLeVfEe73v3nXvPLfFFBEFXBlBqyYaHR5b4n7Fy8OnTJ25dYeNbZBuApYmxl5sGBv6YrQfrGTIDkDh4+2eNJOsu+WjIN++vwgAyW1rbjqwlsxpgEHRlstlcdzrxXK6xm28Il2jmnDsGEEd2y/M8gKOVSiW/FlgQdGUcoGt9/budtA0Il/z4PGhGUv7DfBisBQbIATTmfjgGwjlvMe9yfyHzlh9uP/0XyOKopjMcgOe5457n4ZzLSwRChWoLdD9+bH5dmBm2MOenu8X19va3+pnMTsCcxfuI2GZeXAT7iLR+w+bygXow4hAsXlnr7e1v9QuFplk5HSLUYlvHlmfJZmli6kew5kjx+KrpxeFXdxQKTbN+sVicLk2Ud+FbQ2minCqCAdDk+zN1CsCXbioWi9N+9ezDejp9jKJWYLKuNeVIG8Cv5vJnSpws8Iskz2DBD8P5f/E5yjaFq3q5KrQrjZdvSeoxsxh0akfb1qEE1nD4SnN+U+ddoUakPTgfpDHBHDG/Dp3Uc5cGlsanfpfUUzX9uQSW+Hvx/tU5ouhRApOEoB14P3RSz2uGw+jr8nWJM9VcL3dsbxlY7an26v5NnP9GWnlcZHC2ZjiMjk2dlrhUhQ12bG/5rY5u9veNE3MyXfwsE4N3evSiRsPR15ORtGxDjEkTsZkRRSHTlXdBX9+lCuAPD4/Mp+bhA2Dvok/7vRP6p6bKK7DlK1owI44iBChLYr2a2ejEhdjoTMO+qvL3+A18AkID97c+x04gAAAAAElFTkSuQmCC
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Тот-самый "flip tab" или как-его там.. в общем: закрытие вкладки и ЛКМ по активной - переход на пред.посещённую.
Как оказалось, ощень-на сложное и недоступное для мозилла-и-хромоводов действие(необходимое и обязательное КМК, пришедшее из OperaPresto и по-сей день непредставимое) оказалось возможно уложить в 30 строк форматированного, с пробелами, кода. Мда-а-а...
Благодарю господ bunda1 и Dumby за примеры, шаблоны и алго. Однажды предложенные ими ответы, вылились в итоге в это ↓
// ---02--- Клик по активной или закрытие - переход на пред.посещенную ------------------- (function() { let tabContainer = gBrowser.tabContainer, flag = true; addEventListener("mousedown", e => flag = e.target != gBrowser.selectedTab, true, tabContainer); // for click tab flip addEventListener("click", mruTab, false, tabContainer); addEventListener("TabClose", mruTab, false, tabContainer); window.addEventListener("TabSelect", e=> e.target.setAttribute("lastSelect", Date.now()) ); // for click tab flip gBrowser.mCurrentTab.setAttribute("lastSelect", gBrowser.mCurrentTab.lastAccessed); // при запуске бравзера один раз активной вкладке выставляем аттриб. function mruTab(e) { let tabs = [...gBrowser.visibleTabs] .filter( t=> t.hasAttribute("lastSelect") ) .sort( (a,b)=> b.getAttribute("lastSelect") - a.getAttribute("lastSelect") ); switch(e.type) { case "click": const protTab = e.originalTarget.className.startsWith("tab-close-button"), mod = ( e.ctrlKey || e.altKey || e.shiftKey ) ? true : false; if( flag || e.button || protTab || mod ) return; gBrowser.selectedTab = tabs[1]; break; case "TabClose": gBrowser.selectedTab = tabs[0]; break; //case "TabClose": if(e.target == gBrowser.mCurrentTab) gBrowser.selectedTab = tabs[0]; else return; break; default: return; } }; })();
Отредактировано mokujin (12-11-2024 20:44:28)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Страницы: 1