Toggle Find+ ( Firefox 24+ )
Авторы: bunda1, Dumby, iDev.Pi, за помощь с кнопкой спасибо mserv и Infocatcher.
Версия: от 20.06.2016.
Описание: кнопка сильно изменяет стандартную панель поиска по странице и добавляет дополнительные возможности для поиска по странице:
Настройки кнопки в меню кнопки:
Автоматически закрывает панель поиска через установленное время, если это включено в настройках кнопки, время можно изменить в настройках кнопки.
Если в настройках кнопки включено автовыделение автоматически на всех страницах выделяет заранее введенный текст или текст из поля вода на панели поиска, если это включена в настройках кнопки автоматически выделяет ссылки на страницах если адресс ссылки содержит текст для автовыделение. Можно менять цвет автовыделения в настройках кнопки. При наведении курсором на кнопку в сплывающей подсказке(тултипе) отображается текст для автовыделение вместе с подсказкой по кнопке:
Показывает количество найденных совпадений на панели поиска.
Минимизирует панель поиска по странице, мини панель поиска можно разместить разных углах браузера поверх страницы.
Добавляет кнопку "Вставить и искать" на панель поиска, ЛКМ на которой запускает поиск выделенный текст или текста из буфера обмена по странице, а ПКМ очищает поле текстового ввода на панели поиска.
Добавляет кнопку "Поиск" на мини панели поиска, ЛКМ и ПКМ на которой соответственно запускает поиск текста из поля текстового ввода панели поиска верх-вниз по странице, кнопка "Поиск" замещает стандартные кнопки панели поиска Далее и Назад:
Добавляет в контекстное меню выделенного текста дополнительные пункты, если это включено в настройках кнопки:
Клики на кнопке:
ЛКМ => Показать - скрыть поиск по странице,
СКМ => Поиск по странице из буфера обмена,
ПКМ => Mеню кнопки с настройками,
Двойной ПКМ или Ctrl + ПКМ или Snift + ПКМ => Стандартное меню кнопки.
Сочетания клавиш добавляемые кнопкой:
Ctrl + F(а) => Показать - скрыть поиск по странице,
Ctrl + ALT+ F(а) => Поиск по странице из буфера обмена,
Ctrl + ALT+ H(р) => Добавить текст(выделенный / из буфера обмена) для автовыделения текста,
CTRL + SHIFT + F(а) => Oткрыть панель поиска по странице с чистой поисковой формой или очистить поисковую форму если панель уже открыт.
Управление панелью поиска мышью:
Двойной ЛКМ на панели поиска или двойной ПКМ на поле текстового ввода панели поиска включает - отключает обычную подсветку(Подсветить все) на странице всех найденных совпадений с поисковым запросом или включает - отключает автовыделение если это включено в настройках кнопки.
Двойной СКМ на странице открывает-закрывает панель поиска, если это включено в настройках кнопки.
ЛКМ на надписи 'Найти' на панели поиска запускает поиск, а ПКМ очищает поле текстового ввода на панели поиска, если это FF17-24.
ЛКМ + ПКМ на поле текстового ввода панели поиска очищает поле текстового ввода.
СКМ на панели поиска запускает поиск по странице из буфера обмена.
Прокрутка колёсиком мыши вверх-вниз на панели поиска соответственно запускает поиск по странице.
Отредактировано bunda1 (17-11-2015 20:14:36)
Отсутствует
Код инициализации кнопки Toggle Find+:
// Настройка функций кликов мыши для кнопки ............. this.onclick =e=> { if ( e.button == 0 ) gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); if ( e.button == 1 ) { gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); goDoCommand("cmd_paste"); }; if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { e.preventDefault(); menu.showPopup( this, -1, -1, "popup", "bottomleft", "topleft"); } }; // Настройки и переменные для кнопки ............. var findbarRight = 18; // отступ справа у мини панели поиска var addKeyboardShortcuts = true; // разрешить дополнительные сочетания клавиш для панели поиска var finder = (gBrowser.finder || gFindBar); var lighted = (finder._highlightDoc || finder._highlight || finder.highlight).bind(finder); var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); // Проверить наличие строк в about:config и создать если не существует ............. if ( cbu.getPrefs("FindBar.version") != '15') { ["FindBar.top","FindBar.mini","FindBar.right","FindBar.auto_Close","FindBar.autoclear","FindBar.Highlight", "FindBar.Highlight.Link","FindBar.pasteButton","FindBar.contextFindWords","FindBar.ToggleWithDoubleMiddleClick", "FindBar.Autohighlight.ToggleWithDoubleClick","FindBar.auto_Find"].forEach(pref=> cbu.setPrefs(pref, false) ); ["FindBar.version,15", "FindBar.CloseTimer,7", "ui.textHighlightBackground,#ef0fff", "FindBar.Highlight.value,"] .forEach(pref=> cbu.setPrefs(pref.split(",")[0], pref.split(",")[1]) ); }; // Подсказка для кнопки ............. this.onmouseover =()=> { // получить и обрезать подсказку для автовыделение .... var val = gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data; var value = val.substring(0,50) + ( (val.length > 50) ? '....' : "" ); this.tooltipText = "Поиск по странице \nЛ: Показать - скрыть поиск по странице \nС: Поиск по странице из буфера обмена\ \nП: Mеню кнопки \nДП: CB меню \n\nАвтовыделение: " + value; }; // Создать меню с настройками для кнопки ............. var array = [ { label: 'Автоматически закрыть', value: 'FindBar.auto_Close', func: autoClose, cek:''}, { label: 'Закрыть через: |7| секунд', value: 'FindBar.CloseTimer', change:''}, { separator: '' }, { label: 'FindBar мини', value: 'FindBar.mini', func: toggleAttribute, cek:''}, { label: 'FindBar сверху', value: 'FindBar.top', func: toggleAttribute, cek:''}, { label: 'FindBar справа', value: 'FindBar.right', func: toggleAttribute, cek:''}, { label: 'Кнопка "Вставить и искать" на FindBar', value: 'FindBar.pasteButton', func: toggleAttribute, cek:''}, { separator: '' }, { label: 'Find в контекстном меню', value: 'FindBar.contextFindWords', cek:''}, { label: 'Запуск поиска выделением текста', value: 'FindBar.auto_Find', cek:''}, { label: 'Быстрый поиск по мере набора текста', value: 'accessibility.typeaheadfind', cek:''}, { label: 'Открыть панель поиска с поиском по старому запросу', value: 'FindBar.autoclear', cek:''}, { label: 'Переключать FindBar двойным средним кликом на странице', value: 'FindBar.ToggleWithDoubleMiddleClick', cek:''}, { label: 'Переключать aвтовыделение двойным кликом на панели поиска', value: 'FindBar.Autohighlight.ToggleWithDoubleClick', cek:''}, { separator: '' }, { label: 'Автовыделение', value: 'FindBar.Highlight', func: toggleAttribute, cek:''}, { label: 'Автовыделение в ссылках', value: 'FindBar.Highlight.Link', func: Highlight, cek:''}, { label: 'Добавить текст для автовыделения', value: 'add', func: toggleHighlightValue }, { label: 'Сбросить текст для автовыделения', value: 'clear', func: toggleHighlightValue }, { label: 'Изменить цвет: |#ef0fff| для автовыделения', value: 'ui.textHighlightBackground', change:''} ]; var menu = self.appendChild( document.createElement("menupopup") ); array.forEach(m=> { if ( "separator" in m ) { menu.appendChild( document.createElement("menuseparator") ); return }; if ( "value" in m ) var p = cbu.getPrefs( m.value ); var mItem = document.createElement("menuitem"), arr = m.label.split("|"); mItem.setAttribute("label", ("change" in m) ? (arr[0] + p + arr[2]) : m.label ); if ( "cek" in m ) { mItem.setAttribute('type', 'checkbox'); mItem.setAttribute('checked', p ); mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))'); } if ( "change" in m ) { mItem.addEventListener("command", e=> { var val = custombuttons.promptBox(this.label, 'Отмена вернёт значение по умолчанию'); var pref = val[0] ? val[1] : arr[1]; cbu.setPrefs( m.value, pref ); this.label = arr[0] + pref + arr[2]; }, false); }; if ( "func" in m ) mItem.addEventListener("command", e=> { m.func(m.value) }, false); menu.appendChild(mItem); }); menu.setAttribute("onclick", "event.stopPropagation()"); // Установить и удалить разные атрибуты для панели поиска ............. function toggleAttribute(s) { if ( s == "FindBar.Highlight" ) { gFindBar.getElement('highlight').removeAttribute("checked"); Highlight(); return }; var atrr = s.substring(8); setTimeout(()=> { cbu.getPrefs(s) ? gFindBar.setAttribute(atrr, "true") : gFindBar.removeAttribute(atrr) }, 0); if ( s !== "FindBar.mini" ) return; if ( cbu.getPrefs(s) ) { if ( gFindBar.getElement('highlight').hasAttribute("checked") ) { gFindBar._findField.style.color = cbu.getPrefs("ui.textHighlightBackground"); } } else { if ( !!gFindBar._findField.style.color ) { gFindBar.getElement('highlight').setAttribute("checked", "true"); gFindBar._findField.removeAttribute("style"); } } }; ["FindBar.top", "FindBar.mini", "FindBar.right", "FindBar.pasteButton"].forEach(s=> toggleAttribute(s)); // Установить нужную иконку кнопки при старте браузера или при изменениях настроек автовыделения ............. var s = "FindBar.Highlight"; function toggleImage() { self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon"). src = cbu.getPrefs(s) ? "data:image/x-icon;base64,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" : "data:image/x-icon;base64,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"; }; toggleImage(); gPrefService.addObserver(s, toggleImage, false); addDestructor(()=> gPrefService.removeObserver(s, toggleImage) ); // Удалить оргинальный панель поиска и создать новый с дополнительными возможностями ............. delete window.gFindBar; window.gFindBar = document.getElementById("FindToolbar"); if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) { var version = parseInt(Services.appinfo.version); if ( version > 25 ) // удалить на FF25+ for( var tab of gBrowser.tabs ) { if ( !tab._findBar ) continue; tab._findBar.parentNode.removeChild( tab._findBar ); delete tab._findBar; } else document.getElementById("browser-bottombox") // удалить на FF17-24 .removeChild( document.getElementById("FindToolbar") ); if ( version > 38 ) { // исправить глюк на FF38+ setTimeout(()=> { eval("gFindBar.startFind = " + gFindBar.startFind.toString() .replace('this.browser.finder.getInitialSelection();', 'this.onCurrentSelection(gBrowser.finder.getActiveSelectionText(), false)')); var {Finder} = Cu.import("resource://gre/modules/Finder.jsm"); eval("Finder.prototype.getActiveSelectionText = " + Finder.prototype .getActiveSelectionText.toString().replace('.replace', '; //')); }, 3000); } gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser); gFindBar.setAttribute("browserid", "content"); version < 25 && gFindBar.setAttribute("oldFindBar", "true"); gFindBar.id = "FindToolbar"; gFindBar.clientTop; delete window.gFindBarInitialized; window.gFindBarInitialized = true; gFindBar._selectionMaxLen = 1000; // лимит символов для поиска и подсветки gFindBar._quickFindTimeoutLength = 4500; // время закрытия панели поиска эсли тот открыт по мере набора текста }; if ( gFindBar instanceof Ci.nsIDOMEventListener ) // добавить поиск по мере набора текста addEventListener("keypress", gFindBar) function onBrowserKeypress(msg) {msg.target == gBrowser.selectedBrowser && gFindBar._onBrowserKeypress(msg.data);} messageManager.addMessageListener("Findbar:Keypress", onBrowserKeypress); addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onBrowserKeypress)); // Показать количество совпадений на панели поиска, автор кода 'Dumby' ............. var curHit, allHits, lastCurHit; const fff = gFindBar._findField, lab = fff.parentNode.insertBefore( document.createElement("label"), fff ), nrm = Ci.nsISelectionController.SELECTION_NORMAL; lab.id = "hits"; addDestructor(()=> fff.parentNode.removeChild(lab) ); function updateHits(arg) { if ( gFindBar.hidden ) return; var win = arg instanceof Ci.nsIDOMWindow && arg || content; var finder = gBrowser.finder || gFindBar; if ( win == content ) curHit = allHits = 0; var word = fff.value; var controller = finder._getSelectionController(win); var doc = win.document; if ( word && controller && doc && doc.documentElement ) { var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement; var searchRange = doc.createRange(); searchRange.selectNodeContents(body); var startPt = searchRange.cloneRange(); startPt.collapse(true); var endPt = searchRange.cloneRange(); endPt.collapse(false); var retRange = null; var nsIFind = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind); nsIFind.caseSensitive = gFindBar._shouldBeCaseSensitive(word); while ((retRange = nsIFind.Find(word, searchRange, startPt, endPt))) { allHits++; if ( !curHit) { var sel = controller.getSelection(nrm), range; if ( sel.toString() ) range = sel.getRangeAt(0); else { var editableNode = finder._getEditableNode(retRange.startContainer); if ( editableNode ) sel = editableNode.editor.selectionController.getSelection(nrm); if ( sel.toString() ) range = sel.getRangeAt(0); } var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"] .every(function(prop) range[prop] == retRange[prop]); if ( comp ) curHit = allHits; } startPt = retRange.cloneRange(); startPt.collapse(false); } Array.forEach(win.frames, frame=> updateHits(frame)); } if ( win != content ) return; lab.value = curHit + "/" + allHits; if ( fff.value ) self.lastValueOfFind = fff.value; // запомнить текст для поиска // поле текстового ввода красное если ничего не найдено .... allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status"); // поле текстового ввода мигает желтим если переход с низа наверх страницы и наоборот .... if ( !!arg && arg == "flash" && allHits > 2 && (allHits/curHit * allHits/lastCurHit == allHits) ) { fff.setAttribute("flash", true ); setTimeout(()=> fff.removeAttribute("flash"), 600); } lastCurHit = curHit; }; updateHits(); // FindBar, поиск колесиком мыши ............. addEventListener('DOMMouseScroll', e=> { gFindBar.onFindAgainCommand(e.detail < 0); updateHits("flash") }, false, gFindBar); // Отслеживать клики на панели поиска ............. addEventListener("mousedown", e=> { if ( e.button == 1 ) { // поиск из буфера обмена e.preventDefault(); var str = (gClipboard.read()).replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста gFindBar._findField.value = str; Highlight("hits", "greenLight"); } var targ = e.originalTarget if ( !targ.hasAttribute("anonid") ) return; if ( targ.value == 'Найти:') { // кнопка 'Найти:' e.button ? clearFindField() : gFindBar.onFindAgainCommand(false); updateHits("flash"); } if ( targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous setTimeout(updateHits, 0, "flash"); } }, false, gFindBar); // Двойной клик на панели поиска включает и выключает автовыделение или стандартную подсветку текста ............. addEventListener("dblclick", e=> { if ( e.originalTarget.nodeName == 'div' && e.button == 0 ) return; if ( /:label|button|check/.test( e.originalTarget.nodeName ) ) return; if ( cbu.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick") ) { var s = cbu.getPrefs("FindBar.Highlight"); cbu.setPrefs("FindBar.Highlight", !s ); menu.childNodes[16].setAttribute("checked", !s); gFindBar.getElement('highlight').removeAttribute("checked"); Highlight(); } else { if ( cbu.getPrefs("FindBar.Highlight") ) return; gFindBar.getElement("highlight").click(); gFindBar._findField.style.color = (gFindBar._findField.style.color || !gFindBar.hasAttribute('mini')) ? "" : cbu.getPrefs("ui.textHighlightBackground"); }; // закрыть контекстное меню поисковой формы .... var hbox = gFindBar._findField.mInputField.parentNode; setTimeout(()=> document.getAnonymousElementByAttribute(hbox, "class", "textbox-contextmenu").hidePopup(), 20); window.content.focus(); }, false, gFindBar); // ЛКМ + ПКМ на поле текстового ввода очищают его ............. function clickToClear(e) { if ( e.type == "mousedown" ) { if ( e.button == 0 ) this.leftButtonDown = true; if ( e.button == 2 && this.leftButtonDown ) { this.leftButtonDown = false; this.stopMenu = true; setTimeout(()=> { clearFindField() }, 0); } } if ( e.type == "click" ) { if ( e.button == 0 ) this.leftButtonDown = false; if ( e.button == 2 && this.stopMenu ) { e.preventDefault(); e.stopPropagation(); this.stopMenu = false; } } }; ["mousedown", "click"].forEach(type=> addEventListener(type, clickToClear, false, gFindBar._findField) ); // Запускать поиск выделением текста если это разрешено в 'about:config' ............. function autoFind(e) { if ( e.button != 0 ) return; if ( !cbu.getPrefs("FindBar.auto_Find") ) return; if ( /input|password|textarea|textbox|searchbar|findbar|tabbrowser/.test(e.target.localName) ) return; if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection(); if ( e.type == 'mouseup' ) { var selection = getBrowserSelection(); if ( selection && selection !== lastSelection ) { setTimeout(()=> { gFindBar.onFindCommand(); updateHits(); lab.value == "0/0" ? Highlight() : Highlight("", "greenLight") }, 50); } } }; addEventListener("mouseup", autoFind, false, gBrowser); addEventListener("mousedown", autoFind, false, gBrowser); // Автоматически закрывать панель поиска, если это разрешено в 'about:config' ............. function autoClose() { window.clearTimeout(self.closeTimer); try { autoClose.removeListener() } catch(e) {}; function closeFind(e) { if ( e !== 'timer' && e.target.nodeName == 'findbar') { window.clearTimeout( self.closeTimer ); autoClose.run = true; } else if ( e == 'timer' || autoClose.run && !gFindBar._findField.getAttribute("focused") ) { self.closeTimer = setTimeout(()=> { gFindBar.close(); }, cbu.getPrefs("FindBar.CloseTimer") + '000'); autoClose.run = false; } } if ( cbu.getPrefs("FindBar.auto_Close") && !gFindBar.hidden ) { closeFind('timer'); addEventListener('mouseover', closeFind, false, window); autoClose.removeListener =()=> { removeEventListener('mouseover', closeFind, false, window) }; } }; // Переключать панель поиска двойным средним кликом на странице ............. addEventListener("mouseup", e=> { if ( e.button != 1 ) return; if ( !cbu.getPrefs("FindBar.ToggleWithDoubleMiddleClick") ) return; if ( self.flag ) { gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); Highlight("hits", "greenLight"); gFindBar._findField.focus(); }; self.flag = true; setTimeout(()=> { self.flag = false }, 600); }, false, gBrowser); // Сочетания клавиш для управление поиском на странице ............. addEventListener('keydown', e=> { if ( content.location.href == 'chrome://browser/content/places/places.xul' ) return; // Ctrl+snift+g и F3, запуск подсчета совпадений .... if ( e.keyCode == 114 || ((!e.altKey) && ((e.ctrlKey) || (e.shiftKey)) && (e.keyCode == 71)) ) { gFindBar.hidden || setTimeout(updateHits, 0, "flash"); } // Ctrl+f, показать - скрыть панель поиска .... if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) { e.preventDefault(); e.stopPropagation(); gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); Highlight("hits", "greenLight"); gFindBar._findField.focus(); } if ( !addKeyboardShortcuts ) return; // дальше дополнительные сочетания клавиш для панели поиска // Ctrl+alt+f, поиск по странице из буфера обмена .... if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 70) ) { gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); goDoCommand("cmd_selectNone"); goDoCommand("cmd_paste"); Highlight("hits", "greenLight"); } /* Ctrl+snift+f, открыть панель поиска с чистой поисковой формой или очистить поисковую форму или открыть панель поиска с предыдущим запросом/выделенным текстом или искать выделенный текст если панель поиска открыт если настройках кнопки включена 'Всегда открывать пустую поисковую форму' ....*/ if ( (e.ctrlKey) && (!e.altKey) && (e.shiftKey) && (e.keyCode == 70) ) { e.preventDefault(); var val = self.lastValueOfFind ? self.lastValueOfFind : ""; var sel = document.commandDispatcher.focusedWindow.getSelection().toString(); if ( sel.length !== 0 ) { val = sel }; gFindBar.onFindCommand(); cbu.getPrefs("FindBar.autoclear") ? setTimeout(()=> { gFindBar._findField.value = val; Highlight("hits", "greenLight"); }, 10) : clearFindField(); } // Ctrl+alt+h, добавить текст(выделенный / из буфера обмена) для автовыделения .... if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 72) ) toggleHighlightValue('add'); }, false, window); // Автоматически выделить слова и ссылки ............. function Highlight(hits, green) { var findValue = gFindBar._findField.value; var hidden = gFindBar.hidden; if ( !hidden ) { // выделить зеленным искомый текст на странице .... if ( !!green && green == "greenLight") setTimeout(()=> { gFindBar._find() }, 10); // для запуска подсчета совпадений .... if ( !!hits && hits == "hits" ) setTimeout(updateHits, 20); } // получаем текст для автовыделения из 'about:config' или из панели поиска .... if ( cbu.getPrefs("FindBar.Highlight") ) { var value = hidden ? gPrefService.getComplexValue("FindBar.Highlight.value", Ci.nsISupportsString).data : ( findValue.length > 2 ) ? findValue: ""; } // удалить и запустить подсветку совпадений .... lighted(false); if ( !!value ) lighted(true, value); /* изменить цвет ссылок на страницах если содержат искомое слово, если разрешено в 'about:config' и включена автовыделение ....*/ var hLink = cbu.getPrefs("FindBar.Highlight.Link") && value; var color = cbu.getPrefs("ui.textHighlightBackground"); function highlightLinks(win) { var doc = win.document, links = doc.links; if ( (hLink || "prop1" in doc ) && links ) { hLink ? doc.prop1 = true : delete doc.prop1; Array.forEach(links, link=> { if ("prop2" in link) link.style.color = link.prop2; if ( hLink && String( link ).indexOf( value ) != -1 ) { link.prop2 = link.style.color; link.style.color = color; } else if ("prop2" in link) delete link.prop2; }); } for ( var i = 0; i < win.frames.length; i++ ) highlightLinks(win.frames[i]); }; highlightLinks(content); }; // Обработчик следит за загрузкой и переключением вкладки и запускают автовыделение ............. var listener = { onStateChange: function(wpr, req, flag) { if ( gBrowser.currentURI.spec == 'chrome://global/content/console.xul') return; if ( flag & Ci.nsIWebProgressListener.STATE_STOP ) Highlight("hits"); }, onLocationChange: function(wpr, req) { if ( wpr.currentURI.spec != "about:blank" && !req && wpr.document.readyState == "complete") Highlight("hits"); gFindBar._findField.removeAttribute("style"); gFindBar.getElement('highlight').removeAttribute("checked"); } }; gBrowser.addProgressListener(listener); addDestructor(()=> gBrowser.removeProgressListener(listener) ); // Обработчики следят за панелью поиска, запускают автовыделение и другие функции ............. addEventListener("drop", e=> { Highlight("hits", "greenLight") }, false, gFindBar._findField); addEventListener("input", ()=> { Highlight("hits", "greenLight") }, false, gFindBar._findField); gFindBar.watch("hidden", (prop, oldV, hidden)=> { setTimeout(()=> { Highlight("hits", "greenLight"); autoClose() }, 10); if ( !hidden && cbu.getPrefs("FindBar.autoclear") ) { // открывать без выделенного текста document.activeElement.blur(); try { self.lastValueOfFind } catch(e) { self.lastValueOfFind = '' }; gFindBar._findField.value = self.lastValueOfFind ? self.lastValueOfFind : ''; gFindBar._findField.focus(); } return hidden; }); // Добавляем подменю в контекстного меню на странице для выделенного текста ............. ((contextMenu, el)=> { var menu = document.createElement("menu"); menu.setAttribute("label", "Find"); contextMenu.insertBefore(menu, el); addEventListener("popupshowing", ()=> { menu.hidden = !cbu.getPrefs("FindBar.contextFindWords") || !gContextMenu.isTextSelected; }, false, contextMenu); addDestructor(()=> contextMenu.removeChild(menu) ); var array = [ { label:"Найти на странице", func: findToContex }, { label:"Выделить текст на странице", func: highlightSel }, { label:"Автовыделение, добавить текст", func: addSel } ]; var menuPopup = menu.appendChild( document.createElement("menupopup") ); array.forEach(m=> { var mItem = document.createElement("menuitem"); mItem.setAttribute("label", m.label); mItem.func = m.func; menuPopup.appendChild( mItem ); }); addEventListener("command", e=> { e.target.func() }, false, menu); function findToContex() { gFindBar.onFindCommand(); Highlight("hits", "greenLight"); }; function highlightSel() { var finder = gBrowser.finder || gFindBar; var lighted = (finder._highlightDoc || finder._highlight).bind(finder); lighted(false), lighted(true, getSelect() ); goDoCommand("cmd_selectNone"); }; function addSel() toggleHighlightValue('add'); })(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-properties")); // Очистить поле текстового ввода на Findbar ............. function clearFindField() { setTimeout(()=> { gFindBar._findField.value = ''; Highlight("hits"); gFindBar._findField.focus(); }, 0) }; // Добавить или удалить текст для автовыделения ............. function toggleHighlightValue(arg) { if ( arg == 'clear' ) { var str = '', title = self.label, notification = "Текст для автовыделение удален"; } if ( arg == 'add' && getSelect() ) { var str = getSelect(), title = "Автовыделение"; var notification = str.substring(0,50) + ( (str.length > 50) ? '....' : "" ); if ( cbu.getPrefs("FindBar.Highlight") ) { goDoCommand("cmd_selectNone") }; } cbu.setPrefs("FindBar.Highlight.value", convertFromUnicode("UTF-8", str) ); alertsService.showAlertNotification(self.image, title, notification); Highlight(); }; // Получить выделенный текст из страницы или из буфера обмена, если нет текста получить false ............. function getSelect() { var el = document.commandDispatcher.focusedElement; try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {}; var sel = document.commandDispatcher.focusedWindow.getSelection(); if (sel == '') sel = gClipboard.read(); if (sel == '') alertsService.showAlertNotification(self.image, self.label, "Выделите или скопируйте текст!"); return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,""); }; // Конвертировать текст в юникод ............. function convertFromUnicode(charset, str) { var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = charset; str = converter.ConvertFromUnicode(str); return str + converter.Finish(); }; // Запустить поиск через Toggle Find+3 если нажать в главном меню на пункт меню 'Найти' ............. addEventListener("command", ()=> { gFindBar.onFindCommand(); Highlight("hits", "greenLight") }, false, document.getElementById("cmd_find")); // Создать кнопку "Учесть регистр" на Findbar ............. var check = document.createElement("checkbox"); check.setAttribute("id", "findCheckbox"); check.setAttribute("label", "Учесть регистр"); check.setAttribute("tooltiptext", "Учесть регистр"); check.setAttribute("checked", gFindBar._shouldBeCaseSensitive("")); gFindBar.getElement("findbar-container").appendChild(check); addDestructor(()=> check.parentNode.removeChild(check) ); check.addEventListener("command", ()=> { gFindBar._setCaseSensitivity(this.checked); Highlight("hits", "greenLight") }); // Создать кнопку "Поиск" на Findbar ............. var search = document.createElement("toolbarbutton"); search.setAttribute("id", "findButton"); search.setAttribute("tooltiptext", "Л: Искать следущее \nС: Поиск текста из буфера \nП: Искать предыдущее"); search.setAttribute("style", "list-style-image: url('chrome://global/skin/icons/Search-glass.png') !important; -moz-image-region: rect(0px, 16px, 16px, 0px);"); gFindBar.getElement("findbar-container").appendChild(search); addDestructor(()=> search.parentNode.removeChild(search) ); search.addEventListener("click", e=> { e.button !== 1 && gFindBar.onFindAgainCommand(!!e.button); updateHits("flash") }); // Создать кнопку "Вставить и искать" на Findbar ............. var paste = document.createElement("toolbarbutton"); paste.setAttribute("id", "pasteButton"); paste.setAttribute("tooltiptext", "Л: Поиск выделенного текста/из буфера \nП: Очистить"); paste.setAttribute("image", "data:image/x-icon;base64,AAABAAEADhAAAAEAIADoAwAAFgAAACgAAAAOAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/ylTda0pU3X/KVN1/ylTdf8pU3X/HTpS/4WFhf/w8PL/8fHz//Hx8//x8fP/8fHz//Hx8/+FhYX/KVN1/yRJaP8jSGf/I0dl/yNHZP8YMEX/j4+P//Hx8//x8vP/8fLz//Hy8//x8vP/8fLz/4+Pj/8pU3X/JUxr/yVLav8kSmn/JElo/xkyR/+cnJz/8vLz//Ly9P/y8vT/8vL0//Ly9P/y8vT/nJyc/ylTdf8nTm3/Jk1t/yVMa/8lSmn/GjNJ/6urq//y8vT/8/P1//Pz9f/z8/X/8/P1//Pz9f+rq6v/KVN1/ydPb/8nTm7/Jk1t/yZMa/8aNEr/srKy//X19v/19vf/9fb3//X29//19vf/9fb3/7Kysv8pU3X/J1Bx/ydQb/8nTm//Jk1t/xs2S/+8vLz/+fr6//r7+//6+/v/ubm5/7e3t/+3t7f/ubm5/ylTdf8oUXP/KFBx/ydQcf8nT2//GzZN/76+vv/6+/v/+/v8//v7/P/ExMT/9vb2/7e3t/na2tpfKVN1/ylTdP8pUXP/KFBy/yhPcP8bN03/v7+///v7/P/7/Pz/+/z8/8rKyv+3t7f/4OLgaQAAAAApU3X/KVN1/yhSdP8oUnT/KFJy/xw4UP+/v7//v7+//7+/v/+/v7//uru7/2OBmf8AAAAAAAAAAClTdf8pU3X/KVN1/ylSdP8pUnT/JEpn/yRIZv8kSGX/I0dk/yNGY/8jRWL/KVN1/wAAAAAAAAAAKVN1/ylTdf8lS2n/IztO/yM7Tv8jO07/IztO/yM7Tv8jO07/JUtp/ydOb/8lS2n/AAAAAAAAAAApU3X/K2GQ/yhahv91dXX/XV1d/11dXf9dXV3/XV1d/4B/f/8oWob/Kmad/ylTdf8AAAAAAAAAAClTda0pU3X/KVN1/7O0tP/h4eD/3t7f/97f3//g4OD/s7S0/ylTdf8pU3X/KVN1rQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1yds1dXFv1XVxb9Wxxdc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUwFASZMCwAlTAsAI00LIys1CxcXFsEYFxbCJS01DAAlTQsAJk0LASZNCwAlTQUAAAAAAAAAAPwArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAASsQQAMrEEADKxBAAysQQAMrEEADKxB8PysQQAMrEE="); var node = gFindBar.hasAttribute('oldFindBar') ? gFindBar.getElement("find-next") : gFindBar.getElement("highlight"); gFindBar.getElement("findbar-container").insertBefore(paste, node); addDestructor(()=> paste.parentNode.removeChild(paste) ); paste.addEventListener("click", e=> { if ( e.button == 0 ) { if ( !getSelect() ) return; gFindBar._findField.value = getSelect(); // вставить текст Highlight("hits", "greenLight"); }; if ( e.button == 2 ) setTimeout(()=> clearFindField(), 0); // очистить поле текстового ввода }, false); // Стиль для панели поиска ............. var uri = makeURI('data:text/css,'+ encodeURIComponent('\ #FindToolbar { border-bottom: 1px solid grey !important; }\ #find-field, .findbar-textbox { width: 325px !important; }\ #FindToolbar > .findbar-container > * { display: -moz-box !important; }\ #FindToolbar .findbar-textbox[status="notfound"] { color: white !important; }\ #FindToolbar > hbox > label { -moz-appearance: none !important; font-weight: bold !important; }\ #FindToolbar .findbar-textbox:not([style]):not([status="notfound"]) { color: black !important; }\ \ #FindToolbar .findbar-closebutton,\ #FindToolbar:not([mini]) #findButton,\ #FindToolbar .findbar-container > image,\ #FindToolbar:not([pasteButton]) #pasteButton,\ #FindToolbar .findbar-case-sensitive.tabbable,\ #FindToolbar checkbox[anonid="find-case-sensitive"],\ #FindToolbar .findbar-find-fast.findbar-find-status,\ #FindToolbar .findbar-find-fast[anonid="match-case-status"] {\ display: none !important; }\ \ /* мини панель поиска ....*/\ #FindToolbar[mini] .findbar-textbox {\ width: 16em !important;\ height: 21px !important;\ padding-right: 20px !important;\ margin-right: 2px !important;\ margin-left: -4px !important; }\ #FindToolbar[mini] {\ position: fixed;\ padding: 0 !important;\ background: menu !important;\ box-shadow: 0px 10px 5px -10px rgba(0,0,0,.3) !important;\ border: 1px solid grey !important; }\ #FindToolbar[mini][top] {\ border-top: 0 !important;\ border-radius: 0 0 8px 8px !important; }\ #FindToolbar[mini][right] {\ right: ' + findbarRight + 'px; }\ #FindToolbar:not([top]) + #content {\ -moz-box-ordinal-group: 0 !important; }\ #FindToolbar:not([top]) {\ -moz-box-ordinal-group: 1 !important; }\ #FindToolbar[mini]:not([top]) {\ border-radius: 8px 8px 0 0 !important;\ margin-top: -29px !important; }\ \ #FindToolbar[mini] toolbarspacer,\ #FindToolbar[mini] label[class="checkbox-label"],\ #FindToolbar[mini] toolbarbutton.findbar-find-next,\ #FindToolbar[mini] toolbarbutton.findbar-find-previous,\ #FindToolbar[mini] .findbar-highlight label,\ #FindToolbar[mini] .findbar-closebutton,\ #FindToolbar[mini] .findbar-find-fast[anonid="find-label"],\ #FindToolbar[mini] .findbar-highlight,\ #FindToolbar[mini] .findbar-highlight[checked] {\ display: none !important; }\ \ /* расположение элементов на панели поиска ....*/\ #pasteButton { padding-left: 6px !important; padding-right: 6px !important; }\ \ #FindToolbar:not([mini]):not([oldFindBar]):not([pasteButton]) #findCheckbox { margin-left: 35px !important; }\ #FindToolbar:not([mini]):not([oldFindBar]) .findbar-highlight.tabbable { -moz-box-ordinal-group: 4 !important; }\ #FindToolbar:not([mini]):not([oldFindBar]) * { -moz-box-ordinal-group: 99 !important; }\ #FindToolbar:not([mini]):not([oldFindBar]) hbox[anonid="findbar-textbox-wrapper"] {\ -moz-box-ordinal-group: 1 !important; margin-left: -10px !important; }\ #FindToolbar:not([mini]):not([oldFindBar]) #pasteButton {\ -moz-box-ordinal-group: 2 !important; margin-left: 5px !important; margin-right: 15px !important; }\ \ #FindToolbar:not([mini]) #hits { text-align: right; width: 4.1em !important; margin-left: -13px; margin-right: -1px; color: green; }\ \ #FindToolbar[mini] #hits { -moz-appearance: none !important; margin-top: 3px !important; }\ #FindToolbar[mini] textbox.findbar-textbox { -moz-box-ordinal-group: 1 !important; }\ #FindToolbar[mini] #findCheckbox { -moz-box-ordinal-group: 2 !important; margin-left: -24px !important; margin-right: -3px !important; }\ #FindToolbar[mini] #pasteButton { -moz-box-ordinal-group: 3 !important; margin: -5px 0 !important; }\ #FindToolbar[mini] #findButton { -moz-box-ordinal-group: 4 !important; margin: -5px 0 !important; }\ \ #FindToolbar[mini][oldFindBar] #pasteButton { margin: 1px 0 !important; }\ #FindToolbar[mini][oldFindBar] #findButton { margin: 1px 0 !important; }\ \ #FindToolbar[mini]:not([oldFindBar]) #findCheckbox { margin-left: -33px !important; margin-right: -5px !important; }\ \ /* не показывать панель поиска на страницах ....*/\ #main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar,\ #main-window[title="Управление дополнениями - Mozilla Firefox"] #appcontent > #FindToolbar\ { display: none !important; }\ ')); var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(uri, 0); addDestructor(()=> { sss.unregisterSheet(uri, 0) });
Отредактировано bunda1 (17-11-2015 15:57:04)
Отсутствует
У меня не воспроизводится проверил сейчас на этой странице на FF13 и FindBar мини, может я что то неправильно понял
Кажется понял, почему ты не можешь воспроизвести. Ты ищешь на странице с помощью прокрутки? Попробуй с помощью лупы.
Отсутствует
Ура, отдельная тема
Чтобы не потерялись мои багрепорты/фичереквесты/просьбы/предложения - перенесу-ка я их сюда, и по мере их выполнения буду их вычёркивать.
Баги:1. Поломано выделение слов в строке поиска двойным кликом (и выделение всего введённого сразу тройным кликом)
2. Если в поиск начать вписывать букву за буквой (так, чтобы получилась длинная абракадабра, которой точно нет на странице) - то при добавлении новых букв - цвет фона поля поиска меняется с красного (сигнализирующего о том, что на странице нет искомой фразы) на белый (сигнализирующий, что фраза на странице есть).
3. При повторном открытии файндбара - фокус переходит на следующее найденное слово (происходит при снятой галке у "Всегда открывать пустую поисковую форму").
4. "??????" или "отсутствует" - автоматически подсвечивается, даже если вы это не искали.
5. "Автовыделение" подсвечивает найденные на странице искомые слова, если панель поиска закрылась по таймеру.
6. Иногда искомое может измениться с верхнего на нижний регистр (и наоборот). Подробности в отдельном сообщении.
7. Иногда файндбар открывается не перенимая на себя фокус.
8. Невозможно пользоваться mini на девайсах без колеса прокрутки.
9. На страницах без прокрутки (где невозможно вызвать авто-прокрутку средним кликом) - поиск открывается/закрывается не двойным, а одиночным средним кликом.
10. На страницах, где много пустого места - показ/скрытие панели происходит не двойным, а одинарным мидл-кликом. Подробности в отдельном сообщении.
11. При открытии файндбара через двойной middle-click - фокус не переходит на поисковую строку.
12. Таймер автоскрытия должен отсчитываться не с момента открытия панели, а с момента последнего действия с ней.
13. В моменты, когда кнопка "найти" имела статус disabled - она выглядела так же, как и не disabled.
Фичереквесты:
1. Добавить таймер закрытия на панель поиска, чтобы было видно через сколько секунд она закроется. Думаю, что это не стоит добавлять в mini.
2. Сделать из кнопки отдельный джетпак и захостить на АМО.3. Сделать позицию файндбара настраиваемой: сверху/cнизу + отдельная настройка для мини: слева/справа. Если с этим нужна помощь - могу написать CSS-стили для всех состояний файндбара.
4. Приделать "умный" хоткей ctrl+shift+f который будет открывать строку с инвертированной настройкой "Очищать поисковую форму".
5. сделать встроенную в фичу автоматической вставки подсвеченного на странице текста в строку поиска при её открытии отключаемой.
6. Сделать фичу сохранения введённого в поиск текста между открытиями файндбара опциональной (т.е. чтоб можно было её включать/отключать). Сейчас текст сохраняется, но это иногда мешает и многим непривычно.
7. Добавить в кнопку возможность переключения булевых префов (используемых этой кнопкой) через её контекстное меню.
Просьбы иного характера:
1. Добавить описание кнопки в её help (ПКМ по кнопке - Custom Button - Edit Button - вкладка Help).
2. Добавить подсказки с пояснениями работы настроек.3. Создать для кнопки отдельную тему.
4. Переименовать настройку в FindBar.ToggleWithDoubleMiddleClick, чтобы название отражало смысл того, что делает эта настройка.
5. Добавить в описание кнопки информацию о настройке FindBar.ToggleWithDoubleMiddleClick.
6. Добавить в описание кнопки:
"Перейти к предыдущей/следующей найденной фразе можно наведя курсор на Панель поиска и покрутив колесо вверх/вниз.
Двойной клик ЛКМ по полю ввода включает/отключает подсветку всех найденных совпадений с поисковым запросом".
Отредактировано iDev.Pi (30-09-2013 21:48:01)
mzfx
Отсутствует
Добавить в описание кнопки:
"Перейти к предыдущей/следующей найденной фразе можно наведя курсор на Панель поиска и покрутив колесо вверх/вниз.
Двойной клик ЛКМ по полю ввода включает/отключает подсветку всех найденных совпадений с поисковым запросом".
Можешь уже зачеркнуть.
Баг ли это?
На страницах без прокрутки (где невозможно вызвать авто-прокрутку средним кликом) - поиск открывается/закрывается не двойным, а одиночным средним кликом.
Это баг, на какой странице заметил?
Отсутствует
Это баг, на какой странице заметил?
я заметил на about:newtab и на своей локальной домашней, но проявляется везде: открой картинку любую в новой вкладке или вот:
http://www.gatsby.ucl.ac.uk/~edward/code/ как пример (первая страница что выдал мне гугл по запросу "small page").
mzfx
Отсутствует
iDev.Pi
На about:newtab и подобных не проблема, а вот с http://www.gatsby.ucl.ac.uk/~edward/code/ ты меня конкретно озадачил не знаю что и делать, измерять страницу что ли, вот же проблема.
Отсутствует
а может объявить тогда этот баг фичей?
Точно так и поступим если не исправлю.
ну а чего? всё равно на таких страницах нет автопрокрутки.
Там нет скролбара, и жаль что у скролбара нет ID
Отредактировано bunda1 (10-03-2012 01:25:03)
Отсутствует
ещё баг:
1. зайти на страницу
2. зажать (и не отпускать) мидл клик, чтобы появился авто-скроллинг
3. опустить курсор вниз, чтобы началась прокрутка
4. отпустить мидл клик
Как результат: срабатывает TF+3, хотя не должен бы.
Добавлено 10-03-2012 01:42:11
ы, как странно: зависит от того, куда кликать. Если на пустые места справа-слева - то баг случается. Если кликать где-то по центру - то бага нет.
Отредактировано iDev.Pi (10-03-2012 01:42:11)
mzfx
Отсутствует
iDev.Pi
Можно весь стиль кнопки заменить этим (в него уже внесены все необходимые исправления + код немного привёл в порядок).
Твой стиль удлиняет FindBar mini может лучше что то сделать с "Phrase not founo" например удалить и как этот баг увидеть.
Отредактировано bunda1 (10-03-2012 02:05:16)
Отсутствует
Твой стиль удлиняет FindBar mini
всего-то на 4 пикселя, вот же ты жадина
можно убрать тот отступ слева (примерно 20пх) который ты зачем-то оставил. Не понимаю, для чего он нужен.
может луче что то сделать с "Phrase not founo"
но с ней всё в порядке, просто ты в своём стиле выставил отрицательный отступ, вызвав это наезжание элементов.
и как этот баг увидеть.
примени стиль
mzfx
Отсутствует
mserv
Баг в Toggle Find+3, если использовать FindBar мини. При поиске на странице, если искомое слово содержится в любом окне для ввода текста и на него попадает курсор, то на нём поиск прекращается, стоит как вкопанный.
Исправил Toggle Find+3
Добавлено 10-03-2012 02:14:25
bunda1 пишети как этот баг увидеть.
примени стиль
В моем коде этот стиль тоже был изначально но я таково бага не замечал. Я не понимаю в чом дело.
Отредактировано bunda1 (10-03-2012 02:14:25)
Отсутствует
bunda1
у тебя локаль английская? надо английскую. потом применяешь стиль. потом вбиваешь что-нибудь в поиск такое, чего точно нет на странице. Всё.
а, ну и я не знаю как там у тебя на 3.6 - я то на найтли.
mzfx
Отсутствует
bunda1
У кнопки, однако, 1000 с лишним строк кода, GUI, который больше, чем просто кнопка, и настройки, которые не всем удобно/возможно изменять в about:config.
Я это к тому, что не было мысли вынести эту кнопку в отдельное расширение?
Отсутствует
mserv
Баг в Toggle Find+3, если использовать FindBar мини. При поиске на странице, если искомое слово содержится в любом окне для ввода текста и на него попадает курсор, то на нём поиск прекращается, стоит как вкопанный.
Исправил Toggle Find+3
Спасибо. Заметил, что лупа не работает при большом количестве найденных результатов на странице. И ещё, если происходит смена регистра найденного слова на странице, то на лупу приходится нажимать дважды. При первом щелчке происходит смена регистра в FindBar мини, а при втором осуществляется переход.
Отредактировано mserv (10-03-2012 14:27:32)
Отсутствует
bunda1
У кнопки, однако, 1000 с лишним строк кода, GUI, который больше, чем просто кнопка, и настройки, которые не всем удобно/возможно изменять в about:config.
Я это к тому, что не было мысли вынести эту кнопку в отдельное расширение?
Настройки я перенесу в меню кнопки. Было бы неплохо сделать из кнопки Jetpacks, но я это не умею и учится нет времени. Надо исправыть ошибки в кнопке. Может ты знаешь как узнать что на странице произошел переход Назад(back) и Вперёд(Forward). Это можно узнать обработчиком
но я не хочу его использовать.
у тебя локаль английская? надо английскую. потом применяешь стиль. потом вбиваешь что-нибудь в поиск такое, чего точно нет на странице. Всё.
а, ну и я не знаю как там у тебя на 3.6 - я то на найтли.
Я проверял на найтли(F13) + локаль английская, и у меня Phrase not found не появляется и не должна появляться потому что в CSS коде кнопки есть этот код
#FindToolbar .findbar-find-fast.findbar-find-status, #FindToolbar .findbar-container>image {display: none !important;}
и он не зависит от локали.
Добавлено 10-03-2012 14:38:57
Заметил, что лупа не работает при большом количестве найденных результатов на странице. И ещё, если происходит смена регистра найденного слова на странице, то на лупу приходится нажимать дважды. При первом щелчке происходит смена регистра в FindBar мини, а при втором осуществляется переход.
Да есть такой непонятный баг, буду исправлять.
Отредактировано bunda1 (10-03-2012 14:54:17)
Отсутствует
потому что в CSS коде кнопки есть этот код
а, ну так тут уж борьба стилей происходит - чей главней окажется (display:none из кнопки или display:-moz-box из персонального стиля) - от того результат и зависит. У меня личные стили побеждают стили из кнопки.
Ну, можешь временно в кнопке удалить те строки, перезагрузиться и увидишь баг. Но ещё проще - всё-таки импортировать стиль, который я привёл. Баг фиксится удалением отрицательного margin-left. Панель становится шире на 4 пикселя, если тебе их жалко - то отрежь пустое место слева на панели, оно лишнее и там можно сэкономить ~20пикселей.
Замечания по поводу бага с toggle срабатывающем при одиночном мидл-клике (не на странице без прокрутки, а вот здесь): нашёл новые зависимости: зависит от того где НАЧИНАЕТСЯ мидл клик и где ты его ОТПУСКАЕШЬ: если слева/справа от мест, где клик начинается или заканчивается есть какие-то блоки текста - то глюк не воспроизводится, если блоков текста там нет - то глюк воспроизводится. Отчётливо видно на страницах АМО: открой страницу любого дополнения и поиграйся с мидл кликом (зажать мидл клик, повести курсор чтоб сработала автопрокрутка, отпустить мидл-клик).
У меня есть подозрение, что этот баг связан с багом, где на странице без скроллинга toggle происходит одиночным кликом: у меня такое чувство, что это 2 немного разных частных случая одного и того же бага: мне кажется, что я раньше как-то замечал, что на страницах АМО некоторые картинки (справа и слева от которых нет текста) сделаны так, что каким-то образом занимаю всю ширину страницы (не могу сейчас найти этому подтверждение).
Новый баг:
если на странице есть слово, которое встречается дважды, но в разных регистрах (допустим, roar и ROAR), то т.к. между скрытием и открытием файндбара твоя кнопка как бы автоматически нажимает "Next", то если в поиск ввести искомое слово в НИЖНЕМ регистре (не заглавными буквами) и 4 раза мидл-кликнуть на странице - фокус покажется сначала на 1-ом слове, а потом перейдёт на второе. Хоть мне даже это само по себе не очень нравится, но баг не в этом, а в следующем:
в момент, когда панель откроется и когда подсветка слова на странице выпадет на случай с заглавными буквами - то в поиск уже будет вписано искомое слово в верхнем регистре.
mzfx
Отсутствует
iDev.Pi
а, ну так тут уж борьба стилей происходит - чей главней окажется (display:none из кнопки или display:-moz-box из персонального стиля) - от того результат и зависит. У меня личные стили побеждают стили из кнопки.
в кнопке тоже есть
Панель становится шире на 4 пикселя, если тебе их жалко - то отрежь пустое место слева на панели, оно лишнее и там можно сэкономить ~20пикселей.
Как отрезать ?
Замечания по поводу бага с toggle срабатывающем при одиночном мидл-клике (не на странице без прокрутки....
да интересный феномен, но двойной мидл-клик надо делать быстро, иначе это будет не двойной клик. Можно поставить таймер для сброса мидле клика, но разве это так нужно? Я уже жалею что использовал двойной мидл-клик от него только проблемы.
если на странице есть слово, которое встречается дважды, но в разных регистрах (допустим, roar и ROAR), то т.к. между скрытием и открытием файндбара твоя кнопка как бы автоматически нажимает "Next"
так я сделал ради красоты, чтобы "искомое" слово выделялось зеленым.
когда подсветка слова на странице выпадет на случай с заглавными буквами - то в поиск уже будет вписано искомое слово в верхнем регистре.
Эсли будет find паменяетса на Find, я правыльно понял ?
Отредактировано bunda1 (10-03-2012 15:57:26)
Отсутствует
в кнопке тоже есть
так оно идёт в начале стиля и перебивается последующими правилами.
это же основы CSS: если два правила с одинаковой важностью в одном стиле диктуют противоположные значения - применено будет то, которое идёт позднее.
Добавлено 10-03-2012 16:23:23
Как отрезать ?
тяжело стиль для этой кнопки править, т.к. чтобы он сработал - нужен рестарт. И применения стиля через Stylish - тоже не перебивает стиль в кнопке пока не сделаешь рестарт.
если судить аналитически, то отрезать эту пустоту можно либо уменьшением width всей панели, либо этот отступ вызван каким-то стилем из самой лисы и надо отдельное правило, чтобы его отрезать.
Попозже попробую выяснить точно и сообщу о результатах.
Эсли будет find паменяетса на Find, я правыльно понял ?
да, и так тоже.
так я сделал ради красоты, чтобы "искомое" слово выделялось зеленым.
не понял, причём здесь вообще цвет
Отредактировано iDev.Pi (10-03-2012 16:30:03)
mzfx
Отсутствует
Я уже жалею что использовал двойной мидл-клик от него только проблемы.
Зато очень удобно. А если заменить на ПКМ+СКМ?
Сплошные баги. Эх, пойду с горя напьюсь.
Да ладно тебе, какие баги? Так мелкие недоработки. Зато кнопка в целом супер и становится всё лучше. А немного напиться иногда полезно, но лучше этим заняться, когда всё исправишь. Ты нам ещё тверЁзый нужЁн.
Отсутствует