Полезная информация

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№640107-06-2013 22:52:34

rota
Участник
 
Группа: Members
Зарегистрирован: 07-03-2013
Сообщений: 12
UA: Firefox 21.0

Re: Custom Buttons

Здравствуйте, я мечтаю о такой строке поиска::rolleyes:
SearchButtons1.png
т.е. убрать выбор поисковой системы и добавить кнопки поиска "по картинкам google" и "по картам google"

только я понятия не имею как это сделать. Помогите пожалуйста...

Отсутствует

 

№640207-06-2013 22:57:10

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 21.0

Re: Custom Buttons

rota пишет

Здравствуйте, я мечтаю о такой строке поиска::rolleyes:
http://forum.mozilla-russia.org/uploade … ttons1.png
т.е. убрать выбор поисковой системы и добавить кнопки поиска "по картинкам google" и "по картам google"

только я понятия не имею как это сделать. Помогите пожалуйста...

Quick Search Bar :: Дополнения Firefox

Отсутствует

 

№640307-06-2013 23:16:00

rota
Участник
 
Группа: Members
Зарегистрирован: 07-03-2013
Сообщений: 12
UA: Firefox 21.0

Re: Custom Buttons

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

Отсутствует

 

№640407-06-2013 23:26:14

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 21.0

Re: Custom Buttons

Есть такой кусок кода

Выделить код

Код:

//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container


    gFindBar.__proto__._foundMatches = count;
    
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + ' hits';
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + ' hits';
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + ' hits';
                this._foundMatches.hidden = false;
                
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();

Добавляет количество совпадений в файндбаре, но хотелось бы еще текущий номер совпадения, например "3 из 21". Что добавить?

Отсутствует

 

№640507-06-2013 23:32:33

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 21.0

Re: Custom Buttons

rota пишет

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

Нажать на иконку поиска "по картинкам google" → Ввести запрос →  Enter.

скрытый текст
4622229m.jpg

Отсутствует

 

№640608-06-2013 00:02:27

rota
Участник
 
Группа: Members
Зарегистрирован: 07-03-2013
Сообщений: 12
UA: Firefox 21.0

Re: Custom Buttons

Pony_Smile_Pack пишет
rota пишет

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

Нажать на иконку поиска "по картинкам google" → Ввести запрос →  Enter.

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

Да-да, но это не совсем то. Данное расширение практически не улучшает работу, а в чем-то даже ухудшает вовсе пряча поисковой запрос

Отсутствует

 

№640708-06-2013 00:23:47

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 21.0

Re: Custom Buttons

rota пишет

Да-да, но это не совсем то. Данное расширение практически не улучшает работу, а в чем-то даже ухудшает вовсе пряча поисковой запрос

Нет, он остаётся. Т.е. можно искать сначала "по картинкам google", потом "по картам google" - один и тот же текст

Отсутствует

 

№640808-06-2013 00:56:27

rota
Участник
 
Группа: Members
Зарегистрирован: 07-03-2013
Сообщений: 12
UA: Firefox 21.0

Re: Custom Buttons

Pony_Smile_Pack пишет
rota пишет

Да-да, но это не совсем то. Данное расширение практически не улучшает работу, а в чем-то даже ухудшает вовсе пряча поисковой запрос

Нет, он остаётся. Т.е. можно искать сначала "по картинкам google", потом "по картам google" - один и тот же текст

Понятно, что текст остаётся, но всё же он прячется, что визуально очень неудобно

Отсутствует

 

№640908-06-2013 21:43:27

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 22.0

Re: Custom Buttons

bunda1
Ок, понятно, спасибо.

А возможно ли создать CB, которая, при множестве закладок, открывала бы их в несколько колонок, а не вертикально c прокруткой?

Отсутствует

 

№641008-06-2013 22:24:44

firepox
Участник
 
Группа: Members
Зарегистрирован: 17-11-2011
Сообщений: 358
UA: Firefox 21.0

Re: Custom Buttons

Dumby пишет

Да, неудачно. Может поставь эту

спасибо большое!
работает! :)

Отсутствует

 

№641108-06-2013 23:42:22

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 22.0

Re: Custom Buttons

okkamas_knife пишет

много это сколько?
просто иногда проще сделать вторую кнопку или сделать подменю.

Тут дело даже не в количестве, просто было бы визуально удобней и комфортней иметь 2-3 колонки, наглядней. Что за 2 кнопка и подменю?

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

Отсутствует

 

№641209-06-2013 03:03:41

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 22.0

Re: Custom Buttons

okkamas_knife
Ага, вот оно как, но у меня малость специфически, я добавляю закладки жестом Firegestures, не выбирая папку, а на лету. И это временные закладки, поэтому все в куче. А для закладок есть еще и [CB]Session Bookmarks от Infocatcher-а, но мне не подошло разрываться между несколькими кнопками.

Кстати, вот что пришло в голову, для упрощения кода, можно было бы сделать так: после, например, 30-ой (настраиваемо) закладки, снизу создается папка ">>>1>>>", и в нее попадают остальные закладки, после переполнения, в этой папке создается еще одна ">>>2>>>". А для искомой функциональности нескольких колонок, нужно просто, чтобы папка автоматически раскрывалась при открытии закладок. Правда, возможно, легкость реализации подобного, это очередное мое заблуждение. :)

Отсутствует

 

№641309-06-2013 13:24:47

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

vom пишет

okkamas_knife
Ага, вот оно как, но у меня малость специфически, я добавляю закладки жестом Firegestures, не выбирая папку, а на лету. И это временные закладки, поэтому все в куче.

Можно добавлять в конкретную папку без запроса.

Отсутствует

 

№641409-06-2013 14:02:26

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 24.0

Re: Custom Buttons

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

Отредактировано voqabuhe (09-06-2013 14:02:50)

Отсутствует

 

№641509-06-2013 16:28:55

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 21.0

Re: Custom Buttons

voqabuhe пишет

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

Который?
Есть chrome://mozapps/content/downloads/downloads.xul, about:downloads и раздел в библиотеке.
А открывать вот так:
http://custombuttons.sourceforge.net/fo … f=6&t=1008


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№641609-06-2013 17:04:42

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 24.0

Re: Custom Buttons

Infocatcher пишет

А открывать вот так:
http://custombuttons.sourceforge.net/fo … amp;t=1008

Здорово, спасибо.

Infocatcher пишет

Который?

Да теперь я всё по открываю.:)

Отсутствует

 

№641709-06-2013 17:24:44

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 21.0

Re: Custom Buttons

vom пишет

Кстати, вот что пришло в голову, для упрощения кода, можно было бы сделать так: после, например, 30-ой (настраиваемо) закладки, снизу создается папка ">>>1>>>", и в нее попадают остальные закладки, после переполнения, в этой папке создается еще одна ">>>2>>>". А для искомой функциональности нескольких колонок, нужно просто, чтобы папка автоматически раскрывалась при открытии закладок. Правда, возможно, легкость реализации подобного, это очередное мое заблуждение.

Даа.Это интересная мысль. Самоупаковывающиеся закладки.
Пока технологии до этого дойдут можно приделать скролбар к меню закладок.Для быстрого перемещения по длинной ленте.

стиль
/* =================== scroll */
menupopup, context-menu, menupopup > menu > menupopup,
#BMB_bookmarksPopup .arrowscrollbox-scrollbox
{ -moz-appearance: none !important;
max-height: 1000px !important;
overflow-y: auto !important; }

-------------------------
middlemouse.scrollbarPosition (Логическое) - Настройка поведения скроллбара при щелчке по нему СКМ (Средней кнопки мыши). Значения:
   TRUE - При щелчке СКМ по скроллбару бегунок переходит на то место, куда был произведён щелчок.

Отсутствует

 

№641809-06-2013 18:08:16

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 22.0

Re: Custom Buttons

bunda1
Что-то вроде нескольких кнопок для разных папок?
Pony_Smile_Pack
Ну это как обходной путь. :) насчет скроллбара вчера уже думал, спасибо.

Но вот что нашел на форуме, как всегда от Крошки Ру. :angel: И к удивлению аддон работает, хотя не обновлялся уже два года. Единственный минус, что работает только с меню, а не с ярлыка закладок, может можно поправить и превратить его в Custom Button? :)

https://addons.mozilla.org/en-US/firefo … bookmarks/

Отсутствует

 

№641909-06-2013 18:24:27

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 21.0

Re: Custom Buttons

Отсутствует

 

№642009-06-2013 18:39:27

vom
Участник
 
Группа: Members
Зарегистрирован: 30-08-2011
Сообщений: 155
UA: Firefox 22.0

Re: Custom Buttons

Pony_Smile_Pack
Так просто, правда, опять же, работает только с меню и закладки идут не подряд и не влезающие переносятся, а слева - справа. Но уже прогресс. :)

Отсутствует

 

№642109-06-2013 22:28:59

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

vom пишет

bunda1
Что-то вроде нескольких кнопок для разных папок?

Да Quick bookmarks( Firefox 3.6 + ), но можно и жестом мыши.
Сам я использую:

Выделить код

Код:

// Двойным левым кликом на папке закладок добавлять закладку в папку закладок ...................................
addEventListener("dblclick", function(e) {      
   var target = e.originalTarget;
              
   if ( e.button !== 0 || !target._placesNode || !PlacesUtils.nodeIsFolder( target._placesNode ) ) return;          
        var docTitle = ( content.document.title || gBrowser.mCurrentTab.label).substr(0, 50);
        var folderId = PlacesUtils.getConcreteItemId( target._placesNode );
        Cu.import("resource://gre/modules/PlacesUtils.jsm");
        var currentURI = Services.io.newURI(content.location, null, null);
          
        let callback = {
            runBatched: function() {
               PlacesUtils.bookmarks.insertBookmark( folderId, currentURI, Ci.nsINavBookmarksService.DEFAULT_INDEX, docTitle );
            }
        }
        PlacesUtils.bookmarks.runInBatchMode(callback, null);

        // всплывающая подсказка ....
        document.getElementById("identity-box").setAttribute("style", "background: yellow;");
        var folderTitle = PlacesUtils.bookmarks.getItemTitle( folderId );
        var favicon = ( !!gBrowser.mCurrentTab.image )? gBrowser.mCurrentTab.image: "chrome://global/skin/icons/Portrait.png";
        alertsService.showAlertNotification( favicon, "Добавил в папку " + folderTitle + ":", docTitle, false, "", null, ""); 
}, false, window );

Отредактировано bunda1 (09-06-2013 22:31:34)

Отсутствует

 

№642210-06-2013 00:19:32

SendInfo
.
 
Группа: Members
Зарегистрирован: 14-02-2011
Сообщений: 271
UA: unknown 0.0

Re: Custom Buttons

Pony_Smile_Pack пишет
vom пишет

Кстати, вот что пришло в голову, для упрощения кода, можно было бы сделать так: после, например, 30-ой (настраиваемо) закладки, снизу создается папка ">>>1>>>", и в нее попадают остальные закладки, после переполнения, в этой папке создается еще одна ">>>2>>>". А для искомой функциональности нескольких колонок, нужно просто, чтобы папка автоматически раскрывалась при открытии закладок. Правда, возможно, легкость реализации подобного, это очередное мое заблуждение.

Даа.Это интересная мысль. Самоупаковывающиеся закладки.Пока технологии до этого дойдут можно приделать скролбар к меню закладок.Для быстрого перемещения по длинной ленте.

стиль
/* =================== scroll */
menupopup, context-menu, menupopup > menu > menupopup,#BMB_bookmarksPopup .arrowscrollbox-scrollbox{ -moz-appearance: none !important;max-height: 1000px !important;overflow-y: auto !important; }
-------------------------
middlemouse.scrollbarPosition (Логическое) - Настройка поведения скроллбара при щелчке по нему СКМ (Средней кнопки мыши). Значения:   TRUE - При щелчке СКМ по скроллбару бегунок переходит на то место, куда был произведён щелчок.

Собственно так делает Opera(Presto) хто знает с какой версии. Только все вложенные - автосозданные папки имеют название "Далее" и ничего пользователю для такого поведения настраивать не надо. Длина каждой папки не превышает высоту монитора т.е. прокрутка не требуется. Фантастика, да ?

Отсутствует

 

№642310-06-2013 00:27:26

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 21.0

Re: Custom Buttons

SendInfo пишет

Фантастика, да ?

Я имел ввиду что это здорово.
Но вот посмотрел допустим на эти несколько колонок закладок - они не очень удобны. Так и эффект от этих папок в папке неоднозначен.

Отсутствует

 

№642410-06-2013 00:53:10

SendInfo
.
 
Группа: Members
Зарегистрирован: 14-02-2011
Сообщений: 271
UA: unknown 0.0

Re: Custom Buttons

Pony_Smile_Pack пишет

SendInfo пишет: Фантастика, да ?Я имел ввиду что это здорово.Но вот посмотрел допустим на эти несколько колонок закладок - они не очень удобны. Так и эффект от этих папок в папке неоднозначен.

Если смотрелись  https://addons.mozilla.org/en-US/firefo … bookmarks/,http://userstyles.org/styles/81419/column-bookmarks, то это убожество не следует даже сравнивать с оперной фичей. Все умолкаю - о своем, о грустном.

Отсутствует

 

№642511-06-2013 17:43:18

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2244
UA: Firefox 10.0

Re: Custom Buttons

Kamui пишет

Есть такой кусок кода

Код:

Выделить код

Код:

//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container


    gFindBar.__proto__._foundMatches = count;
    
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            var matchesCount = this._countMatches(word).toString();
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + ' hits';
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + ' hits';
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = matchesCount + ' hits';
                this._foundMatches.hidden = false;
                
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
            startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
        }

        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();


Добавляет количество совпадений в файндбаре, но хотелось бы еще текущий номер совпадения, например "3 из 21". Что добавить?

Вот, вроде показывает

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

Выделить код

Код:

//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container


    gFindBar.__proto__._foundMatches = count;
    
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            this.framesRanges = [];
            var matchesCount = this._countMatches(word).toString();
            var res = null;
            var win = this._currentWindow;
            if (win) {
                var eEl = this._foundEditable;
                var sel = eEl ? eEl.QueryInterface(Ci.nsIDOMNSEditableElement).editor.selection : win.getSelection();
                var range = sel.getRangeAt(0);
                this.framesRanges.unshift(this.framesRanges.pop());
                var ranges = Array.concat.apply(null, this.framesRanges);
                for (var i = 0, l = ranges.length; i < l; i++) {
                    var rng = ranges[i];
                    if (rng.endContainer.ownerDocument.defaultView != win) continue;
                    var comp = ["startContainer", "endContainer", "startOffset", "endOffset"].every(function(prop) range[prop] == rng[prop]);
                    if (comp) { res = i + 1; break; }
                }
            }
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + ' hits';
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + ' hits';
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = (res ? res + " из " : "") + matchesCount + ' hits';
                this._foundMatches.hidden = false;
                
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

    var ranges = [];
        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
//          startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
            startPt.setStart(retRange.endContainer, retRange.endOffset);
            ranges.push(retRange);
        }
        if (ranges.length) this.framesRanges.push(ranges);
        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]