Страницы: 1
Чтобы предотвратить проблемы, связанные с клонированием кнопок, использующих установку параметров в about:config, названия этих параметров д/б уникальны даже при полной идентичности кнопок. Поэтому, наверное, они должны содержать что-то, что будет различать даже клоны. По идее ID кнопки является таким дискриминатором.
Но как его получить в коде кнопки - я не знаю
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Я пытался так, но у меня не выходит
В Memory Manager есть такoe присвоение: memoryPanel.id = "MemoryDisplay";
И поэтому this.id даёт memoryPanel.id, т.е. "MemoryDisplay".
А поставить что-то типа pre_id = this.id; перед этим присвоением не помогает...
Ни var pre_id, ни this.pre_id не помогают...
==========================
P.S. Получилось!!! Надо - до всего!!!
Спасибо большое!!!
Отредактировано difabor (15-11-2013 14:43:27)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Чтобы предотвратить проблемы, связанные с клонированием кнопок, использующих установку параметров в about:config, названия этих параметров д/б уникальны даже при полной идентичности кнопок. Поэтому, наверное, они должны содержать что-то, что будет различать даже клоны. По идее ID кнопки является таким дискриминатором.
Но как его получить в коде кнопки - я не знаю
Вот пример:
// Переключить джетпак от 29.07.2013. ................................ // Настройка функций кликов мыши для кнопки ................................ this.onclick = function(e) { // ЛКМ переключает джетпак указанный в 'about:config'.... if ( e.button == 0 ) { if ( !cbu.isPref( jetName ) ) { // если джетпак для переключения не указан alertsService.showAlertNotification( button.image, button.label, "Установите джетпак для переключения", false, "", null, ""); return; } button.toggle = false, jetpacksName = aPrefs.getValue( jetName, 0); AddonManager.getAddonsByTypes(["extension"], function(addons) { // переключить джетпак addons.forEach(function(addon, i) { if ( addons[i].name == jetpacksName ) { addons[i].userDisabled = !addons[i].userDisabled; cbu.setPrefs( jet, !addons[i].userDisabled ); button.toggle = true; } }); if ( button.toggle == false ) { // если джетпак для переключения не найден alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", button.label, "Джетпак для переключения не найден", false, "", null, ""); } }); } // СКМ открывает стандартную контекстную меню кнопки .... if ( e.button == 1 ) { gShowPopup(this) }; // ПКМ создаёт и открывает меню с джетпаками .... if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { e.preventDefault(); var node = document.getElementById(this.id + "-menuPopup"); if ( node ) node.parentNode.removeChild( node ); // удалить старое меню var menuPopup = document.getElementById("mainPopupSet").appendChild(document.createElement("menupopup")); // создать новое меню menuPopup.id = this.id + "-menuPopup"; AddonManager.getAddonsByTypes(["extension"], function(addons) { addons.forEach(function(addon, i) { if ( addons[i].operationsRequiringRestart > 0 ) return; var mItem = document.createElement("menuitem"); mItem.setAttribute("label", addons[i].name ); mItem.setAttribute("class", "menuitem-iconic"); mItem.setAttribute("image", addons[i].iconURL || addons[i].icon64URL || "chrome://mozapps/skin/extensions/extensionGeneric-16.png"); if ( addons[i].name == aPrefs.getValue( jetName, 0 ) ) mItem.setAttribute('style', 'color: red; font-weight: bold;'); mItem.addEventListener('click', function (e) { aPrefs.setValue( jetName, addons[i].name ); cbu.setPrefs( jet, addons[i].isActive ); setImage( this.image ); } ); menuPopup.appendChild(mItem); }); }); menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft"); } }; // Объявляем переменные для этой вкладки ................................ var button = this; var aPrefs = Application.prefs; var alertsService = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService); var num = _id.replace(/custombuttons-button/g, ""); // создать индивидуальные настройки для 'about:config' var jet = "CB" + num + ".toggleJetpacks"; var jetName = "CB" + num + ".toggleJetpacks.name"; if ( !cbu.isPref( jet ) ) cbu.setPrefs( jet, true ); // Подсказка для кнопки ................................ this.onmouseover = function() { // получить и обрезать подсказку .... var val = aPrefs.getValue( jetName, 0); val = ( val == 0 ) ? "не установлено" : val; var jetpacks = val.substring(0,50) + ( (val.length > 50) ? '....' : "" ); this.tooltipText = "Переключить: " + jetpacks + "\nЛ: Bключить - выключить \nС: CB Меню \nП: Открыть меню с джетпаками"; }; // Заменить иконку кнопки на иконку переключаемого джетпака ................................ function setImage( image ) { var link = custombuttons.makeButtonLink("edit", _id ); var param = custombuttons.cbService.getButtonParameters( link ).wrappedJSObject; param.image = image; custombuttons.cbService.installButton( param ); }; // Установить нужную иконку кнопки при старте браузера или при изменениях настроек ................................ function toggleImage() { cbu.getPrefs( jet ) ? button.style.filter = '' : button.style.filter = 'url("chrome://mozapps/skin/extensions/extensions.svg#greyscale")'; }; toggleImage(); gPrefService.addObserver( jet, toggleImage, false ); addDestructor(function() { gPrefService.removeObserver( jet, toggleImage, false ) }); // Иконка кнопки не больше 16px ................................ var icon = document.getAnonymousElementByAttribute( this, "class", "toolbarbutton-icon"); icon.style.width = "16px"; icon.style.height = "16px"; this.onDestroy = function () { var icon = document.getAnonymousElementByAttribute( this, "class", "toolbarbutton-icon"); icon.style.width = "16px"; icon.style.height = "16px"; };
Добавлено 15-11-2013 20:38:56
Обрати внимание там на:
var num = _id.replace(/custombuttons-button/g, ""); // создать индивидуальные настройки для 'about:config' var jet = "CB" + num + ".toggleJetpacks"; var jetName = "CB" + num + ".toggleJetpacks.name"; if ( !cbu.isPref( jet ) ) cbu.setPrefs( jet, true );
кнопка создаёт индивидуальную настройку в 'about:config' для себя на основе своего id
Отредактировано bunda1 (15-11-2013 20:43:19)
Отсутствует
Нет при дублировании кнопки джетпак может и не быть установлен для переключения. А вообще кнопка не удачная - проблема с иконками джетпаков
Отредактировано bunda1 (15-11-2013 23:04:53)
Отсутствует
А такой вопрос: отлаживается какой-то код.
В процессе отладки есть ошибки. Код меняется, исправляется, вместе с ним меняются и названия переменных - в конфиге это всё остаётся, если специально не подчищать, или есть какой-то механизм, вычищающий мусор?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
А такой вопрос: отлаживается какой-то код.
В процессе отладки есть ошибки. Код меняется, исправляется, вместе с ним меняются и названия переменных - в конфиге это всё остаётся, если специально не подчищать, или есть какой-то механизм, вычищающий мусор?
Пример:
// Создать строку в about:config если не существует, удалить при изменениях ................................ cbu.isPref("CB.demo", true ) addDestructor(function(reason) { alert(reason); cbu.clearPrefs("CB.demo"); });
Добавлено 16-11-2013 00:39:21
Я для наглядности в переменных конфиге ставлю название кнопки или CB.
Отредактировано bunda1 (16-11-2013 06:42:20)
Отсутствует
Страницы: 1