Еще очень интересно, можно ли наследовать стандартные CSS стили?
Например я хочу сделать класс для toolbarbutton на основе класса для button.
Можно так сделать?
--- ---
Отсутствует
Forest
можно стандартные. тут думаю проблемы не должно быть, через dom inspector можно посмотреть css styel rules и cumputed style для любого элемента
наследовать нельзя, наверное. тем более обычно в css темы в селекторе указано помимо класса элемента, ещё его nodeName.
можно через, опять же, dom inspector посмотреть любой стиль и стащить его в своё правило
Отредактировано Shutnik (17-07-2008 14:45:20)
Отсутствует
Shutnik
Например я хочу сделать класс для toolbarbutton на основе класса для button.
Такое оказалось сделать просто:
в описании стиля
Вот еще тройка вопросов:
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; }
тоже не помогает
Добавлено 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, но для такого я его не нашел
Или плохо искал?
--- ---
Отсутствует
Forest
1. используй new Number или parseInt
2. не стоит с начала начинать, с конца удаляй, иначе у тебя количество элементов с каждой итерацией уменьшается либо используй while
3. ты уверен, что у тебя caption на всю ширину растянут? наверное нужно ещё flex добавить
Отсутствует
Shutnik
1. Действительно, почему-то не смог найти сам
2. Так и сделал
while(currentField.getElementsByTagName("listitem").length>0) currentField.removeItemAt(0);
3. Растяжка помогла Да и label выносить оказалось лишним.
Так работает
Спасибо
--- ---
Отсутствует
Forest
2. Так и сделал
.getElementsByTagName – довольно тормозная штука и не стоит лишний раз к ней обращаться.
Скажем,
Или один раз сохранить в переменную .getElementsByTagName("listitem").length и удалять с конца (length - 1, length - 2, ... , 0)
А в HTML можно просто сделать
Вообще в такой ситуации логично было бы вызвать 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)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
А в HTML можно просто сделать
ну а в XUL:
хотя я предпочитаю нормально удалять
Отсутствует
Infocatcher
.getElementsByTagName – довольно тормозная штука и не стоит лишний раз к ней обращаться.
Скажем,
Код:while(parentElt.hasChildNodes())
parentElt.removeChild(parentElt.lastChild);
Уже нашел этот вариант в домовском хелпе - предыдущие действительно какой-то кривой был и не для всех вариантов работал
Можно попробовать сделать
var copy = parentElt.cloneNode(false); // копируем без дочерних элементов
parentElt.parentNode.replaceChild(copy, parentElt);
Да наверное проще написать свою удалялку (язык позволяет).
А такими финтами как-то не хочется заниматься - сборщик мусора - он конечно есть, но такого течения памяти имхо лучше избегать...
--- ---
Отсутствует
Я тут попробовал перейти от списка к дереву и столкнулся с некоторыми проблемами:
1. Почему-то для дерева не сработало присваивание treecell-у через label, хотя для listbox-а работало. Сделал через setAttribute("label", data) - заработало.
2. Однако с тултипом такой фокус не прошел - так и не получилось мне назначить его для treecell (для treecol назначается нормально). Ни setAttribute, ни пронисывание в xul-е, ни использование тега - ничего не помогает. Хотя в официальном источнике они (tooltip, tooltiptext) описаны как "Inherited from XUL element"...
Подскажите, в чем дело
--- ---
Отсутствует
Я правильно понимаю, что в 2-ке проблемы с определением выделения внутри дерева?
Сколько всего просмотрел - ничего не работает
Конечно работает currentIndex, но он выдает не абсолютный номер, а относительный.
То есть развернул ветку - номер выделенного после этой ветки изменился.
Может можно получить хотя бы абсолютный индекс, либо value?
Дерево двухуровневое.
Или подскажите расширение, которое работает в 2-ке с выделением в дереве.
--- ---
Отсутствует
Еще пара вопросов:
1. Заполняю menulist программно, программно же делаю выделение и сразу после этого хочу использовать значение выделенного элемента. Однако выдается undefind Как победить?
Выделяю через selectedIndex.
Если хоть раз руками выбрать - все работает.
2. Делаю getBranch(Path).getChildList("",{}), но получаю не только прямых потомков, но вообще всех. Как можно ограничиться только одним уровнем потомков?
--- ---
Отсутствует
По поводу первого вопроса предыдущего поста - инспектор DOM показал, что сразу после заполнения из кода до этого пустого списка все его элементы - листья.
А вот если после этого хоть раз выбрать руками элемент - в них появляются дочерние элементы: xul:hbox и xul:label.
Может их можно программно инициализировать?
Или я неправильно заполняю?
--- ---
Отсутствует
Ну вот, а .getAttribute("value") работает
Кто бы еще объяснил (или ссылку дал, где почитать) разницу между .getAttribute("value") и просто .value ?..
--- ---
Отсутствует
Я правильно понимаю, что нельзя сохранить не все пользовательские настройки, а только часть через savePrefFile?
Например только определенную ветвь?
По крайней мере у меня getBranch("...").savePrefFile(...) говорит, что нет такого
Или только потом открывать как файл и удалять лишнее?
Если отредактировать сохраненный файл, то readUserPrefs отрабатывает нормально.
--- ---
Отсутствует
Я правильно понимаю, что нельзя сохранить не все пользовательские настройки, а только часть через savePrefFile?
savePrefFile(null) сохраняет все
По крайней мере у меня getBranch("...").savePrefFile(...) говорит, что нет такого sad
savePrefFile это метод nsIPrefService, а не nsIPrefBranch
Отсутствует
Shutnik
savePrefFile(null) сохраняет все
Ясно, значит доработаем напильником
savePrefFile это метод nsIPrefService, а не nsIPrefBranch
Недоработка однако...
Еще раз наткнулся на проблему при работе с атрибутами через свойства - не отображалось ни в интерфейсе, ни в ДОМе, однако при попытке вывести объект в консоль - все выводилось правильно.
Переделал через .getAttribute("name", "value") - все заработало.
Мб это баг такой? Никто не в курсе? В 3-ке это тоже есть.
Надо будет в БагЗилле поискать...
Еще на один косяк натолкнулся - getElementsByTagName().length после удаления всех элементов все равно выдал то же кол-во, что и до удаления, однако при попытке доступа к элементам их отсутствие очевидно. Правда в 3-ке это не проверял...
--- ---
Отсутствует
Кто бы еще объяснил (или ссылку дал, где почитать) разницу между .getAttribute("value") и просто .value ?..
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
http://xpoint.ru/know-how/JavaScript/Atributyi
Спасибо, очень познавательно
Только вот по описанным мною ситуациям все равно остаются вопросы, баг это или я чего не понимаю.
Но когда в цикле устанавливаешь 15 однотипных значений, но устанавливаются они не все - это как минимум странно - притомился Лис что ли?..
Вот если бы они все так не устанавливались...
И тот факт, что выделение в поле со списком через свойство начинает работать только после операций над полем со стороны пользователя, тоже как-то странно.
--- ---
Отсутствует
Forest
Но когда в цикле устанавливаешь 15 однотипных значений, но устанавливаются они не все - это как минимум странно - притомился Лис что ли?..
Лично не встречал – пример бы.
А про tree можно посмотреть тут: http://xpoint.ru/know-how/Articles/Dina … %27yaNaXUL
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
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]); } }
В таком варианте все работает.
А вот если все
заменить на просто
может работать польностью, а может и не полностью (то есть до определенного индекса заполнится нормально, а после - нет). Исследований, зависит ли это именно от индекса, я не проводил.
При этом даже ДОМ-инспектор показывает, что там все пусто.
Однако если сделать что-то вроде
currentFields = currentField.getElementsByTagName("listitem"); var nListitem = currentFields.length; for (var i = nListitem-1; i>=0; i--) dump("listitem["+i+"] = "+currentFields[i].label);
- выводится все, как и должно быть
Такие вот пироги...
--- ---
Отсутствует
Если у устанавливаю value у поля со списком - могу я проконтролировать, что значение подошло?
value то в любом случае меняется, а вот попал ли я в список значений?..
Или это только если достать этот список и по нему проверять каждое значение?
--- ---
Отсутствует
Если у устанавливаю 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ентов на части порвет !!!
Отсутствует
Anton
то должно помочь...
Спасибо
Но это тоже из разряда
Или это только если достать этот список и по нему проверять каждое значение?
.
Хотя наверное этого должно быть достаточно?..
--- ---
Отсутствует