SYStem EXclusive

Я тут пешу - чего же боле…

Архив за месяц March, 2007

Использование табов

Friday, March 30, 2007

Найдите десять различий между этими картинками. Специально выставил бордеры, чтобы было видно где-что начинается и заканчивается.

Задача стояла - сделать интерфейс для редактирования продукта в е-магазине. Редактирование нескольких описАтельных полей (WYSIWYG), загрузка нескольких файлов, связывание продукта с поддерживаемыми моделями. Началось всё просто - блоки, один под другим. Но всё так просто не заканчивается - появилась необходимость добавить ещё вот _такие_ и вот _эдакие_ поля. В результате появился интерфейс, который вы видите на верхней картинке.

Какая мерзость, подумал я себе - нужно спасаться табами. Потратив полчаса на рефакторинг - получил то, что можно посмотреть на картинке нижней. Ну и конечно весь этот таб-интерфейс я нашёл готовый. А вот и ссылка - http://phrogz.net/JS/Tabtastic/index.html#overview. Кстати на сайте собрано большое количество интересных решений по JS и CSS, даже вроде бы авторских. Ищите и обрящете. Аллилуйя!

UPD: уважаемый-коллега дал ссылку вот на такое таб-решение http://webfx.eae.net/dhtml/tabpane/tabpane.html
Подход тот же самый, видимо из одной песочницы вылезли, но только сложнее прикручивать. Ну в общем так, для общего впечатления посмотреть можно

Выбор даты в HTML-форме.

Thursday, March 29, 2007

Идея такая – во многих штуках, есть компонент dateChooser. Выглядит он примерно так

date chooser (2 Кб)

Увидев такое

date chooser bad (1 Кб)

озадачился поиском простого и эффективного решения для выбоа дат в HTML-формах. Пересмотел несколько решений на PHP и Java Script. Ни одно из них мне не понравилось. Как заядлый флешер, решил использовать готовый компонент из Flash, подружив его с JS. То, что получилось в результате можно посмотреть в архиве

file:datechooser.zip

Вкратце идея такова – в JS должна быть определена функция selectDate(formattedDate), которая вызывается из flash-ролика.
Параметр представляет из себя дату в формате YYYY-MM-DD. Если этой функции не будет – выпадет ошибка JS, всё остальное – на ваше усмотрение.
Вот пример кода, как это сделано у меня.

var date_field;
function showCalendar(elem, evt){
date_field = elem;
so.write(’calendar’);
document.getElementById(’calendar’).style.display = ‘block’;
document.getElementById(’calendar’).style.left = evt.clientX + ‘px’;
document.getElementById(’calendar’).style.top = evt.clientY + ‘px’;
}
function selectDate(formattedDate){
//alert(formattedDate);
date_field.value = formattedDate;
hideCalendar();
date_field = null;
formattedDate = null;
}
function hideCalendar(){
document.getElementById(’calendar’).blur();
document.getElementById(’calendar’).innerHTML = ”;
document.getElementById(’calendar’).style.display = ‘none’;
}
var so ;
window.onload = function(){
so = new SWFObject(’calendar.swf’, ‘calendar_swf’, ‘205′, ‘214′, ‘7′, ‘#FFFFFF’);
so.write(’calendar’);
}


<SCRIPT language=”JavaScript” type=”text/javascript” src=”swfobject.js”></SCRIPT>
<div id=”calendar” style=”position:absolute;display:none”></div>
<div style=”background-color:#d0d0d0″>
<form action=”" method=”get” enctype=”multipart/form-data” name=”reportForm” id=”reportForm”>
С <input type=”text” size=”14″ maxlength=”11″ name=”lodate” id=”lodate”
value=”" onclick=”showCalendar(this, event)”/>
по <input type=”text” size=”14″ maxlength=”11″ name=”hidate” id=”hidate”
value=”" onclick=”showCalendar(this, event)”/>
<input type=”hidden” name=”mode” value=”html”/>
<input type=”button” name=”show” value=”показать” onclick=”return false;”/>
</form>
</div>

Использовал эту штуку в двух проектах. Понравилось. Просто и наглядно.
Из недостатков

  • Необходимо наличие Flash player на клиенте, хотя бы 7 версии.
  • Сложность скинования календаря. Хотя для меня это, в принципе, не проблема

Как правильно хранить куки?

Wednesday, March 21, 2007

Наша читательница из города Г. спрашивает - как лучше хранить куки?

Отвечаем - куки лучше всего хранить в специальной банке для кук.
Банка для кук предоставлена магазином “Атмосфера”

Целесообразность использования AJAX и фреймов

Tuesday, March 20, 2007

Вот давно интересует меня эта тема. Споры братьями-по-разуму ведутся жаркие. Привожу кусок своей аска-беседы с руководителем проекта в качестве своей точки зрения на этот вопрос. Реплики немного перетасованы по времени, дабы сохранить логику повествования.

Kamil (19:17:30 20/03/2007)
фреймовый подход считаешь оправданным в админке?

sysex (19:17:54 20/03/2007)
в админке - абсолютно. аякс, кстати - тоже)

Kamil (19:18:29 20/03/2007)
аякс используется?

sysex (19:18:50 20/03/2007)
да, со всем уважением

sysex (19:19:07 20/03/2007)
но только в админке

Kamil (19:19:48 20/03/2007)
у него же с поддержкой вроде проблемы

Kamil (19:20:13 20/03/2007)
браузеров

sysex (19:20:58 20/03/2007)
в FF и IE он прекрасно работает. на оперу мне плевать (я имею ввиду админку). но то, что написано - работает и в опере

Kamil (19:22:29 20/03/2007)
опера тоже должна поддерживаться

sysex (19:22:37 20/03/2007)
не должна

Kamil (19:22:45 20/03/2007)
почему?

sysex (19:22:48 20/03/2007)
это я спорю

Kamil (19:23:07 20/03/2007)
аргументируй тогда

sysex (19:26:24 20/03/2007)
потому что опера - кривой браузер по части DOM и BOM , что для админки весьма критично. я имею ввиду использование джаваскрипта на всю катушку с целью сделать приемлемый интерфейс. и для админки вполне достаточно написать - ПАНЕЛЬ АДМИНИСТРИРОВАНИЯ РАБОТАЕТ В IE6+
тем более, что его пользуют 80% и так. по поводу FF - просто в нём _очень_ удобно отлаживать клиентскую часть и воленс-неволенс всё, что пишется - работает и в FF тоже.

Kamil (19:24:19 20/03/2007)
как быть с юзерами оперы?

sysex (19:27:00 20/03/2007)
юзеры оперы чихая и плюясь запускают IE, чтобы поадминистрировать что-нибудь.
заметь, я не говорю, что в опере работать не будет, я просто в ней не тестирую

sysex (19:28:31 20/03/2007)
ну вроде того - заимел пользователь приложение, которое работает только под winXP, а у него - w98 или иксы. что ему делать?

Kamil (19:29:15 20/03/2007)
как что, не сможет купить наш продукт
а это прямые убытки

Kamil (19:28:23 20/03/2007)
а 80% это не 100%

Kamil (19:28:32 20/03/2007)
как ты понимаешь

Kamil (19:27:58 20/03/2007)
админка не столь критично
во фронте аякс используется?

sysex (19:29:20 20/03/2007)
нет, использование аякса во фронте, на мой взгляд, не оправдано. по крайней мере в нашем случае. у нас ведь нет никаких динамических фич

sysex (19:30:13 20/03/2007)
камиль. *рипит* я говорю только об админке

Kamil (19:30:33 20/03/2007)
ок

Провоцирую флейм - что скажет начальник транспортного цеха?

coasthome.ru - таки да

Tuesday, March 20, 2007

Апостоли Коля (17:42:29 20/03/2007)
Юра хочу тебя порадовать твоя новая ссылка пользуется большим успехом.Сегодля даже одна девушка с Питера сказала что на чёрном море только у нас самый лучший и информативный сайт .Так что это она тебе

sysex (17:43:23 20/03/2007)
ой спасибо. Коля, ты даже не представляешь, как мне приятно. Хоть бери и копируй твои слова … а куда? куда-нибудь))

В моём доме попрошу выражаться регулярно!

Friday, March 16, 2007

Представляю вашему вниманию утилиту RegexCoach. Я её использую пару лет, а наш сисадмин не знал про такую, что и послужило поводом поделиться с братьями-по-разуму.

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

Чтобы работать с RegexCoach нужно знать три галки, одну кнопку и два окошка. И ещё отличать жёлтый цвет от оранжевого (помните “Кин-дза-дза”?)

Тестирование регов ускоряется!

UPD: If you needed more web regular expression options, this is your lucky Friday. RegexPal does the job, and changes colour on the fly as it mixes and matches.

JavaScript тестилка регулярных выражений онлайн. Соответственно, нужно учитывать, что и выражения будут соответствовать спецификации JS, например в JS реги - Ungreedy.

Flash трюки

Thursday, March 15, 2007

Продолжая тему о книгах. Просто не могу удержаться, чтобы не посоветовать книгу “Flash. Трюки”, написаную индусом с труднопроизносимым именем Шам Бхангал. Начинающим флешерам не рекомендуется, рекодендуется флешерам кончающим продолжающим. Опосля своих нескольких лет занятий флешем, я нашёл в книге много трюков и просто идей, до которых не мог дойти своим умишком. Книга разбита на сто отдельных трюков, что весьма удобственно для чтения в туалете:). Есть дельные советы как по ActionScript, так и по дизайну-анимации. То есть почитать в ней есть чего как флеш-программистам, так и флеш-дизаенерам. Для примера сливаю очевидно-невероятный трюк №14 - рисование кругов с заливкой.

var circle_mc:MovieClip = this.createEmptyMovieClip(”circle_mc”, 1);
with (circle_mc) {
lineStyle(0, 0xFF0000, 100);
beginFill(0xFF0000);
moveTo(0, 100);
curveTo(0,200,100,200);
curveTo(200,200,200,100);
curveTo(200,0,100,0);
curveTo(0,0,0,100);
endFill();
}


var circle_mc:MovieClip = this.createEmptyMovieClip(”circle_mc”, 1);
with (circle_mc) {
lineStyle(200, 0xFF0000, 100);
moveTo(0, 100);
lineTo(.2, 100);
}

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

Бом шанкар!

JavaScript objects reference

Thursday, March 15, 2007

Есть у меня замечательный pdf, который достался мне на диске вместе с книгой. В этом документе автор собрал и, самое главное, классифицировал объекты браузеров и JavaScript с незапамятных времён до IE5+\NN6+. Впрочем, сама книга на мой взгляд, несколько туповатая, как и все книги из серии “Библия блаблабла…” (экое богохульство, однако). Потом всё-таки у меня появилась хорошая книга по JavaScript, в которой, в частности, толково описана модель событий бразуеров. Почему-то на books.ru она стоит даже дешевле, чем первая. Наверное, потому что продаётся без диска, а может на вес, кто знает. Однако, меньше слов - больше хитов. JavaScript and Browser Objects Quick Reference. Надеюсь, Дэни Гудман не обидится.

Ссылки не являются партнёрской программой или чем-то подобным. Так, для информации чё-почём.

Открываем изображение в окне. Аккуратненько так

Tuesday, March 13, 2007

Вдохновил меня на написание этой заметки один знакомый дизайнер. Он спросил, как сделать так, чтобы картинка открывалась в отдельном окне по размеру картинки. Любят они, дизайнеры, понимаете ли, чтобы у них всё было чистенько так и аккуратненько. Да я и сам люблю, и посему использую эту подсмотренную здесь фичу во всех своих разработках. Недолго думая, я написал ему код, что-то вроде этого

window.open(’111704244301010470.jpg’, ”, ‘toolbar=no, location=no, directories=no,
status=yes, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=800, height=600′);

Всё в общем-то понятно. Но в моём случае генерация кода происходит на стороне сервера и до того, как код попадает на страницу, уже известны размеры картинки и, соответственно, открываемого окна. То есть написав одну функцию на php, об этих ужасных длииииииииинных строках JS можно забыть навсегда, что я в своё время и сделал. Другое дело, если хостинг не позволяет использовать серверные скрипты - тогда придётся всю обработку проводить на стороне клиента. Итак вводные данные

  1. сайт на народе
  2. сделать код как можно более простым

Таким образом, немного подумав, я решил помочь старому боевому товарищу - вот что у меня получилось

<a href=”#” onClick=”popupImage(’image.jpg’)”>
<img src=”imageTN.jpg” alt=”clickIt!” border=”0″>
</a>

Это тот самый краеугольный камень - ссылка, отрабатывающая выполнение функции popupImage() , параметром которой является абсолютный, относительный путь или URL открываемой картинки. Вставлять её можно где заблагорассудится, не забыв подключить JS-библиотеку

<SCRIPT LANGUAGE=”JavaScript” src=”lib.js”></SCRIPT>

Теперь поподробнее, как это работает.
Функция popupImage() открывает в отдельном окне страницу popup.html размером 100х100 и передаёт ей путь/к/картинке в виде GET-переменной. Т.о. адресная строка выглядит как popup.html?pic=/path/to/your/image.jpg

После того, как код страницы popup.html загружен в браузер, посредством обработчика onLoad вызывается функция loadImage() , которая простеньким регэкспом чикает адресную строку, вырезая из неё то, что нам нужно - собственно /path/to/your/image.jpg , обявляет переменную im , которая является ссылкой на дескриптор с ID=targetImage . Обратитевнимание, что переменная объявляется в глобальной области видимости, т. к. она понадобится в следующей функции. Следующей строкой загружается картинкаim.src = pic[1];

И, наконец, вуаля! Когда картинка загрузилась полностию, и размеры её уже известны браузеру, посредством обработчика onLoad, повешенного на дескриптор IMG, вызывается функция windowResize() , которая и ресайзит окно в соответствии с пиксельным размером картинки. Из-за использования разными браузерами разных объектных моделей пришлось немного усложнить код для использования его в разных типах браузеров

Ниже - содержание файла той самой библиотечки lib.js


// возвращает ID элемента
function getId(id) {
if (typeof(document.getElementById) != ‘undefined’) {
return document.getElementById(id);
} else {
return document.all[id];
}
}
// определение типа браузера
function getBrowser(){
var b = navigator.appName;
var name = null ;
if (b==’Netscape’){
name = ‘N’;
}else if(b==’Microsoft Internet Explorer’){
name = ‘IE’;
}else if (b==’Opera’){
name = ‘O’;
}
return name;
}
// самая главная функция)
// открывает окно размером 100х100
function popupImage(imagePath){
var w = ‘popup.html?pic=’+imagePath;
var arg = ‘toolbar=no,’;
arg+= ‘location=no,’;
arg+= ‘directories=no,’;
arg+= ’status=yes,’;
arg+= ‘menubar=no,’;
arg+= ’scrollbars=no,’;
arg+= ‘resizable=yes,’;
arg+= ‘copyhistory=no,’;
arg+= ‘width=100,’;
arg+= ‘height=100′;
window.open(w,”,arg);
}
// тоже интересно - разбирает адресную строку, выковыривая из неё путь к картинке
function loadImage(){
var addr = document.location.toString() ;
var reg = /\?pic=/;
var pic = addr.split(reg);
im = document.getElementById(’targetImage’);
im.src = pic[1];
}
// и наконец приводит окно в соответствии с размерами изображения
function windowResize(){
var n = getBrowser();
if (n==’N'){
window.innerWidth = im.width;
window.innerHeight = im.height;
}else if (n==’IE’){
window.resizeTo(im.width , im.height);
}else if (n==’O'){
window.resizeTo(im.width+10 , im.height+30);
}
}

А это содержание страницы popup.html, которая и открывается в отдельном окне

<HTML>
<SCRIPT LANGUAGE=”JavaScript” src=”lib.js”></SCRIPT>
<BODY topmargin=”0″ leftmargin=”0″ marginheight=”0″ marginwidth=”0″ onLoad=”loadImage()”>
<TABLE cellspacing=”0″ cellpadding=”0″ border=”0″ height=”100%” align=”center”>
<TR><TD>
<A href=”#” onClick=”window.close();”>
<img src=”" alt=”closeIt!” border=”0″ id=”targetImage” onLoad=”windowResize()”>
</A>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>

Написав это всё и потестив, выяснил некоторые плюсы этого подхода, против использовавшегося ранее (серверная обработка)

  1. новое окно открывается в минимальном размере и принимает свой нормальный размер, только когда картинка уже загружена полностью. То есть пока картинка грузится, ничего не мешает смотреть страницу
  2. Из-за отсутствия серверной обработки работает на всех хостингах, даже на народе

must have! Вольно, по распорядку

Примечание такое - файлу popup.html лучше дать какое-нибудь другое название, дабы его не резали рекламорезалки.

Типа типограф

Thursday, March 8, 2007

- Это “Типограф”?
— Нет, это «Типограф»!

На эту идею подсадил меня один известный товарищ

Было решено тут же прикрутить такую же штуку к блогу. Искать готовую я не решился, а решил с кандачка написать свой плагин. Plugin API вордпресса оказался простым до безобразия, чем я и не преминул воспользоваться, тем более, что давно пользую функцию неизвестного мне товарища. Спасибо ему, оформление ея в плагин заняло несколько минут.