вторник, 6 апреля 2010 г.

html select box выделить все опции

Допустим у нас есть multiple select box с большим количеством options, ну скажем 450. Надо выделить все.
Рассмотрим 2 способа.
Решение 1. В лоб
selectAll_method1 = function(selectBoxId, selected) {
    var selectBox = document.getElementById(selectBoxId);
    for (var i=0; i < selectBox.options.length; i++) {
         selectBox.options[i].selected = selected;
    }
}



В IE 8 это происходит очень долго. Мы визуально видим как браузер пробегается по опциям при этом проматывая скролл. Решение 2. Пересоздание опций.
selectAll_method2 = function(selectBoxId, selected) {
    var selectBox = document.getElementById(selectBoxId);
    var optionsCopy = new Array();
    for (var i=0; i < selectBox.options.length; i++) {
        var option = selectBox.options[i];
        optionsCopy[i] = new Option(option.text,option.value,selected,selected);
    }
    selectBox.options.length = 0;
    for (var i=0; i < optionsCopy.length; i++) {
        selectBox.options[i] = optionsCopy[i];
    }
}



Странно, но пересоздание опций работает значительно быстрее. Сравним?
IE 7IE 8FF 3.6Chrome 4.1
Метод 1900160011707
Метод 2270300460450

Очевидно что в IE8 есть досадный баг связаный с выделением. Хром приятно порадовал.
Плюсы метода 2.
1. Почти везде быстрее, кроме хрома
2. Визуально приятнее так как селект бокс не прокручивается вниз.
Минусы метода 2.
1. Пересоздание не копируют свойства опций, например, class. При необходимости метод можна расширить, правда не известно как это отобразится на скорости его выполнения.
2. Пересоздание будет происходить всегда. В случае первого метода, если все опции уже выбраны метод исполняется быстро, так как менять состояние опций не приходится.
3. Снятие выделения методом 1 везде быстрее
4. Это хак.

Итого: для выделения юзаем метод 2, для снятия выделения - метод 1.

среда, 31 марта 2010 г.

Timetracker и iMacros. Борьба с бюрократией

Если надо заполнить тайм трекер для работодателя за месяц. Создаем файл timetracker.csv:

01,08:00,"Manual trip input: Night shifts and client-side validation"
02,08:00,"Manual Trip Input: Button Added: 'Go to Trip Report'"
03,02:00,"Manual Trip Input: Update validation"
03,06:00,"Trip Correction: Fixing bug with paging"
...
31,08:00,"Delevery end: deploy, testing, fixing"
ложим его куда надо
и запускаем iMacros скрипт

'TLW
TAG POS=1 TYPE=SELECT FORM=NAME:mytimeForm ATTR=ID:project CONTENT=%19
'Correction
TAG POS=1 TYPE=SELECT FORM=NAME:mytimeForm ATTR=ID:activity CONTENT=%63

CMDLINE !DATASOURCE timetracker.csv
SET !DATASOURCE_COLUMNS 3
SET !LOOP 1
SET !DATASOURCE_LINE {{!LOOP}}

'Pick day 01
TAG POS=1 TYPE=A ATTR=TXT:{{!COL1}}
'Duration 8
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:mytimeForm ATTR=ID:duration CONTENT={{!COL2}}
'Put text
TAG POS=1 TYPE=TEXTAREA FORM=NAME:mytimeForm ATTR=ID:note CONTENT={{!COL3}}
'Some JS executes about 2 seconds :)
WAIT SECONDS=2
'Submit
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:mytimeForm ATTR=ID:btmytime

Усьо!

Что мог сделать лучше: подумать как информацию из дискрипшна коммита автоматом постить в тайм трекер