conio-то
Правя първите си плахи стъпки в работата на релси. Темата за руби - как, защо и дали е много дълга, и тема на отделен постинг, но реших да драсна няколко бързи впечатления за prototype библиотеката.
По времето, когато напъплиха prototype, dojo и yui имах чисто изследователски интерес (с елементи на крадене) към тях, но нямах мегдан за употреба. Сега обаче имам няколко крайни апликации на тезгяха, и ща не ща, ми се наложи да добавя щипка аякс и малко rich ui елементи. Доджото ме накара да повърна, след като качих сайта на production и видях как един прост календар бави страницата с близо половин минута. Не мога да повярвам колко блоутната е станала цялата история - дори документацията (изградена с доджо контролите) кара компютъра ми да забива. Наложи се да преправям по среди нощите календара и да го подменям с Yahoo!вския. Който също е зле, но (както казва Боби) нормално зле.
Enter ruby
$ rails my_app
В даден момент ми се случи следния Уй сценарий - таблица (за асп.нет потребителите - грид) със записи, една (в последствие повече) от колонките се редактират на място (за по-бързо). Почесох се замислено, и драснах
rails ajax tutorial в гугъла. След по-малко от половин час бях обзаведен с аяксифицирана табличка, която вади разни съобщения, казва учтиво на потребителя да почака и тем подобни екстри. При това - с няколко реда джаваскрипт, никой от които не копаеше из дебрите на xmlhttprequest-а. Case closed.
Всъщност почти не разбрах, че това се дължи на “вграденото” prototype.js в генерирания скелет. В крайна сметка нямаше и голямо значение, тъй като нещата си работеха. Ей така се включва прототайп в лейаута си (лейаут е нещо като готин master page в asp.net 2.0).
<%= javascript_include_tag “prototype” %>
След няколко дни ми се наложи да пипна още малко красотата по табличката, и реших да си разнообразя живота, използвайки прототайп. Функционалността беше простичка - редовете да имат hover, и да можеш да си ги маркираш/размаркираш цъкайки. Останах доволен от делото си:
function initToggle()
{
var tables = document.getElementsByClassName(\"listing\");
var toggle = function (e)
{
if (Event.element(e).tagName.toLowerCase() != \"td\") return;
(this.selected ? Element.removeClassName : Element.addClassName)(this, \"selected\");
this.selected = !this.selected;
}
var highlight = function (e)
{
Element.addClassName(this, 'hover');
}
var dim = function (e)
{
Element.removeClassName(this, 'hover');
}
tables.each(function (table)
{
$A(table.getElementsByTagName('tr')).each (function (row)
{
row.selected = false;
Event.observe(row, \"click\", toggle.bind(row));
Event.observe(row, \"mouseover\", highlight.bind(row));
Event.observe(row, \"mouseout\", dim.bind(row));
});
});
}
Event.observe(window, \"load\", initToggle);
Чистичко. Може би не най-доброто, но работи. Спести ми будаленската работа да детектвам браузъри и да се разправям с мултикаст евенти, да правя кловжури с прехвърляне на контекст и тн. Един от другите “хакове”, които цвъкнах беше следното парченце код:
$A($('Menu').getElementsByTagName('a')).each(function (link) {
if (location.href.indexOf(link.href) == 0) link.className = 'selected';
});
Маркира текущата секция в менюто (ако ползвате чисти урлта, което е неизбежно с релсите).
Като цяло съм доволен от коньото - лекичко, не пречи, помага по малко, без да връзва ръцете, обогатява джаваскрипта с конструкции, към които се пристрастяваш след малко руби.
Декември 21st, 2006 at 10:53 am
Усещам работата отива към “ооой коньо, коньоооо” след “котьото” оня ден по ФТВ…
Декември 21st, 2006 at 2:12 pm
Иха, изтървахме коня (Хататитла)!
Иначе то туй това дето си го написал не прилича на джаваскрипт хич вече! Ибахти релсите, ибахти коньото, бахти чудото. Трябваше и колата дизел да си я вземеш - common rail.
Декември 21st, 2006 at 10:48 pm
Яяя и Петьо падна жертва на addslashes()
Event.observe(row, \”click\”, toggle.bind(row));
Иначе кодът изглежда добре, но още го има гадното чувство на работа с DOMтъ. Гадното getElementsByTagName е подлудяващо. Пробвай jQuery!
$(”p.surprise”).addClass(”ohmy”).show(”slow”);
http://jquery.com/
Декември 21st, 2006 at 11:16 pm
Паднах жертва
. Ужасно ме мързи да ги оправям проклетите кави.
И да - ДОМа прозира. Което не е много много лошо. Жейкуерито е готино, ама в момента ми трябва прототайп зарад вградената аякс функционалност, yui зарад календара, и мой си добавки. Ако турна и едно жейкуери ще стане (цитат на Кръстю Лафазанов) яйца локва и кал. В обши линии това е и проблема на такива библиотеки - все нещо липсва.
Януари 19th, 2007 at 12:33 pm
И в прототайпа имало това от жКуерито - изглежда така:
$A($(’Menu’).getElementsByTagName(’a'))
става на
$$(’#Menu a’)