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

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

№2617-07-2008 13:35:33

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Еще очень интересно, можно ли наследовать стандартные CSS стили?
Например я хочу сделать класс для toolbarbutton на основе класса для button.
Можно так сделать?

Отсутствует

 

№2717-07-2008 14:43:58

Shutnik
Happy Arch Linux User
 
Группа: Extensions
Откуда: Tyumen ✈ Dnipropetrovsk
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Firefox 3.0
Веб-сайт

Re: Вопросы (и ответы) по разработке расширений

Forest
можно стандартные. тут думаю проблемы не должно быть, через dom inspector можно посмотреть css styel rules и cumputed style для любого элемента

наследовать нельзя, наверное. тем более обычно в css темы в селекторе указано помимо класса элемента, ещё его nodeName.
можно через, опять же, dom inspector посмотреть любой стиль и стащить его в своё правило

Отредактировано Shutnik (17-07-2008 14:45:20)


Life's emblem here, in youth and vernal bloom,
But reason's finger pointing at the...

Отсутствует

 

№2817-07-2008 22:36:43

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Shutnik

Например я хочу сделать класс для toolbarbutton на основе класса для button.

Такое оказалось сделать просто:

Выделить код

Код:

    -moz-appearance: button;

в описании стиля :cool:

Вот еще тройка вопросов:
1. Приводить типы можно?
А то из textbox-а значение беру в переменную, делаю +1, а получаю +1 как к строке.
Number(строка) не помогает.
Только шаманство типа недопустимой для строки операции (например -1+2).

2. Пробую создавать список (listitem-ы в listbox-е) по массиву, но почему-то при удалении с последующим созданием обнаруживаются пустые элементы. Это точно происходит при удалении.
Вот код:

Выделить код

Код:

// ссылка на listbox
    currentField = document.getElementById("CKGFF2-Current");
// удаление существующего списка (именно здесь что-то и не так)
        for (var i=0; i<currentField.getElementsByTagName("listitem").length; i++) currentField.removeItemAt(i);
// создание нового списка
        for (var i=0; i<curDepth; i++) currentField.appendItem('');

Вообще как-то подозрительно я их удаляю, но по другому не получается.
И что я вообще такое удаляю, что оно все равно работает?..

3. Как в groupbox-е отцентрировать заголовок?
Вот пример:

Выделить код

Код:

// .xul
  <groupbox orient="horizontal">
    <caption>
      <label class="label" value="&FormFiller2.lLink;" />
    </caption>

// .css
.label {
    text-align: center;    
}
Выделить код

Код:

 align="center"

тоже не помогает :(

Добавлено Thu Jul 17 22:42:09 2008 :
На счет 2. - правильнее наверное было бы удаление сделать как-то так:

Выделить код

Код:

    var list = currentField.getElementsByTagName("listitem");
        for (var i=0; i<list .length; i++) list .removeItemAt(i);

Но у list почему-то не оказывается метода removeItemAt.
Вообще в такой ситуации логично было бы вызвать removeAll, но для такого я его не нашел :(
Или плохо искал?

Отсутствует

 

№2918-07-2008 01:11:40

Shutnik
Happy Arch Linux User
 
Группа: Extensions
Откуда: Tyumen ✈ Dnipropetrovsk
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0
Веб-сайт

Re: Вопросы (и ответы) по разработке расширений

Forest
1. используй new Number или parseInt
2. не стоит с начала начинать, с конца удаляй, иначе у тебя количество элементов с каждой итерацией уменьшается :) либо используй while
3. ты уверен, что у тебя caption на всю ширину растянут? наверное нужно ещё flex добавить


Life's emblem here, in youth and vernal bloom,
But reason's finger pointing at the...

Отсутствует

 

№3018-07-2008 08:46:41

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Shutnik
1. Действительно, почему-то не смог найти сам :(
2. Так и сделал

Выделить код

Код:

    while(currentField.getElementsByTagName("listitem").length>0) currentField.removeItemAt(0);

3. Растяжка помогла :) Да и label выносить оказалось лишним.
Так работает

Выделить код

Код:

  <caption flex="1" class="label" label="&FormFiller2.lLink;" />

Спасибо :)

Отсутствует

 

№3118-07-2008 20:19:21

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

Re: Вопросы (и ответы) по разработке расширений

Forest

2. Так и сделал

.getElementsByTagName – довольно тормозная штука и не стоит лишний раз к ней обращаться.
Скажем,

Выделить код

Код:

while(parentElt.hasChildNodes())
    parentElt.removeChild(parentElt.lastChild);

Или один раз сохранить в переменную .getElementsByTagName("listitem").length и удалять с конца (length - 1, length - 2, ... , 0)

А в HTML можно просто сделать

Выделить код

Код:

parentElt.innerHTML = ""

Вообще в такой ситуации логично было бы вызвать removeAll, но для такого я его не нашел sad

Можно попробовать сделать

var copy = parentElt.cloneNode(false); // копируем без дочерних элементов
parentElt.parentNode.replaceChild(copy, parentElt);

Но, как я понимаю (лень проверять), отвалятся все обработчики (addEventListener), «повешенные» на parentElt.
Например, запускаем из адресной строки:

Выделить код

Код:

javascript: var parentElt = document.documentElement.lastChild; var copy = parentElt.cloneNode(false); var copy = parentElt.cloneNode(false); alert("Childs count:\n" + parentElt.childNodes.length); parentElt.parentNode.replaceChild(copy, parentElt); void(0);

Отредактировано Infocatcher (18-07-2008 20:20:13)


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

Отсутствует

 

№3218-07-2008 20:47:03

Shutnik
Happy Arch Linux User
 
Группа: Extensions
Откуда: Tyumen ✈ Dnipropetrovsk
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0
Веб-сайт

Re: Вопросы (и ответы) по разработке расширений

Infocatcher пишет:

А в HTML можно просто сделать

Выделить код

Код:

parentElt.innerHTML = ""

ну а в XUL:

Выделить код

Код:

parentElt.textContent = ""

хотя я предпочитаю нормально удалять


Life's emblem here, in youth and vernal bloom,
But reason's finger pointing at the...

Отсутствует

 

№3319-07-2008 12:50:35

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Infocatcher

.getElementsByTagName – довольно тормозная штука и не стоит лишний раз к ней обращаться.
Скажем,
Код:

while(parentElt.hasChildNodes())
    parentElt.removeChild(parentElt.lastChild);

Уже нашел этот вариант в домовском хелпе - предыдущие действительно какой-то кривой был и не для всех вариантов работал:)

Можно попробовать сделать

    var copy = parentElt.cloneNode(false); // копируем без дочерних элементов
    parentElt.parentNode.replaceChild(copy, parentElt);

Да наверное проще написать свою удалялку (язык позволяет).
А такими финтами как-то не хочется заниматься - сборщик мусора - он конечно есть, но такого течения памяти имхо лучше избегать...

Отсутствует

 

№3419-07-2008 14:06:50

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Я тут попробовал перейти от списка к дереву и столкнулся с некоторыми проблемами:
1. Почему-то для дерева не сработало присваивание treecell-у через label, хотя для listbox-а работало. Сделал через setAttribute("label", data) - заработало.
2. Однако с тултипом такой фокус не прошел - так и не получилось мне назначить его для treecell (для treecol назначается нормально). Ни setAttribute, ни пронисывание в xul-е, ни использование тега - ничего не помогает. Хотя в официальном источнике они (tooltip, tooltiptext) описаны как "Inherited from XUL element"...

Подскажите, в чем дело:)

Отсутствует

 

№3520-07-2008 11:37:30

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Я правильно понимаю, что в 2-ке проблемы с определением выделения внутри дерева?
Сколько всего просмотрел - ничего не работает :(
Конечно работает currentIndex, но он выдает не абсолютный номер, а относительный.
То есть развернул ветку - номер выделенного после этой ветки изменился.
Может можно получить хотя бы абсолютный индекс, либо value?
Дерево двухуровневое.
Или подскажите расширение, которое работает в 2-ке с выделением в дереве.

Отсутствует

 

№3622-07-2008 00:57:44

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Еще пара вопросов:
1. Заполняю menulist программно, программно же делаю выделение и сразу после этого хочу использовать значение выделенного элемента. Однако выдается undefind :( Как победить?
Выделяю через selectedIndex.
Если хоть раз руками выбрать - все работает.
2. Делаю getBranch(Path).getChildList("",{}), но получаю не только прямых потомков, но вообще всех. Как можно ограничиться только одним уровнем потомков?

Отсутствует

 

№3722-07-2008 11:44:43

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

По поводу первого вопроса предыдущего поста - инспектор DOM показал, что сразу после заполнения из кода до этого пустого списка все его элементы - листья.
А вот если после этого хоть раз выбрать руками элемент - в них появляются дочерние элементы: xul:hbox и xul:label.
Может их можно программно инициализировать?
Или я неправильно заполняю?

Отсутствует

 

№3822-07-2008 12:20:44

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Ну вот, а .getAttribute("value") работает:dumb:
Кто бы еще объяснил (или ссылку дал, где почитать) разницу между .getAttribute("value") и просто .value ?..

Отсутствует

 

№3922-07-2008 21:08:50

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Я правильно понимаю, что нельзя сохранить не все пользовательские настройки, а только часть через savePrefFile?
Например только определенную ветвь?
По крайней мере у меня getBranch("...").savePrefFile(...) говорит, что нет такого :(
Или только потом открывать как файл и удалять лишнее?

Если отредактировать сохраненный файл, то readUserPrefs отрабатывает нормально.

Отсутствует

 

№4022-07-2008 21:38:17

Shutnik
Happy Arch Linux User
 
Группа: Extensions
Откуда: Tyumen ✈ Dnipropetrovsk
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0
Веб-сайт

Re: Вопросы (и ответы) по разработке расширений

Я правильно понимаю, что нельзя сохранить не все пользовательские настройки, а только часть через savePrefFile?

savePrefFile(null) сохраняет все

По крайней мере у меня getBranch("...").savePrefFile(...) говорит, что нет такого sad

savePrefFile это метод nsIPrefService, а не nsIPrefBranch


Life's emblem here, in youth and vernal bloom,
But reason's finger pointing at the...

Отсутствует

 

№4124-07-2008 17:00:16

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Shutnik

savePrefFile(null) сохраняет все

Ясно, значит доработаем напильником :)

savePrefFile это метод nsIPrefService, а не nsIPrefBranch

Недоработка однако...


Еще раз наткнулся на проблему при работе с атрибутами через свойства - не отображалось ни в интерфейсе, ни в ДОМе, однако при попытке вывести объект в консоль - все выводилось правильно.
Переделал через .getAttribute("name", "value") - все заработало.
Мб это баг такой? Никто не в курсе? В 3-ке это тоже есть.
Надо будет в БагЗилле поискать...

Еще на один косяк натолкнулся - getElementsByTagName().length после удаления всех элементов все равно выдал то же кол-во, что и до удаления, однако при попытке доступа к элементам их отсутствие очевидно. Правда в 3-ке это не проверял...

Отсутствует

 

№4225-07-2008 20:19:40

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

Re: Вопросы (и ответы) по разработке расширений

Кто бы еще объяснил (или ссылку дал, где почитать) разницу между .getAttribute("value") и просто .value ?..

http://xpoint.ru/know-how/JavaScript/Atributyi


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

Отсутствует

 

№4325-07-2008 21:51:08

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Infocatcher

http://xpoint.ru/know-how/JavaScript/Atributyi

Спасибо, очень познавательно :)

Только вот по описанным мною ситуациям все равно остаются вопросы, баг это или я чего не понимаю.
Но когда в цикле устанавливаешь 15 однотипных значений, но устанавливаются они не все - это как минимум странно - притомился Лис что ли?..
Вот если бы они все так не устанавливались...
И тот факт, что выделение в поле со списком через свойство начинает работать только после операций над полем со стороны пользователя, тоже как-то странно.

Отсутствует

 

№4425-07-2008 22:31:32

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

Re: Вопросы (и ответы) по разработке расширений

Forest

Но когда в цикле устанавливаешь 15 однотипных значений, но устанавливаются они не все - это как минимум странно - притомился Лис что ли?..

Лично не встречал – пример бы.
А про tree можно посмотреть тут: http://xpoint.ru/know-how/Articles/Dina … %27yaNaXUL


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

Отсутствует

 

№4526-07-2008 00:02:33

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Infocatcher

Лично не встречал – пример бы.

Целиком расширение пока выложить не могу, но вот 2 выдержки из кода:
1. Заполняем menulist (его id = CKGFF2-Mappings) из mList, где хранятся пары label+value, а потом делаем текущим первый элемент:

Выделить код

Код:

    currentMappings = document.getElementById("CKGFF2-Mappings");
        for (var i = 0; i < mList.length; i++)
              currentMappings.appendItem(mList[i][0], mList[i][1]);
        currentMappings.selectedIndex = 0;

Если после этого не трогая мышью этот menulist попробовать получить value выделенного элемента через свойство - получим undefind, а вот если через атрибут - работает.

Выделить код

Код:

// не работает
currentMappings.selectedItem.value;
// работает
currentMappings.selectedItem.getAttribute("value");

2. Заполняем listbox (его id = CKGFF2-Current). curDepth - положительное целое, posPhoneCount - неотрицательное целое. data - массив строк:

Выделить код

Код:

    currentField = document.getElementById("CKGFF2-Current");
// сначала удаляем старые элементы
        currentFields = currentField.getElementsByTagName("listitem");
        var nListitem = currentFields.length;
        for (var i = nListitem-1; i>=0; i--) 
            currentField.removeChild(currentFields[i]);
// потом добавляем новые
        for (var i=0; i<(curDepth+2+4*posPhoneCount); i++) currentField.appendItem('');
// потом заполняем их
    var cf = 0;
    for (var i=0; i<curDepth; i++) {
        if ((posName3-1)==i) {
            currentFields[cf++].setAttribute("label", "/ "+data[recordNumber][i]);            
            var delim = data[recordNumber][i].indexOf(" ");
            currentFields[cf++].setAttribute("label", " - "+data[recordNumber][i].substring(0,delim));
            currentFields[cf++].setAttribute("label", " - "+data[recordNumber][i].substring(delim+1));
        } else if ((pp=posPhone.indexOf(i+1))>=0) {
            currentFields[cf++].setAttribute("label", "/ "+data[recordNumber][i]);            
            currentFields[cf++].setAttribute("label", " -  "+data[recordNumber][i].substring(0,3));
            var phoneNumber = data[recordNumber][i].substring(3).split(/[ -]/).join();
            currentFields[cf++].setAttribute("label", " -/ "+phoneNumber);
            currentFields[cf++].setAttribute("label", "   - "+phoneNumber.substring(0,3));
            currentFields[cf++].setAttribute("label", "   - "+phoneNumber.substring(3));
        } else {
            currentFields[cf++].setAttribute("label", "  "+data[recordNumber][i]);            
        }
    }

В таком варианте все работает.
А вот если все

Выделить код

Код:

.setAttribute("label", value)

заменить на просто

Выделить код

Код:

.label=value

может работать польностью, а может и не полностью (то есть до определенного индекса заполнится нормально, а после - нет). Исследований, зависит ли это именно от индекса, я не проводил.
При этом даже ДОМ-инспектор показывает, что там все пусто.
Однако если сделать что-то вроде

Выделить код

Код:

        currentFields = currentField.getElementsByTagName("listitem");
        var nListitem = currentFields.length;
        for (var i = nListitem-1; i>=0; i--) 
            dump("listitem["+i+"] = "+currentFields[i].label);

- выводится все, как и должно быть:dumb:

Такие вот пироги...

Отсутствует

 

№4626-07-2008 23:30:23

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Ну хотя бы замечания по коду выскажите (если есть конечно) ;)

Отсутствует

 

№4731-07-2008 13:29:08

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

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

Отсутствует

 

№4831-07-2008 15:06:06

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Вопросы (и ответы) по разработке расширений

Если у устанавливаю value у поля со списком - могу я проконтролировать, что значение подошло?

Если

Выделить код

Код:

<menulist id="ml01" editable="true">
    <menupopup>
        <menuitem label="1" value="xyzt"/>
        <menuitem label="2" value="abcd"/>
    </menupopup>
</menulist>

то должно помочь

Выделить код

Код:

if (document. getElementById ("ml01"). getElementsByAttribute ("value", "xyz"). length) ...

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№4931-07-2008 16:15:45

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Anton

то должно помочь...

Спасибо :)
Но это тоже из разряда

Или это только если достать этот список и по нему проверять каждое значение?

.
Хотя наверное этого должно быть достаточно?..

Отсутствует

 

№5031-07-2008 17:06:31

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Вопросы (и ответы) по разработке расширений

Но это тоже из разряда

это не "из того же разряда"


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

Board footer

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