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

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№115-11-2013 13:00:35

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 25.0
Веб-сайт

Как получить собственный (уникальный) ID кнопки?

Чтобы предотвратить проблемы, связанные с клонированием кнопок, использующих установку параметров в about:config, названия этих параметров д/б уникальны даже при полной идентичности кнопок. Поэтому, наверное, они должны содержать что-то, что будет различать даже клоны. По идее ID кнопки является таким дискриминатором.
Но как его получить в коде кнопки - я не знаю :(


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№215-11-2013 14:30:10

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 25.0
Веб-сайт

Re: Как получить собственный (уникальный) ID кнопки?

okkamas_knife пишет

Я пытался так, но у меня не выходит :(
В 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)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№315-11-2013 20:35:28

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

Re: Как получить собственный (уникальный) ID кнопки?

difabor пишет

Чтобы предотвратить проблемы, связанные с клонированием кнопок, использующих установку параметров в 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)

Отсутствует

 

№415-11-2013 23:03:32

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

Re: Как получить собственный (уникальный) ID кнопки?

Нет при дублировании кнопки джетпак может и не быть установлен для переключения. А вообще кнопка не удачная -  проблема с иконками джетпаков :/

Отредактировано bunda1 (15-11-2013 23:04:53)

Отсутствует

 

№515-11-2013 23:56:04

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 25.0
Веб-сайт

Re: Как получить собственный (уникальный) ID кнопки?

А такой вопрос: отлаживается какой-то код.
В процессе отладки есть ошибки. Код меняется, исправляется, вместе с ним меняются и названия переменных - в конфиге это всё остаётся, если специально не подчищать, или есть какой-то механизм, вычищающий мусор?


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№616-11-2013 00:36:22

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

Re: Как получить собственный (уникальный) ID кнопки?

difabor пишет

А такой вопрос: отлаживается какой-то код.
В процессе отладки есть ошибки. Код меняется, исправляется, вместе с ним меняются и названия переменных - в конфиге это всё остаётся, если специально не подчищать, или есть какой-то механизм, вычищающий мусор?

Пример:

Выделить код

Код:

// Создать строку в 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)

Отсутствует

 

№716-11-2013 16:44:38

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

Re: Как получить собственный (уникальный) ID кнопки?

okkamas_knife
Спасибо конечно но я уже так как бы делаю.

Отсутствует

 

Board footer

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