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

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№132628-05-2016 13:12:49

rbfyec
Участник
 
Группа: Members
Зарегистрирован: 07-07-2012
Сообщений: 365
UA: Firefox 29.0

Re: Обсуждение кнопок CB

У меня в браузере создаётся на веб-страницах див с моим текстом. Можно ли сделать, чтобы размер текста в этом диве
не менялся, если я меняю шрифт на самой странице?

Шрифт на странице я меняю СВ кнопкой "Zoom", если это имеет значение.

Отсутствует

 

№132730-05-2016 06:02:10

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 49.0

Re: Обсуждение кнопок CB

Dumby
Я пытаюсь присобачить PasteButtonsForStylish к редактору Custom Buttons (уж больно там удобнее реализовано добавление всяких кнопок, менюшек и т.д., в отличии от старой версии CustomPaste for CustomButtons, что в готовых кнопках) и, в общем-то, все получилось, за исключением главного - вставки шаблонов в редактор.
На ReferenceError: insertCodeAtCaret is not defined в

Выделить код

Код:

else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) {
                            insertCodeAtCaret(trg.value);
                            codeElementWrapper.focus();
                        }

моя фантазия зашла в тупик. Это что-то из самого Stylish'а?

Можно тебя попросить о помощи? shuffle.gif

Отсутствует

 

№132830-05-2016 19:45:54

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

Re: Обсуждение кнопок CB

turbot пишет

Это что-то из самого Stylish'а?

Да, insertCodeAtCaret это из самого́ Stylish'а.

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

turbot пишет

Можно тебя попросить о помощи? shuffle.gif

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

И почему бы не уточнить что-нибудь про тот CB-редактор,
который ты используешь, ну типа классика или красава,
или подкинуть каких-нибудь иных всяких прочих подробностей.

Может попробуй так :/

Выделить код

Код:

else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) {

                            var controller = commandDispatcher.getControllerForCommand("cmd_insertText");
                            if (!controller || !controller.isCommandEnabled("cmd_insertText")) return;

                            controller.QueryInterface(Ci.nsICommandController);
                            var params = Cc["@mozilla.org/embedcomp/command-params;1"].createInstance(Ci.nsICommandParams);
                            params.setStringValue("state_data", trg.value);
                            controller.doCommandWithParams("cmd_insertText", params);

                            // Select
                            var se = activeElement.parentNode.__sourceEditor;
                            if (se) {
                                var endPosition = se.getOffset(se.getCursor("end"));
                                se.setSelection(se.getPosition(endPosition - trg.value.length), se.getPosition(endPosition));
                            }
                            else
                                activeElement.selectionStart = activeElement.selectionEnd - trg.value.length;
                        }

Отсутствует

 

№132930-05-2016 20:06:25

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Google 2.1

Re: Обсуждение кнопок CB

Dumby пишет

или подкинуть каких-нибудь иных всяких прочих подробностей.

Э, не подумал. Собственно, окромя элемента, за который цепляться будет и адреса окна, ничего и не менял. Редактор - да, использую тот что "красава". :)

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

Выделить код

Код:

gBrowser.currentURI.spec == "about:customizing" || (() => {
    var obsId = "CB" + _id.slice(20) + "_PasteButtonsForCB";
    var storageId = obsId + "Storage";
    var help = self.Help;
//    ----------------------------------- Storage ----------------------------------
    
    // Simple replacement for Application.storage
    // See https://github.com/Infocatcher/Custom_Buttons/commit/14d4c33bee20528da14793d3b4a3773a8a34d048
    
    var storage = (function() {
        var global = Cu.import("resource://gre/modules/Services.jsm", {});
        var ns = storageId;
        var storage = global[ns] || (global[ns] = global.Object.create(null));
        return {
            get: function(key, defaultVal) {
                if(key in storage)
                    return storage[key];
                return defaultVal;
            },
            set: function(key, val) {
                if(key === null)
                    delete storage[key];
                else
                    storage[key] = val;
            }
        };
    })();

//    ------------------------------------------------------------------------------

    var obs = storage.get(obsId, null);
    if (!obs) {
        obs = {
            id: obsId,
            boxId: obsId + "_Box",
            brURL: location.href,
            topic: "document-shown",
            init: function() {
                this.proceedAll(true);
                Services.obs.addObserver(this, this.topic, false);
            },
            destroy: function() {
                this.proceedAll(false);
                try {Services.obs.removeObserver(this, this.topic);}
                catch(ex) {Cu.reportError(ex);}
            },

//            ----------------------------------- OBS ----------------------------------

            observe: function(doc) {this.proceedDoc(doc, true)},
            isCBDoc(doc) {
                return doc.location && doc.location.href.startsWith("chrome://custombuttons/content/editor.xul")
            },
            isBrowserDoc(doc) {
                return doc.location && doc.location.href == this.brURL
            },
            proceedAll(init) {
                var en = Services.wm.getEnumerator(null);
                while(en.hasMoreElements()) {
                    var doc = en.getNext().document;
                    if (this.isBrowserDoc(doc)) {
                        for(var br of doc.defaultView.gBrowser.browsers) {
                            this.proceedDoc(br.contentDocument, init);
                        }
                        var sidebarDoc = doc.getElementById("sidebar").contentDocument;
                        this.proceedDoc(sidebarDoc, init);
                        var wpb = sidebarDoc.getElementById("web-panels-browser");
                        wpb && this.proceedDoc(wpb.contentDocument, init);
                    } 
                    else
                        this.proceedDoc(doc, init);
                }
            },
            proceedDoc(doc, add) {
                if (!this.isCBDoc(doc) || doc.readyState != "complete") return;
                var box = doc.getElementById(this.boxId);
                if (add && !box) {
                    var tabbox = doc.getElementById("custombuttons-editbutton-tabbox");
                    var before = tabbox.getElementsByTagName("tabs")[0];
                    this.addBox(before);
                } else if (!add && box) {
                    box && box.remove();
                }
            },

//            --------------------------------------------- BOX --------------------------------------------

            get box() {
                delete this.box;
                return this.box = this.createBox();
            },
            createBox() {
                var box = this.insertElement("hbox", null, {
                    id: this.boxId,
                    onclick: `
                        if (event.button != 2) return;
                        var popup = this.linkedPopup;
                        if (popup.state != "closed") popup.hidePopup();
                        popup.linkedTarget = event.originalTarget;
                        popup.openPopupAtScreen(event.screenX, event.screenY);
                    `,
                    oncommand: `
                        event.stopPropagation();
                        var trg = event.originalTarget;
                        if (trg.nodeName == "toolbarbutton")
                            trg.firstChild.openPopup(trg);
                        else if (trg.nodeName == "menuitem" && trg.hasAttribute("value")) {

                            var controller = commandDispatcher.getControllerForCommand("cmd_insertText");
                            if (!controller || !controller.isCommandEnabled("cmd_insertText")) return;
                            
                            controller.QueryInterface(Ci.nsICommandController);
                            var params = Cc["@mozilla.org/embedcomp/command-params;1"].createInstance(Ci.nsICommandParams);
                            params.setStringValue("state_data", trg.value);
                            controller.doCommandWithParams("cmd_insertText", params);

                            // Select
                            var se = activeElement.parentNode.__sourceEditor;
                            if (se) {
                                var endPosition = se.getOffset(se.getCursor("end"));
                  se.setSelection(se.getPosition(endPosition - trg.value.length), se.getPosition(endPosition));
                            }
                            else
                                activeElement.selectionStart = activeElement.selectionEnd - trg.value.length;
                        }
                    `
                });
                return box;
            },
            get boxContent() {
                delete this.boxContent;
                return this.boxContent = help.trim();
            },
            addBox(before) {
                var box = before.appendChild(this.box.cloneNode(false));
                box.innerHTML = this.boxContent;
                box.linkedPopup = box.appendChild(this.popup.cloneNode(true));
                box.linkedPopup.creator = this;
                box.style.cssText = "max-height: 32px !important; max-width: 320px !important;";
            },

//            ------------------------------------------- CONTEXT ------------------------------------------

            popupXUL: `
                <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                    id="${obsId + "_Context"}"
                    oncommand="event.stopPropagation(); creator.cmdDispatcher(event);"
                    onpopupshowing="creator.contextPopupshowing(this);">
                    <menuitem label="Изменить" value="openEditor"/>
                    <menuseparator/>
                    <menuitem label="Выше" value="moveUp"/>
                    <menuitem label="Ниже" value="moveDown"/>
                    <menuseparator/>
                    <menuitem label="Копировать" value="copyItem" closemenu="none"/>
                    <menuitem label="Вставить" value="pasteItem"/>
                    <menuitem label="Удалить" value="deleteItem"/>
                    <menuseparator/>
                    <menuitem label="Новый menuitem" value="newMenuitem"/>
                    <menuitem label="Новoe menu" value="newMenu"/>
                    <menuitem label="Новый toolbarbutton" value="newButton"/>
                    <menuitem label="Новый menuseparator" value="newSeparator"/>
                    <menuseparator/>
                    <menuitem label="Картинка base64" value="imgBase64"/>
                </menupopup>
            `,
            get popup() {
                delete this.popup;
                return this.popup = this.createPopup();
            },
            createPopup() {
                var xul = this.popupXUL.trim().replace(/>\s+</g, "><");
                var popup = new DOMParser().parseFromString(xul, "application/xml").documentElement;
                popup.creator = this;
                return popup;
            },
            cmdDispatcher(e) {
                var trg = e.originalTarget, popup = trg.parentNode, cmd = trg.value;
                if (!cmd) return;
                var popupNode = popup.linkedTarget;
                cmd.startsWith("new")
                    ? this.newItem(popupNode, cmd.slice(3))
                    : this[cmd](popupNode, popup);
                "copyItem openEditor imgBase64".includes(cmd) || this.save(popupNode);
            },
            get emptySeparator() {
                delete this.emptySeparator;
                return this.emptySeparator = this.insertElement("menuseparator");
            },
            get emptyMenuitem() {
                delete this.emptyMenuitem;
                return this.emptyMenuitem = this.insertElement("menuitem", null, {label: "menuitem", value: ""});
            },
            get emptyMenupopup() {
                delete this.emptyMenupopup;
                var popup = this.insertElement("menupopup");
                popup.appendChild(this.emptyMenuitem.cloneNode(false));
                return this.emptyMenupopup = popup;
            },
            get emptyMenu() {
                delete this.emptyMenu;
                var menu = this.insertElement("menu", null, {label: "menu"});
                menu.appendChild(this.emptyMenupopup.cloneNode(true));
                return this.emptyMenu = menu;
            },
            get emptyButton() {
                delete this.emptyButton;
                var btn = this.insertElement("toolbarbutton", null, {
                    image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA////////////////////////////////////////////////////////////////////////////AAAA/wAAAP//////AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAA//////8AAAD/AAAA//////8AAAD//////wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAP//////AAAA/wAAAP//////AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA//////8AAAD//////wAAAP8AAAD//////wAAAP//////////////////////////////////////////////////////AAAA//////8AAAD/AAAA//////8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP//////AAAA/wAAAP///////////////////////////////////////////////////////////////////////////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AACsQQAArEEAAKxBAACsQQAArEEH4KxBB+CsQQfgrEEH4KxBB+CsQQfgrEEAAKxBAACsQQAArEEAAKxBAACsQQ=="
                });
                btn.appendChild(this.emptyMenupopup.cloneNode(true));
                return this.emptyButton = btn;
            },
            newItem(node, name) {
                var newItem = this["empty" + name].cloneNode(true);
                node.parentNode.insertBefore(newItem, node.nextSibling);
                if (name == "Button") newItem.firstChild.setAttribute("position", "after_start");
            },
            deleteItem(node) {
                var win = this.top(node);
                if (!win.confirm("Удалить ?")) return;
                node.remove();
            },
            moveUp(node) {
                node.parentNode.insertBefore(node, node.previousSibling);
            },
            moveDown(node) {
                node.parentNode.insertBefore(node, node.nextSibling.nextSibling);
            },
            copyItem(node, popup) {
                this.transactionNode = node.cloneNode(true);
                popup.querySelector('menuitem[value="pasteItem"]').disabled = false;
            },
            pasteItem(node) {
                node.parentNode.insertBefore(this.transactionNode, node);
            },
            imgBase64(node) {
                var obs = this;
                var picker = makeFilePicker();
                picker.appendFilters(picker.filterImages);
                picker.init(this.top(node), "Изображение", picker.modeOpen);
                picker.open({done: function(result) {
                    if (result != picker.returnOK) return;
                    var reader = new FileReader();
                    reader.onload = function() {
                        if (!reader.result) return;
                        var name = node.nodeName;
                        "menuitem".includes(name) && node.classList.add(name + "-iconic");
                        node.setAttribute("image", reader.result);
                        obs.save(node);
                    }
                    reader.readAsDataURL(new File(picker.file));
                }});
            },
            disablers: {
                moveUp(node) {return !node.previousSibling},
                moveDown(node) {return !node.nextSibling || node.nextSibling.nodeName == "menupopup"},
                deleteItem(node) {
                    var count = node.parentNode.childElementCount;
                    return count == 1 || (node.nodeName == "toolbarbutton" && count == 2);
                },
                top(node) {return "toolbarbutton hbox".includes(node.nodeName);},
                newMenuitem(node) {return this.top(node);},
                newMenu(node) {return this.top(node);},
                newSeparator(node) {return this.top(node);},
                newButton(node) {return !this.top(node);},
                copyItem(node) {return node.nodeName == "hbox";},
                pasteItem() {return !("transactionNode" in this.obs);},
                imgBase64(node) {return !"toolbarbutton menu menuitem".includes(node.nodeName);}
            },
            contextPopupshowing(popup) {
                this.disablers.obs = this;
                var node = popup.linkedTarget;
                for(var key in this.disablers) {
                    var menuitem = popup.querySelector(`menuitem[value="${key}"]`);
                    if (menuitem) menuitem.disabled = this.disablers[key](node) || node.nodeName == "menupopup";
                }
                popup.querySelector('menuitem[value="openEditor"]').disabled = node.nodeName == "hbox";
            },

//            ----------------------------------------------- EDITOR ----------------------------------------------

            editorXUL: `
                <?xml version="1.0"?>
                <?xml-stylesheet href="chrome://global/skin/"?>
                <?xml-stylesheet href="chrome://custombuttons/content/codeeditor.css" type="text/css"?>
                <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
                    title="Изменить"
                    onload="obs = Components.utils.import('resource://gre/modules/Services.jsm')['${storageId}']['${obsId}']; obs.initEditor(window);"
                    ondialogaccept="obs.setAttributes(window);"
                    buttons="extra2,accept,cancel"
                    buttonlabelextra2="Удалить атрибут"
                    ondialogextra2="obs.deleteAttribute(window);">
                    <hbox align="center">
                        <label value="Новый атрибут"/>
                        <textbox flex="1" multiline="false" onkeydown="obs.onTexboxKeydown(event);"/>
                        <button label="Добавить" oncommand="obs.newAttribute(window, textbox.value);"/>
                    </hbox>
                    <tabbox flex="1">
                        <tabs/>
                        <tabpanels flex="1"/>
                    </tabbox>
                </dialog>
            `,
            get editorURL() {
                delete this.editorURL;
                var xul = this.editorXUL.trim();
                return this.editorURL = "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(xul);
            },
            openEditor(node) {
                this.node = node; this.elm = this.insertElement("box");
                Services.ww.openWindow(this.top(node), this.editorURL, "",
                    "chrome,modal,resizable,centerscreen,width=700,height=500"
                , null);
            },
            initEditor(win) {
                for(var str of ["tabs", "tabpanels", "textbox"]) {
                    win[str] = win.document.querySelector(str);
                }
                for(var {name, value} of this.node.attributes) {
                    var isVal = name == "value";
                    var tab = this.addTab(win, name, value, isVal);
                    if (isVal) tab.style.cssText = "font-weight: bold; color: navy;";
                }
                if (win.tabs.selectedIndex == -1) win.tabs.selectedIndex = 0;
            },
            addTab(win, name, value, sel) {
                var tab = this.insertElement("tab", win.tabs, {label: name});
                tab.linkedCbeditor = this.insertElement("cbeditor", win.tabpanels, {
                    class: "custombuttons-editor-codeBox",
                    multiline: "true",
                    flex: "1",
                    value: value
                });
                if (sel) {
                    win.tabs.selectedItem = tab;
                    tab.linkedCbeditor.focus();
                }
                return tab;
            },
            newAttribute(win, name) {
                name && this.addTab(win, name, "", true);
                win.textbox.value = "";
            },
            onTexboxKeydown(e) {
                if (e.keyCode == e.DOM_VK_RETURN) {
                    e.preventDefault();
                    this.newAttribute(e.target.ownerGlobal, e.target.value);
                } else try {
                    var attr = e.target.value + e.key;
                    this.elm.setAttribute(attr, true);
                    this.elm.removeAttribute(attr);
                } catch(ex) {
                    e.preventDefault();
                }
            },
            setAttributes(win) {
                for(var tab of win.tabs.childNodes) {
                    var val = tab.linkedCbeditor.value;
                    this.node.setAttribute(tab.label, val);
                }
                this.save();
            },
            deleteAttribute(win) {
                var tab = win.tabs.selectedItem;
                var attr = tab.label;
                if (!win.confirm("Удалить атрибут " + attr + " ?")) return;
                this.node.removeAttribute(tab.label);
                tab.linkedCbeditor.remove(); tab.remove();
                win.tabs.selectedIndex = 0;
            },
            save(node = this.node) {
                var box = node.ownerDocument.getElementById(this.boxId);
                if (!box) return;
                box.removeChild(box.linkedPopup);
                var xul = box.innerHTML.replace(/\t/g, "&#x9;").replace(/\n/g, "&#xA;").replace(/\r/g, "&#xD;");
                var link = custombuttons.makeButtonLink("edit", _id);
                var param = custombuttons.cbService.getButtonParameters(link);
                param = param.wrappedJSObject || param;
                param.help = xul;
                custombuttons.cbService.installButton(param);    
            },

//            ----------------------------------------------- MISC ------------------------------------------

            insertElement(element, parent, attributes, before = null) {
                var notExist = typeof element != "object";
                if (notExist) element = document.createElement(element);
                if (notExist && attributes) {
                    for(var attribute in attributes) {
                        attribute == "data" || element.setAttribute(attribute, attributes[attribute]);
                    }
                }
                parent && parent.insertBefore(element, before);
                return element;
            },
            top(node) {
                var win = node.ownerGlobal;
                if (!(win instanceof ChromeWindow))
                    win = Services.wm.getMostRecentWindow("navigator:browser");
                return win;
            }
        };
        storage.set(obsId, obs);
        obs.init();
    }
    function destructor(reason) {
        if (reason[5] != "e") return;
        var obs = storage.get(obsId, null);
        if (obs) {
            obs.destroy();
            storage.set(obsId, null);
        }
    }
    addDestructor(reason => {
        destructor(reason);
        setTimeout(function() {
            custombuttons.palette.querySelector('toolbarbutton[id="' + _id + '"]') && destructor("delete");
        }, 500);
    });
})();


Это уже с "попробуй". Спасибо, все работает. :beer:

Добавлено 30-05-2016 20:26:41
Раз уж пошла такая пьянка, помучаю тогда Infocatcher'а насчет "красавы". :)

Infocatcher
А можно ли приделать к CB_Source_Editor автодополнение во вкладках с кодом, как во вкладке "помощь" для стилей, и как это сделано у консоли браузера, вместо того, что сейчас, по Ctrl + Space?

Отредактировано turbot (30-05-2016 20:26:41)

Отсутствует

 

№133031-05-2016 17:36:21

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Firefox 29.0

Re: Обсуждение кнопок CB

Если мне надо заменить в строке все вхождения подстроки через регулярку, как будет быстрее работать
так

Выделить код

Код:

string.replace(/re/g, 'abc')

или так

Выделить код

Код:

string.split(/re/).join('abc')

Отсутствует

 

№133131-05-2016 20:01:01

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

Re: Обсуждение кнопок CB

toxa пишет

как будет быстрее работать

У меня так алертится разница примерно раза в три-четыре

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

Выделить код

Код:

var string = "Preference", num = 200000, str;

var now = Date.now();
for(let n = num; n; n--) str = string.replace(/re/g, 'abc');
var delta1 = Date.now() - now;

now = Date.now();
for(let n = num; n; n--) str = string.split(/re/).join('abc');
var delta2 = Date.now() - now;

var res = delta1/delta2, factor = (res < 1 ? 1/res : res).toFixed(2);
alert(
    "string.replace(/re/g, 'abc')\t" + delta1
    + "\n" +
    "string.split(/re/).join('abc')\t" + delta2
    + "\n" +
    "factor\t" + factor
);

Отсутствует

 

№133231-05-2016 21:15:34

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Firefox 29.0

Re: Обсуждение кнопок CB

Dumby пишет
toxa пишет

как будет быстрее работать

У меня так алертится разница примерно раза в три-четыре

Ясно. Спасибо большое!

Отсутствует

 

№133301-06-2016 18:14:04

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 45.0

Re: Обсуждение кнопок CB

del. не туда:)
https://forum.mozilla-russia.org/viewto … 29#p716429

Отредактировано Stakhovsky (01-06-2016 18:30:22)

Отсутствует

 

№133401-06-2016 21:39:05

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 31.0

Re: Обсуждение кнопок CB

Подскажите, что я неправильно делаю?

Выделить код

Код:

var string = '&quot; &quot;';
alert(decodeURIComponent(string))

Алерт показывает мне те же самые символы.
Хотя по идее функция decodeURIComponent должна бы превратить их в  "

Отредактировано beggrr (01-06-2016 21:43:15)

Отсутствует

 

№133501-06-2016 22:26:12

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 49.0

Re: Обсуждение кнопок CB

beggrr
"" - это %22%22. А &quot; - это html спецсимволы. Их, вроде, только регуляркой заменять.

Отсутствует

 

№133601-06-2016 22:49:06

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 31.0

Re: Обсуждение кнопок CB

turbot пишет

beggrr
"" - это %22%22. А &quot; - это html спецсимволы. Их, вроде, только регуляркой заменять.

А почему он-лайновый декодер http://pressbin.com/tools/urlencode_urldecode/  заменяет эти спецсимволы через decodeURIComponent() и decodeURI() и unescape()

Отсутствует

 

№133701-06-2016 23:40:11

rbfyec
Участник
 
Группа: Members
Зарегистрирован: 07-07-2012
Сообщений: 365
UA: Firefox 29.0

Re: Обсуждение кнопок CB

turbot пишет

beggrr
"" - это %22%22. А &quot; - это html спецсимволы. Их, вроде, только регуляркой заменять.

Я вот нашёл в Интернете интересное решение.

Выделить код

Код:

var string = '&quot; &quot;';
var textarea = document.createElement('textarea');
textarea.innerHTML = string;

alert(textarea.value)

Только непонятно, эту textarea надо потом удалять? Как?
А если не удалять, то она будет висеть в памяти? А если этих textarea будет несколько, они все будут занимать память?

Отсутствует

 

№133801-06-2016 23:44:32

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 49.0

Re: Обсуждение кнопок CB

rbfyec пишет

Я вот нашёл в Интернете интересное решение.

Ну так там у beggrr по ссылке так и сделано:

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

Выделить код

Код:

function encode(text) {
   if (document.getElementById('which_urlencode').checked == true) {
      document.getElementById('escape').innerHTML = escape(text);
      document.getElementById('encodeURI').innerHTML = encodeURI(text);
      document.getElementById('encodeURIComponent').innerHTML = encodeURIComponent(text);
      document.getElementById('urlencode').innerHTML = urlencode(text);
   }
   else {
      document.getElementById('unescape').innerHTML = unescape(text);
      document.getElementById('decodeURI').innerHTML = decodeURI(text);
      document.getElementById('decodeURIComponent').innerHTML = decodeURIComponent(text);
      document.getElementById('urldecode').innerHTML = urldecode(text);   
   }
}


Видимо, дело в innerHTML. А уж почему, не знаю. Сам чайник. :)

Отсутствует

 

№133902-06-2016 13:18:29

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

Re: Обсуждение кнопок CB

rbfyec пишет

Только непонятно, эту textarea надо потом удалять? Как?
А если не удалять, то она будет висеть в памяти? А если этих textarea будет несколько, они все будут занимать память?

Там textarea не вставляется в документ (через appendChild/insertBefore), поэтому ее удалит сборщик мусора, когда выполнение кода выйдет из функции, в которой есть ссылка на textarea. Если, конечно, не передать каким-нибудь образом ссылку вовне.


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

Отсутствует

 

№134003-06-2016 01:14:35

rbfyec
Участник
 
Группа: Members
Зарегистрирован: 07-07-2012
Сообщений: 365
UA: Firefox 29.0

Re: Обсуждение кнопок CB

Infocatcher пишет

Там textarea не вставляется в документ (через appendChild/insertBefore), поэтому ее удалит сборщик мусора, когда выполнение кода выйдет из функции, в которой есть ссылка на textarea. Если, конечно, не передать каким-нибудь образом ссылку вовне.

А как можно потом проверить, поудалялись ли эти textarea?

Отсутствует

 

№134103-06-2016 23:27:31

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

Re: Обсуждение кнопок CB

rbfyec
Никак не проверить. :D
Чтобы проверить, нужна ссылка, а пока есть ссылка – ничего не удалится.
Если есть опасения, что создаются в той же области видимости функции и что осядет в замыкании – можно принудительно сделать

Выделить код

Код:

textarea = null;

Если делать расширение, можно в about:memory смотреть, там по адресу скрипта видно будет, если что-то в памяти осталось после выключения.


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

Отсутствует

 

№134205-06-2016 09:44:00

rbfyec
Участник
 
Группа: Members
Зарегистрирован: 07-07-2012
Сообщений: 365
UA: Firefox 29.0

Re: Обсуждение кнопок CB

Infocatcher
Спасибо :)

Отсутствует

 

№134307-06-2016 07:44:34

oleg.sgh
Участник
 
Группа: Members
Зарегистрирован: 19-04-2014
Сообщений: 3157
UA: Firefox 46.0

Re: Обсуждение кнопок CB

В [firefox] 47.0/win64 сломались кнопки:
Zoom
Menuitem hider
Почините,  пожалуйста...если возможно.

[CB]Изменить масштаб тоже перестает работать после перезапуска [firefox]

Отредактировано oleg.sgh (07-06-2016 12:33:48)

Отсутствует

 

№134407-06-2016 20:49:25

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

Re: Обсуждение кнопок CB

oleg.sgh пишет

В [firefox] 47.0/win64 сломались кнопки:

Zoom
Menuitem hider
Изменить масштаб

Отсутствует

 

№134507-06-2016 21:01:24

bezuma
Участник
 
Группа: Members
Откуда: Москва
Зарегистрирован: 26-01-2014
Сообщений: 256
UA: Firefox 47.0

Re: Обсуждение кнопок CB

bunda1 Спасибо! Заработала Menuitem hider :)

Отсутствует

 

№134607-06-2016 21:06:35

oleg.sgh
Участник
 
Группа: Members
Зарегистрирован: 19-04-2014
Сообщений: 3157
UA: Firefox 47.0

Re: Обсуждение кнопок CB

bunda1
Menuitem hider
Иконка перечеркнута...как будь то постоянно отключено и в рабочем состоянии кнопки.

Отсутствует

 

№134707-06-2016 21:46:22

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

Re: Обсуждение кнопок CB

oleg.sgh пишет

bunda1
Иконка перечеркнута...как будь то постоянно отключено и в рабочем состоянии кнопки.

Упс :) Исправил: Menuitem hider

Отсутствует

 

№134807-06-2016 22:06:14

oleg.sgh
Участник
 
Группа: Members
Зарегистрирован: 19-04-2014
Сообщений: 3157
UA: Firefox 47.0

Re: Обсуждение кнопок CB

bunda1
Замечательно. Спасибо.

Отсутствует

 

№134907-06-2016 22:26:09

bezuma
Участник
 
Группа: Members
Откуда: Москва
Зарегистрирован: 26-01-2014
Сообщений: 256
UA: Firefox 47.0

Re: Обсуждение кнопок CB

bunda1
Еще обнаружил:

1. FF Exp Imp CB - не фурычит совсем
2. Переключать проигрывания анимации(gif) - неактивна (серая)
3. Save - не работает Сохранить ярлык страницы как…

Отредактировано bezuma (08-06-2016 04:27:20)

Отсутствует

 

№135007-06-2016 22:49:58

oleg.sgh
Участник
 
Группа: Members
Зарегистрирован: 19-04-2014
Сообщений: 3157
UA: Firefox 47.0

Re: Обсуждение кнопок CB

bezuma
Упс, не тому комент вставил...:P

Отредактировано oleg.sgh (07-06-2016 22:52:59)

Отсутствует

 

Board footer

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