Вот и я о том же. А её расположение сверху крайне неудобно. Добиться хотя бы, чтобы она располагалась над вкладками — как стандартная панель поиска.
Предполагаю, что и тормоза с открытием/закрытием панели связаны с тем, что она всё время сверху.
Отредактировано PEAKTOP (06-04-2014 00:12:23)
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
bunda1, у тебя и панель располагается где положено
А в последней версии кнопки закрытие панели поиска по одиночному ПКМ на панели убрали?
Отредактировано PEAKTOP (06-04-2014 00:59:48)
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
А в последней версии кнопки закрытие панели поиска по одиночному ПКМ на панели убрали?
Что то не помню кнопку закрытия по одиночному ПКМ. Может то была спец версия кнопки сделанная по просьбе трудящихся.
Отсутствует
bunda1, ты прав, это было пожелание одного из форумчан. Добавил у себя этот обработчик в последнюю версию кнопки.
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
bunda1
и да, ещё если фокус в поле ввода, потом нажать ctrl+f - открывается панель поиска и фокус уходит туда, нажать ctrl+f ещё раз и фокус не возвращается к полю вводу. Это печалит, т.к. приходится руку с клавиатуры убирать на мышь, кликать в поле ввода и вести руку обратно к клавиатуре, если я захотел что-то напечатать в поле ввода.
Если после второго нажатия ctrl+f начать просто печатать - то сработает поиск набираемого текста по странице и страница легко может проскроллиться куда-то далеко.
mzfx
Отсутствует
bunda1
Перестал работать код, показывающий количество совпадение при поиске на странице:
var curHit, allHits; const fff = gFindBar._findField, lab = fff.parentNode.insertBefore( document.createElement("label"), fff ), nrm = Ci.nsISelectionController.SELECTION_NORMAL; lab.id = "hits"; addDestructor(function() fff.parentNode.removeChild(lab) ); function updateHits(arg) { if ( gFindBar.hidden ) return; var win = arg instanceof Ci.nsIDOMWindow && arg || content; if ( win == content ) curHit = allHits = 0; var word = fff.value; var controller = gBrowser.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 finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind); finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word); while ((retRange = finder.Find(word, searchRange, startPt, endPt))) { allHits++; if ( !curHit) { var sel = controller.getSelection(nrm), range; if ( sel.toString() ) range = sel.getRangeAt(0); else { var editableNode = gBrowser.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, function(frame) updateHits(frame)); } if ( win != content ) return; lab.value = curHit + "/" + allHits; if ( fff.value ) lastValueOfFind = fff.value; // запомнить // поле текстового ввода красное если ничего не найдено .... allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status"); // поле текстового ввода мигает желтим если достигнут низ/верх страницы .... if ( !!arg && arg == "flash" && allHits > 2 && gFindBar._findStatusDesc.textContent !== '') { fff.setAttribute("flash", true ); setTimeout(function() { fff.removeAttribute("flash") }, 700); } }; updateHits(); // FindBar, поиск колесиком мыши ................................ addEventListener('DOMMouseScroll', function (e) { gFindBar.onFindAgainCommand( e.detail < 0 ); updateHits("flash"); }, false, gFindBar ); // Отслеживать клики на панели поиска ................................ addEventListener("click", function(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") && targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous updateHits("flash"); } }, false, gFindBar );
Ни одна версия кода, которые я смог найти, не работает.
Отсутствует
Перестал работать код, показывающий количество совпадение при поиске на странице:
Без кнопки Toggle Find+3 такой код не будет работать на FF28. Но можно объединить код с кодом открывающем панель поиска и открывать панель поиска кнопкой с кодом тогда работать будет:
// Настройка функций кликов мыши для кнопки ................................ this.onclick = function(e) { // действие при клике ЛКМ .... if ( e.button == 0 ) { gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); }; // действие при клике СКМ .... if ( e.button == 1 ) { gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); goDoCommand("cmd_paste"); }; }; setTimeout(function() { 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(function() fff.parentNode.removeChild(lab) ); function updateHits(arg) { if ( gFindBar.hidden ) return; var win = arg instanceof Ci.nsIDOMWindow && arg || content; if ( win == content ) curHit = allHits = 0; var word = fff.value; var controller = gBrowser.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 finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind); finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word); while ((retRange = finder.Find(word, searchRange, startPt, endPt))) { allHits++; if ( !curHit) { var sel = controller.getSelection(nrm), range; if ( sel.toString() ) range = sel.getRangeAt(0); else { var editableNode = gBrowser.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, function(frame) updateHits(frame)); } if ( win != content ) return; lab.value = curHit + "/" + allHits; if ( fff.value ) lastValueOfFind = fff.value; // запомнить // поле текстового ввода красное если ничего не найдено .... allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status"); }; updateHits(); // FindBar, поиск колесиком мыши ................................ addEventListener('DOMMouseScroll', function (e) { gFindBar.onFindAgainCommand( e.detail < 0 ); updateHits("flash"); }, false, gFindBar ); // Отслеживать клики на панели поиска ................................ addEventListener("click", function(e) { if ( e.button == 1 ) { // поиск из буфера обмена e.preventDefault(); var str = ( gClipboard.read() ).replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста gFindBar._findField.value = str; updateHits(); } var targ = e.originalTarget if ( targ.hasAttribute("anonid") && targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous updateHits("flash"); } }, false, gFindBar ); }, 500);
Отредактировано etoins srldu (23-04-2014 21:18:50)
Отсутствует
etoins srldu
Первое найденное слово нумеруется как последнее, а последнее как первое, т.е. сдвинуто все назад. И еще не удалось прикрутить остатки старого кода:
// Приклеить элемент #FindToolbar к странице( #appcontent ) ................................ delete window.gFindBar; window.gFindBar = document.getElementById("FindToolbar"); if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) { gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser); gFindBar.setAttribute("browserid", "content"); gFindBar.id = "FindToolbar"; gFindBar.clientTop; delete window.gFindBarInitialized; window.gFindBarInitialized = true; gFindBar._selectionMaxLen = 1000; // лимит символов для поиска и aвтовыделение }
Не знаю нужен ли до сих пор этот код:
// Исправить проблему с fastFind для FF25+, автор кода 'Dumby' ................................ Object.defineProperty(gBrowser, "fastFind", { get: function() { if (!this._fastFind) { this._fastFind = Cc["@mozilla.org/typeaheadfind;1"].createInstance(Ci.nsITypeAheadFind); this._fastFind.init(this.docShell); this.CBTFOldDS = this.docShell; } if (this.CBTFOldDS != this.docShell) { this.CBTFOldDS = this.docShell; this._fastFind.setDocShell(this.docShell); } return this._fastFind; }, configurable: true, enumerable: true });
И самый важный кусок кода:
// Ctrl+ f, показать - скрыть панель поиска .... ................................ addEventListener('keydown', function(e) { if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) { e.preventDefault(); e.stopPropagation(); gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); gFindBar._findField.focus(); } }, false, window );
Отсутствует
Не знаю нужен ли до сих пор этот код:
Нет.
Первое найденное слово нумеруется как последнее, а последнее как первое, т.е. сдвинуто все назад. И еще не удалось прикрутить остатки старого кода:
Но тогда вот так:
// Удалить оргинальный панель поиска и создать с дополнительными возможностями, автор кода 'Dumby' ................................ delete window.gFindBar; window.gFindBar = document.getElementById("FindToolbar"); if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) { Array.forEach(gBrowser.tabs, function(tab) { if ( !tab._findBar ) return; tab._findBar.parentNode.removeChild( tab._findBar ); delete tab._findBar; }); gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser); gFindBar.setAttribute("browserid", "content"); gFindBar.id = "FindToolbar"; gFindBar.clientTop; delete window.gFindBarInitialized; window.gFindBarInitialized = true; gFindBar._selectionMaxLen = 1000; // лимит символов для поиска и подсветки }; addEventListener("keypress", gFindBar ); // добавить поиск по мере набора текста // Показать количество совпадений на панели поиска, автор кода '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(function() fff.parentNode.removeChild(lab) ); function updateHits(arg) { if ( gFindBar.hidden ) return; var win = arg instanceof Ci.nsIDOMWindow && arg || content; if ( win == content ) curHit = allHits = 0; var word = fff.value; var controller = gBrowser.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 finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind); finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word); while ((retRange = finder.Find(word, searchRange, startPt, endPt))) { allHits++; if ( !curHit) { var sel = controller.getSelection(nrm), range; if ( sel.toString() ) range = sel.getRangeAt(0); else { var editableNode = gBrowser.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, function(frame) updateHits(frame)); } if ( win != content ) return; lab.value = curHit + "/" + allHits; if ( fff.value ) 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(function() { fff.removeAttribute("flash") }, 700); } lastCurHit = curHit; }; updateHits(); // FindBar, поиск колесиком мыши ................................ addEventListener('DOMMouseScroll', function (e) { gFindBar.onFindAgainCommand( e.detail < 0 ); updateHits("flash"); }, false, gFindBar ); // Отслеживать клики на панели поиска ................................ addEventListener("click", function(e) { if ( e.button == 1 ) { // поиск из буфера обмена e.preventDefault(); var str = ( gClipboard.read() ).replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста gFindBar._findField.value = str; updateHits(); } var targ = e.originalTarget if ( targ.hasAttribute("anonid") && targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous updateHits("flash"); } }, false, gFindBar ); // Ctrl+ f, показать - скрыть панель поиска .... ................................ addEventListener('keydown', function(e) { if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) { e.preventDefault(); e.stopPropagation(); gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); gFindBar._findField.focus(); updateHits(); } }, false, window );
Отсутствует
bunda1 == etoins srldu ?
Да, дело в том что у меня отпуск и я не помню пароль.
Отсутствует
Но тогда вот так:
Все равно какая-то неразбериха с нумерацией результатов. Например на этой странице искал слово "но", было найдено 46 совпадений, первое нумеруется 46/46 нажимаю поиск далее, второе совпадение нумеруется 1/46, нажимаю поиск назад, первое совпадение нумеруется как 2/46, нажимаю еще раз поиск назад, последнее совпадение нумеруется как 1/46 и далее по кругу.
Отсутствует
В FF 24.0.5 ESR наблюдаю задвоенность элемента "Учесть регистр" и неправильное расположение кнопки "Подсветить всё", раньше она располагалась в конце панели.
Использую этот код кнопки - Toggle Find+3 для FF24 - FF26
Отредактировано PEAKTOP (25-04-2014 20:35:22)
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
А можно как-нибудь запретить панели поиска перехватывать нажатие Ctrl +F на вкладках "Библиотека", "Журнал" и т.д.? Использую CB - Открывать библиотеку в вкладке и последнюю активную папку библиотеки. Возникает существенное неудобство — находясь в библиотеке, журнале и т.д. по нажатию Ctrl + F курсор должен переместится в поле поиска по содержимому этого раздела, а вместо этого открывается панель поиска по странице, которая естественно ничего найти не сможет.
Отредактировано PEAKTOP (08-05-2014 03:28:00)
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
А можно как-нибудь запретить панели поиска перехватывать нажатие Ctrl +F на вкладках "Библиотека", "Журнал" и т.д.? Использую CB - Открывать библиотеку в вкладке и последнюю активную папку библиотеки. Возникает существенное неудобство — находясь в библиотеке, журнале и т.д. по нажатию Ctrl + F курсор должен переместится в поле поиска по содержимому этого раздела, а вместо этого открывается панель поиска по странице, которая естественно ничего найти не сможет.
Легко, до субботы сделаю.
Отсутствует
Ждём, надеемся и верим. Забыл упомянуть — что использую этот код кнопки — Toggle Find+3 для FF24 - FF26. В будущих версиях — FF 29 эта возможность тоже пригодится
Отредактировано PEAKTOP (08-05-2014 12:05:11)
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
Ждём, надеемся и верим. Забыл упомянуть — что использую этот код кнопки — Toggle Find+3 для FF24 - FF26. В будущих версиях — FF 29 эта возможность тоже пригодится
Хорошо
Отсутствует
А можно как-нибудь запретить панели поиска перехватывать нажатие Ctrl +F на вкладках "Библиотека", "Журнал" и т.д.? Использую CB - Открывать библиотеку в вкладке и последнюю активную папку библиотеки. Возникает существенное неудобство — находясь в библиотеке, журнале и т.д. по нажатию Ctrl + F курсор должен переместится в поле поиска по содержимому этого раздела, а вместо этого открывается панель поиска по странице, которая естественно ничего найти не сможет.
Вот универсальная Toggle Find+3 для FF17+
Как бы для всех актуальных версий Firefox
Отредактировано bunda1 (13-05-2014 21:33:38)
Отсутствует
bunda1, благодарю за исправленную версию. А можно ещё чуток подправить для FF 24.0.5 — чтобы пункты "Учесть регистр" и "Подсветить всё" располагались псоле кнопок "Далее" и "Назад"?
Чтобы было вот так -
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует
bunda1, благодарю за исправленную версию. А можно ещё чуток подправить для FF 24.0.5 — чтобы пункты "Учесть регистр" и "Подсветить всё" располагались псоле кнопок "Далее" и "Назад"?
Чтобы было вот так - http://i.imgur.com/yCrXcRo.png
У меня на FF24 так и есть, возможно у тебя посторонний стиль или расширение конфликтует.
Отсутствует
bunda1, глобальных стилей у меня нет, стоит только тема оформления - Classic Compact 24.0.2, т.к. последняя не работает с FF 24-й линейки . Да и расширений связанных с "поиском" не наблюдается. Сейчас попробую на чистом профиле + с этой темой оформления.
Добавлено:
На чистом профиле и чистый профиль + тема оформления тоже самое.
Я правда немного подправил оригинальный код — 1. Опустил панель поиска вниз — располагается над панелью дополнений 2. Добавил закрытие панели по клику на ней ПКМ. Подозреваю, что первое изменение может повлиять на расположение элементов на панели, а второе вряд ли.
1. Опустить панель поиска вниз
Заменил:
if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) { Array.forEach(gBrowser.tabs, function(tab) { if ( !tab._findBar ) return; tab._findBar.parentNode.removeChild( tab._findBar ); delete tab._findBar; }); gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
На:
if (!gFindBar) { var addonbar = document.getElementById("addon-bar"); gFindBar = addonbar.parentNode.insertBefore(document.createElement("findbar"), addonbar);
// Настройка функций кликов мыши для кнопки ................................ this.onclick = function(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; // отступ справа у мини панели поиска const alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); const fxVersion = parseInt( Application.version ); if ( fxVersion < 25 ) gFindBar.setAttribute("fxVersion", "17-24"); // Проверить наличие строк в 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(function(pref) { cbu.setPrefs( pref, false ) }); ["FindBar.version,15", "FindBar.CloseTimer,7", "ui.textHighlightBackground,#ef0fff", "FindBar.Highlight.value,"] .forEach(function(pref) { cbu.setPrefs( pref.split(",")[0], pref.split(",")[1] ) }); }; // Подсказка для кнопки ................................ this.onmouseover = function() { // получить и обрезать подсказку для автовыделение .... var val = Application.prefs.getValue("FindBar.Highlight.value", 0); 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: 'accessibility.typeaheadfind', cek:''}, { label: 'Запуск поиска выделением текста', value: 'FindBar.auto_Find', 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(function( 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", function(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", function(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(function(){ 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(function(s) { toggleAttribute( s ) }); // Установить нужную иконку кнопки при старте браузера или при изменениях настроек автовыделения ................................ var s = "FindBar.Highlight"; function toggleImage() { var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon"); 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(function() { gPrefService.removeObserver( s, toggleImage, false ) }); // Удалить оргинальный панель поиска и создать с дополнительными возможностями, автор кода 'Dumby' ................................ delete window.gFindBar; window.gFindBar = document.getElementById("FindToolbar"); window.gFindBar = document.getElementById("FindToolbar"); if (!gFindBar) { var addonbar = document.getElementById("addon-bar"); gFindBar = addonbar.parentNode.insertBefore(document.createElement("findbar"), addonbar); gFindBar.setAttribute("browserid", "content"); gFindBar.id = "FindToolbar"; gFindBar.clientTop; delete window.gFindBarInitialized; window.gFindBarInitialized = true; gFindBar._selectionMaxLen = 1000; // лимит символов для поиска и подсветки }; addEventListener("keypress", gFindBar ); // добавить поиск по мере набора текста // Показать количество совпадений на панели поиска, автор кода '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(function() fff.parentNode.removeChild(lab) ); function updateHits(arg) { if ( gFindBar.hidden ) return; var win = arg instanceof Ci.nsIDOMWindow && arg || content; var finder = (fxVersion > 26 ? 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, function(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(function() { fff.removeAttribute("flash") }, 600); } lastCurHit = curHit; }; updateHits(); // FindBar, поиск колесиком мыши ................................ addEventListener('DOMMouseScroll', function (e) { gFindBar.onFindAgainCommand( e.detail < 0 ); updateHits("flash"); }, false, gFindBar ); // Отслеживать клики на панели поиска ................................ addEventListener("click", function(e) { if ( e.button == 1 ) { // поиск из буфера обмена e.preventDefault(); var str = ( gClipboard.read() ).replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста gFindBar._findField.value = str; Highlight("hits", "greenLight"); } if ( !/toolbarbutton|div/.test( e.originalTarget.localName ) && e.button == 2 ) { gFindBar.close(); return; } var targ = e.originalTarget if ( !targ.hasAttribute("anonid") ) return; if ( targ.value == 'Найти:') { // кнопка 'Найти:' < FF24 e.button ? clearFindField() : gFindBar.onFindAgainCommand(false); updateHits("flash"); } if ( targ.getAttribute('oncommand').startsWith("onFind") ) { // кнопки next, previous setTimeout(updateHits, 0, "flash"); } }, false, gFindBar ); // Двойной клик на панели поиска включает и выключает автовыделение или стандартную подсветку текста ................................ addEventListener("dblclick", function(e) { if ( e.originalTarget.nodeName == 'div' && e.button == 0 ) return; if ( /toolbarbutton|checkbox/.test( e.originalTarget.localName ) ) return; if ( cbu.getPrefs("FindBar.Autohighlight.ToggleWithDoubleClick") ) { var s = cbu.getPrefs("FindBar.Highlight"); cbu.setPrefs("FindBar.Highlight", !s ); menu.childNodes[14].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 textbox = gFindBar.getElement('findbar-textbox'); var inputBox = document.getAnonymousElementByAttribute( textbox, "class", "textbox-input-box"); setTimeout(function() { document.getAnonymousElementByAttribute( inputBox, "anonid", "input-box-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(function() { 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(function(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.originalTarget.localName.toLowerCase() ) ) return; if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection(); if ( e.type == 'mouseup' ) { var selection = getBrowserSelection(); if ( selection && selection !== lastSelection ) { setTimeout(function() { gFindBar.onFindCommand(); updateHits(); if ( lab.value !== '0/0' ) Highlight("", "greenLight"); else Highlight(); }, 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(function() { 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 = function() { removeEventListener('mouseover', closeFind, false, window ) }; } }; // Переключать панель поиска двойным средним кликом на странице ................................ addEventListener("mouseup", function(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(function() { self.flag = false }, 600); // сбросить флаг по таймеру }, false, gBrowser ); // Сочетания клавиш для управление поиском на странице ................................ addEventListener('keydown', function(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"); return; } // 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(); 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"); return; } /* 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(function() { gFindBar._findField.value = val; Highlight("hits", "greenLight"); }, 10) : clearFindField(); return; } // Ctrl+ alt+ h, добавить текст(выделенный / из буфера обмена) для автовыделения .... if ( (e.ctrlKey) && (e.altKey) && (e.keyCode == 72) ) { toggleHighlightValue('add'); return; } }, false, window ); // Автоматически выделить слова и ссылки ................................ function Highlight( hits, green ) { var findValue = gFindBar._findField.value; var hidden = gFindBar.hidden; if ( !hidden ) { // выделить зеленным искомый текст на странице .... if ( !!green && green == "greenLight") setTimeout(function() { gFindBar._find() }, 10); // для запуска подсчета совпадений .... if ( !!hits && hits == "hits" ) setTimeout( updateHits, 20); } // получаем текст для автовыделения из 'about:config' или из панели поиска .... if ( cbu.getPrefs("FindBar.Highlight") ) { var value = hidden ? Application.prefs.getValue("FindBar.Highlight.value", 0) : ( findValue.length > 2 ) ? findValue: ""; } // удалить и запустить подсветку совпадений .... var finder = fxVersion > 26 ? gBrowser.finder : gFindBar; var lighted = finder[fxVersion > 26 ? "_highlight" : "_highlightDoc"].bind( finder ); lighted(false), 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; var links = doc.links; if ( ( hLink || "prop1" in doc ) && links ) { hLink ? doc.prop1 = true : delete doc.prop1; Array.forEach( links, function(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 ); }; // Обработчики следят за переключением табов и запускают автовыделение ................................ addEventListener("TabSelect", function(e) { if ( !gBrowser.mCurrentTab.hasAttribute("busy") ) Highlight("hits"); gFindBar._findField.removeAttribute("style"); gFindBar.getElement('highlight').removeAttribute("checked"); }, false, gBrowser.tabContainer ); var listener = { onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { if ( gBrowser.currentURI.spec == 'chrome://global/content/console.xul') return; if ( aFlag & Ci.nsIWebProgressListener.STATE_STOP ) Highlight("hits"); }}; gBrowser.addProgressListener( listener ); addDestructor(function() { gBrowser.removeProgressListener( listener ) }); // Обработчики следят за панелью поиска, запускают автовыделение и другие функции ................................ addEventListener("drop", function(e) { Highlight("hits", "greenLight") }, false, gFindBar._findField ); addEventListener("input", function() { Highlight("hits", "greenLight") }, false, gFindBar._findField ); gFindBar.watch("hidden", function( prop, oldV, hidden ) { setTimeout(function() { 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; }); // Добавляем подменю в контекстного меню на странице для выделенного текста ................................ (function () { var contextMenu = document.getElementById("contentAreaContextMenu"); var menu = document.createElement("menu"); menu.setAttribute("label", "Find"); contextMenu.insertBefore( menu, document.getElementById("context-sep-properties") ); addEventListener("popupshowing", function() { menu.hidden = !cbu.getPrefs("FindBar.contextFindWords") || !gContextMenu.isTextSelected; }, false, contextMenu ); addDestructor(function() { contextMenu.removeChild( menu ) }); var array = [ { label:"Найти на странице", func: findToContex }, { label:"Выделить текст на странице", func: highlightSel }, { label:"Автовыделение, добавить текст", func: addSel } ]; var menuPopup = menu.appendChild( document.createElement("menupopup") ); array.forEach(function( m ) { var mItem = document.createElement("menuitem"); mItem.setAttribute("label", m.label); mItem.func = m.func; menuPopup.appendChild( mItem ); }); addEventListener("command", function(e) { e.target.func() }, false, menu ); function findToContex() { gFindBar.onFindCommand(); Highlight("hits", "greenLight"); }; function highlightSel() { var finder = fxVersion > 26 ? gBrowser.finder : gFindBar; var lighted = finder[fxVersion > 26 ? "_highlight" : "_highlightDoc"].bind( finder ); lighted(false), lighted(true, getSelect() ); goDoCommand("cmd_selectNone"); }; function addSel() { toggleHighlightValue('add'); }; })(); // Очистить поле текстового ввода на Findbar ................................ function clearFindField() { setTimeout(function() { 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") }; } Application.prefs.setValue("FindBar.Highlight.value", str); alertsService.showAlertNotification( self.image, title, notification, false, "", null, ""); Highlight(); }; // Получить выделенный текст из страницы или из буфера обмена, если нет текста получить 'false' ................................ function getSelect() { var sel = document.commandDispatcher.focusedWindow.getSelection().toString(); // из страницы if ( sel == '' ) { var theBox = document.commandDispatcher.focusedElement; if ( theBox && (theBox.type == "text" || theBox.type == "textarea") ) { var startPos = theBox.selectionStart; var endPos = theBox.selectionEnd; var sel = theBox.value.substring(startPos, endPos); } } if ( sel == '' ) var sel = gClipboard.read(); // из буфера обмена if ( sel == '' ) alertsService.showAlertNotification( self.image, self.label, "Выделите или скопируйте текст!", false, "", null, "" ); return ( sel == '' ) ? false : sel.toString().replace(/^\s+|\s+$/g,""); // убираем пробелы с концов текста }; // Запустить поиск через Toggle Find+3 если нажать в главном меню на пункт меню 'Найти' ................................ addEventListener("command", function(e) { 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(function() { check.parentNode.removeChild( check ) }); check.addEventListener("command", function() { gFindBar._setCaseSensitivity(this.checked); Highlight("hits", "greenLight") }); // Создать кнопку "Поиск" на Findbar ................................ var search = document.createElement("toolbarbutton"); search.setAttribute("id", "findButton"); search.setAttribute("tooltiptext", "Л: Искать следущее \nС: Поиск текста из буфера \nП: Искать предыдущее"); gFindBar.getElement("findbar-container").appendChild( search ); addDestructor(function() { search.parentNode.removeChild( search ) }); search.addEventListener("click", function(e) { if ( 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="); gFindBar.getElement("findbar-container").appendChild( paste ); addDestructor(function() { paste.parentNode.removeChild( paste ) }); paste.addEventListener("click", function(e) { if ( e.button == 0 ) { if ( !getSelect() ) return; gFindBar._findField.value = getSelect(); // вставить текст Highlight("hits", "greenLight"); }; if ( e.button == 2 ) { setTimeout(function() { 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[mini] #hits { -moz-appearance: none !important; margin-top: 3px !important; }\ #FindToolbar > hbox > label { -moz-appearance: none !important; font-weight: bold !important; }\ #FindToolbar .findbar-textbox:not([style]):not([status="notfound"]) { color: black !important; }\ #FindToolbar:not([mini]) #hits { text-align: right; width: 4.1em !important; margin-left: -13px; margin-right: -1px; color: green; }\ \ #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] .findbar-container > checkbox {\ margin-left: -24px !important;\ margin-right: -3px !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;\ }\ /* расположение элементов на панели поиска ....*/\ #FindToolbar:not([mini]) hbox[anonid="findbar-textbox-wrapper"] {\ -moz-box-ordinal-group: 1 !important;\ margin-left: -10px !important;\ }\ #FindToolbar:not([mini]) #pasteButton {\ -moz-box-ordinal-group: 2 !important;\ margin-left: 5px !important;\ margin-right: 15px !important;\ }\ #FindToolbar:not([mini]) #findCheckbox { -moz-box-ordinal-group: 3 !important; }\ #FindToolbar:not([mini]):not([pasteButton]) #findCheckbox { margin-left: 35px !important; }\ #FindToolbar:not([mini]) .findbar-highlight.tabbable { -moz-box-ordinal-group: 4 !important; }\ #FindToolbar:not([mini]) * { -moz-box-ordinal-group: 99 !important; }\ \ #FindToolbar[mini] textbox.findbar-textbox { -moz-box-ordinal-group: 1 !important; }\ #FindToolbar[mini] #findCheckbox { -moz-box-ordinal-group: 2 !important; }\ #FindToolbar[mini] #pasteButton { -moz-box-ordinal-group: 3 !important; }\ #FindToolbar[mini] #findButton { -moz-box-ordinal-group: 4 !important; }\ \ /* не показывать панель поиска на страницах ....*/\ #main-window[title="about:config - Mozilla Firefox"] #appcontent > #FindToolbar,\ #main-window[title="Управление дополнениями - Mozilla Firefox"] #appcontent > #FindToolbar,\ #main-window[title="Bookmarks tab - Mozilla Firefox"] #appcontent > #FindToolbar {\ display: none !important; }\ \ /* кнопки на панели поиска ....*/\ #pasteButton {\ list-style-image: url("chrome://browser/skin/appmenu-icons.png");\ -moz-image-region: rect(0 48px 16px 32px);\ margin-right: 3px !important; }\ #findButton {\ list-style-image: url("chrome://global/skin/icons/Search-glass.png") !important;\ -moz-image-region: rect(0px, 16px, 16px, 0px); }\ ')); const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); addDestructor(function() { sss.unregisterSheet(uri, sss.AGENT_SHEET) });
Отредактировано PEAKTOP (23-05-2014 11:44:12)
1. Приму из добрых рук щедрый дар - инвайт на Хабр и Лепру
2. Бессмысленно осмысливать смысл неосмысленными мыслями!
3. Прежде чем подумать - подумай!
Отсутствует