Насчет 5 пикселей сверху таба
Хмм ?
function test(e) { var node = e.target; if ( e.screenY > node.boxObject.screenY + 5 || node.nodeName != "tab" || node == gBrowser.selectedTab ) return; gBrowser.selectedTab = node; } addEventListener("mousemove", test, false, gBrowser.mTabContainer);
Отсутствует
Активировать вкладку наведением курсора немного над вкладкой(Firefox 3.6 + )
Автор: Dumby
Описание: Kод даёт возможность активизировать вкладку наведением курсора немного над вкладкой( 5 пикселей сверху ), без клика. В коде можно изменить высоту наведения.
Использование: создайте новую Custom Buttons кнопку и положите код в инициализацию. Можно положить код в уже существующую кнопку.
function tabHover(e) { var node = e.target; if ( e.screenY > node.boxObject.screenY + 5 || node.nodeName != "tab" || node == gBrowser.selectedTab ) return; gBrowser.selectedTab = node; } addEventListener("mousemove", tabHover, false, gBrowser.mTabContainer);
Отредактировано bunda1 (06-03-2013 19:05:43)
Отсутствует
Кнопка вообще одна из must have получилась, мини-революция в эргономике.
Эта правда.
Из этой темы собрал для себя кнопку использование которой позволило мне полностью отказаться от расширения TabMixPluse
Собственно говоря мне TabMixPluse нужен быль лишь для того чтобы упорядочить открытие и закрытие вкладок.
А именно открывать сразу после текущей а закрывать с фокусом на левую.Плюс контекстное меню вкладки с возможностью дублировать текущую.
Осталась мелочь(наверно мелочь).
В TabMixPluse есть настройка позволяющая открывать вкладки из панели закладок(открыть всё во вкладках) в том порядке в котором они размещены.То есть верхняя закладка будет первой
вкладкой и так далее сверху вниз.Без TabMixPluse вкладки открываются наоборот первой вкладкой будет самая нижняя закладка и далее снизу вверх.Очень не удобно.
Не подскажите есть ли решение?
***
Не подскажите как можно отобрать кнопку закрытия на вкладках?
Мне нужно её скрыть но лёгких путей не хочу(userChrome.css)
Хочу добавить контекстный пункт к вкладкам для скрытия/показа кнопки закрытия
Пробовал вот так:
document.getAnonymousElementByAttribute(gBrowser.selectedTab, "class", "tab-close-button");
Но это только для текущей
***
Ещё хотелось бы добавить в контекстное меню вкладок пункт позволяющий перезагружать вкладку по таймеру.
Как обычно знаю как но не до конца.Не могу понять как воздействовать только на нужную вкладку.У меня перезагружаются
либо все либо текущая.
Отредактировано questman (06-03-2013 09:40:14)
Отсутствует
questman
Нужная для твоих пунктов меню вкладка это this.parentNode.triggerNode или TabContextMenu.contextTab
Вот, кстати, незатейливая «перезагружалка», может быть пригодится...
const reloadInterval = 5000; //ms const labelReload = "Перезагружать вкладку"; const labelStopReload = "Остановить перезагрузку вкладки"; const tabContextMenu = document.getElementById("tabContextMenu"); const insertPoint = document.getElementById("context_reloadTab"); const id = "context_reloadTab_interval"; const attr = "reload-interval-id"; var menuitem = document.createElement("menuitem"); menuitem.id = id; const command = '\ var tab = this.parentNode.triggerNode;\n\ var interval = tab.getAttribute("' + attr + '");\n\ if (interval) {\n\ clearInterval(interval);\n\ tab.removeAttribute("' + attr + '");\n\ }\n\ else {\n\ var interval = setInterval(function() {\n\ gBrowser.reloadTab(tab);\n\ }, ' + reloadInterval + ');\n\ tab.setAttribute("' + attr + '", interval);\n\ }'; menuitem.setAttribute("oncommand", command); function insertMenuitem(e) { if (e.target != tabContextMenu) return; var tab = tabContextMenu.triggerNode; var interval = tab.hasAttribute(attr); var label = interval ? labelStopReload : labelReload; menuitem.setAttribute("label", label); tabContextMenu.insertBefore(menuitem, insertPoint.nextSibling); } function removeMenuitem(e) { if (e.target != tabContextMenu) return; tabContextMenu.removeChild(menuitem); } addEventListener("popupshowing", insertMenuitem, false, tabContextMenu); addEventListener("popuphiding", removeMenuitem, false, tabContextMenu);
Отредактировано Dumby (06-03-2013 19:53:06)
Отсутствует
Вот, кстати, незатейливая «перезагружалка», может быть пригодится
Полезная вещь, а можно сделать её более затейливой - чтобы проверяла страницу на изменения и обновляла только тогда если изменения обнаружены или хотя бы что бы обновления происходили не заметно без вращения индикатора на табе, а то напрягает. Если конечно это не слишком сложно
Отсутствует
Dumby
Присоединяюсь к bunda1, полезная вещь, а можно ли ее вкл/выкл повесить на ПКМ, а контекстное меню убрать?
Пришла в голову идея, чтобы не было холостой перезагрузки и не раздражал throbber, возможно ли сделать кнопку, перезагружающую таб только при активации. Т.е. находясь в этой теме, я нажимаю одинарный ПКМ по соседней вкладке http://forum.mozilla-russia.org/search. … n=show_24h и всегда при ее активации, она со свежими непрочитанными темами. Отключается тоже по ПКМ. Плюс к релоаду, будет удобен автоматический Scroll to Top.
Отредактировано vom (08-03-2013 02:24:46)
Отсутствует
bunda1
Я не знаю как проверить произошли ли изменения на странице,
для некоторых страниц, неверное, хтмл-текст можно сравнить, а может и нет...
С индикатором на табе, вроде, справился
const checkInterval = 1 * 60 * 1000; //ms const labelReload = "Перезагружать вкладку"; const labelStopReload = "Остановить перезагрузку вкладки"; const noThrob = true; const tabContextMenu = document.getElementById("tabContextMenu"); const insertPoint = document.getElementById("context_reloadTab"); var menuitem = document.createElement("menuitem"); menuitem.id = "context_reloadTab_interval"; function setThrobberState(tab, throb) { const on = "tab-throbber"; const off = "tab-throbber-off" var throbber = document.getAnonymousElementByAttribute(tab, "class", on) || document.getAnonymousElementByAttribute(tab, "class", off); throbber.className = throb ? on : off; } function tick(tab) { var oldDocs = tab.docs; if (!oldDocs) return; tab.docs = {}; function fillTabDocs(tab, win) { var frames = win.frames; var loc = frames.location; if (loc != "about:blank") { tab.docs[frames.location] = oldDocs[frames.location] || ""; } if (!frames.length) return; for(var i = 0; i < frames.length; i++) fillTabDocs(tab, frames[i]); } var br = tab.linkedBrowser; if (!br) return; fillTabDocs(tab, br.contentWindow); for(var loc in tab.docs) sendRequest(tab, loc); setTimeout(tick, checkInterval, tab); } function sendRequest(tab, loc) { var req = new XMLHttpRequest(); req.open("GET", loc, true); req.responseType = "text"; // reg.timeout = Math.round(checkInterval / 2); req.onloadend = function() { // if (req.status != 200) return; var res = req.responseText; var old = tab.docs[loc]; if (old && old != res) { var wn = tab.linkedBrowser.webNavigation; wn.reload(wn.LOAD_FLAGS_BYPASS_CACHE); } tab.docs[loc] = res; } req.channel.loadFlags |= req.channel.LOAD_BYPASS_CACHE; req.send(null); } function onCommand(e) { var tab = e.target.parentNode.triggerNode; if (tab.docs) { delete tab.docs; setThrobberState(tab, true); return; } if (noThrob) setThrobberState(tab, false); tab.docs = {}; tick(tab); } function insertMenuitem(e) { if (e.target != tabContextMenu) return; var tab = tabContextMenu.triggerNode; var protocol = tab.linkedBrowser.contentDocument.location.protocol; if (protocol != "http:" && protocol != "https:") return; var label = tab.docs ? labelStopReload : labelReload; menuitem.setAttribute("label", label); tabContextMenu.insertBefore(menuitem, insertPoint.nextSibling); } function removeMenuitem(e) { if (e.target != tabContextMenu) return; try { tabContextMenu.removeChild(menuitem); } catch(ex) {} } addEventListener("popupshowing", insertMenuitem, false, tabContextMenu); addEventListener("popuphiding", removeMenuitem, false, tabContextMenu); addEventListener("command", onCommand, false, menuitem); this.onDestroy = function(reason) { if (reason == "update" || reason == "delete") { Array.slice(gBrowser.tabs).forEach(function(tab) { delete tab.docs; setThrobberState(tab, true); }); } };
function reloader(e) { var tab = e.target; var br = tab.linkedBrowser; gBrowser.reloadTab(tab); br.addEventListener("DOMContentLoaded", function onLoad(e) { br.removeEventListener("DOMContentLoaded", onLoad, false); e.target.defaultView.scroll(0, 0); }, false); } function addListener(e) { if (e.button != 2 || e.target.nodeName != "tab") return; e.preventDefault(); var tab = e.target; if (!tab.reloader) { addEventListener("TabSelect", reloader, false, tab); tab.reloader = true; return; } removeEventListener("TabSelect", reloader, false, tab); delete tab.reloader; } addEventListener("click", addListener, false, gBrowser.mTabContainer);
Отредактировано Dumby (09-03-2013 01:27:45)
Отсутствует
Так что-ли ?
В точку, спасибо большое. Опробовал, оказалось крайне удобно для многих сайтов, давно задумывался о подобном, т.к. простой перезагрузчик не рационален и не претенциозен.
Отредактировано vom (09-03-2013 06:02:06)
Отсутствует
Dumby
Хорошая кнопка, только как сделать чтобы была обычная перезагрузка, без прокрутки в начало страницы.
gBrowser.reloadTab(tab);
br.addEventListener("DOMContentLoaded", function onLoad(e) {
br.removeEventListener("DOMContentLoaded", onLoad, false);
e.target.defaultView.scroll(0, 0);
}, false);
}
function addListener(e) {
if (e.button != 2 || e.target.nodeName != "tab") return;
e.preventDefault();
var tab = e.target;
if (!tab.reloader) {
addEventListener("TabSelect", reloader, false, tab);
tab.reloader = true;
return;
}
removeEventListener("TabSelect", reloader, false, tab);
delete tab.reloader;
}
addEventListener("click", addListener, false, gBrowser.mTabContainer);
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
villa7
Ну, вроде, дело нехитрое. Только не пойму, что хорошего в том,
что у табов нет контекстного меню. Давай хоть с Ctrl будет как обычно, мало-ли понадобиться
function reloader(e) { gBrowser.reloadTab(e.target); } function onClick(e) { if ( e.button != 2 || e.ctrlKey || e.target.nodeName != "tab" ) return; e.preventDefault(); var tab = e.target; if (!tab.reloader) { addListener(tab, true); tab.reloader = true; return; } addListener(tab, false); delete tab.reloader; } function addListener(tab, add) { if (add) addEventListener("TabSelect", reloader, false, tab); else removeEventListener("TabSelect", reloader, false, tab); } for(var tab of gBrowser.tabs) if (tab.reloader) addListener(tab, true); addEventListener("click", onClick, false, gBrowser.mTabContainer);
Отсутствует
Dumby
Вот теперь то что нужно, спасибо. Почему нет контекстного меню у табов, у меня есть, при двойном клике ПКМ все появляется, меня вполне устраивает.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
bunda1
Я не знаю как проверить произошли ли изменения на странице,
для некоторых страниц, неверное, хтмл-текст можно сравнить, а может и нет...
С индикатором на табе, вроде, справился
Спасибо, спасибо
Отсутствует
Открывать любую новую вкладку справа от текущей
(Firefox 3.6 + )
Автор: bunda1
Описание: Kод дает возможность открывать любую новую вкладку справа от текущей.
Это очень полезный код.Но при "Открыть всё во вкладках" порядок вкладок меняется с ног на голову.
Нельзя ли сделать так чтобы этот код давал возможность открывать всё во вкладках по порядку.
У меня при различных манипуляциях с кодом получается что то одно.Либо новая вкладка открывается справа
от текущей либо все вкладки открываются по порядку.Как это объединить не могу приложить ума.
Отсутствует
при "Открыть всё во вкладках" порядок вкладок меняется с ног на голову.
Кривая распорка:
var multiTabPos = 0; var lastMultiTab = 0; addEventListener("TabOpen", function(event) { if(new Error().stack.indexOf("\nPUIU_openContainerInTabs@") == -1) multiTabPos = 0; else { var now = Date.now(); if(now - lastMultiTab > 100) multiTabPos = 0; ++multiTabPos; lastMultiTab = now; } var tabpos = gBrowser.selectedTab._tPos + 1 + (multiTabPos && multiTabPos - 1); gBrowser.moveTabTo(event.target, tabpos); }, false, gBrowser.tabContainer);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Кривая распорка:
Спасибо!!!
Это то что надо!
Теперь кнопочка собранная из этой темы полностью заменяет TabMixPlus вплоть до перезагрузки странички по таймеру.
Помню было лёгкое расширение для упорядочивания открытия и закрытия вкладок Tabberwocky но оно уже давно не работает.
Так не хотелось в своё время ставить TabMixPlus из за пары нужных функций.
А сейчас ещё лучше стало,нужные функции в одной махонькой кнопке.
Спасибо ещё раз.
Отредактировано questman (20-03-2013 12:12:52)
Отсутствует
browser.link.open_newwindow.restriction = 0 ?
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
browser.link.open_newwindow.restriction = 0 ?
Да,оно!Спасибо!
Но тогда в код добавлять не нужно,раз в about:config можно изменить.
***
А есть где почитать информацию о документированных настройках about:config?
Отсутствует
К сожалению эта кнопка не работает в Seamonkey 2.22. С этим можно что-нибудь сделать? Очень уж нужная кнопочка (хотя бы чтоб результат поиска в новой вкладке открывало, мне, собственно, только это и нужно).
Нашёл нужные настройки для поиска в самом Seamonkey.
А кнопка, кстати, ругается на то, что "openNode is undefined". Понятия не имею, что это значит, но на текущий момент моя проблема, кажется, решена.
Отредактировано MySh (01-12-2013 01:46:37)
Отсутствует
А кнопка, кстати, ругается на то, что "openNode is undefined". Понятия не имею, что это значит, но на текущий момент моя проблема, кажется, решена.
Код изменяет внутренние функции Firefox и если openNode is undefined то это значит что в Seamonkey такой функции нет.
Отсутствует