Имах ужасно напрегната седмица, в която за 3-4 дни трябваше да се нахвърли едно приложенийце лежащо основно върху GoogleMaps и ajax заявки. Та реших да споделя някои неща, които по един или друг начин ми помогнаха да свърша работата (надявам се) добре и в крайно кратки срокове. По-долу примерите ползват основно jQuery.
Closures
Тук са разяснени доста подробно. Аз само ще се опитам да ги обясня с няколко мои думи.
Нека вземем следния пример:
var foo = "foooo";
setTimeout (function(){
alert (foo); // "foooo"
}, 100);
При изпълнението на анонимната функцията в setTimeout тя има достъп до всички променливи в контекста на обявяването и. Това е нещо изключително полезно, и спестяващо доста код, особено при закачане на различни събития.
Тук обаче има една важна подробност - да вземем следния пример ползващ jQuery, да прихване click събитие на различни елементи с id от ID0 до ID3 и да покаже съответният текст от arrayText:
var arrayText = ["text0", "text1", "text2", "text3"];
for (var i=0; i < arrayText.length; i++) {
$("#ID" + i).click(function(){
alert (someArray[i]) // undefined
});
};
Проблема идва от това, че (с най-прости думи) в момента в който се изпълни click събитието стойността на i е вече 4.
Естествено, ние не се отчайваме защото има сравнително лесно решение:
var arrayText = ["text0", "text1", "text2", "text3"];
for (var i=0; i < arrayText.length; i++) {
(function(){
var text = arrayText[i];
$("#ID" + i).click(function(){
alert (text) // правилният текст е тук
});
})();
};
Така затворихме критичните обръщения към променливи в анонимна функция, която запазва правилния контекст. Готино.
LowPro & liveQuery
LowPro и liveQuery са два изключително полезни плъгина за jQuery, когато се налага голямо количество генериране на DOM елементи и обработка на събития. Нека илюстрираме:
myHandler = $.klass({ // дефинираме LowPro handler
onclick: function (e) {
return confirm ("Are you sure?");
}
});
$("a").attach(myHandler); // прикачване на по-горе дефинирания код за всички A тагове на страницата
Нищо особено на пръв поглед. Но... LowPro автоматично следи за наличието на liveQuery и горния код ще се изпълнява и за всички динамично добавени A тагове. Готино. Няма повече да се следи пристигналият с ajax html от сървъра и да му се прикачат на ново събитията. А и кода е прилично отделен и лесен за доработка и ползване.
Google Maps API
Въпреки, че API-то е прекрасно направено, ми се стори че има някои странни неща. Например GMarkerManager.removeMarker(marker) само скрива дадения маркер, а не го маха от DOM-а и от markerManager-a. Странно.
Освен това си мисля, че щеше да е добре на GMap2.panTo(), да може да му се закача един callback, изпълняващ се след като картата се е преместила до желаната позиция.
Малко ми се наложи и да разширя GMarker обекта, но това става лесно:
GMarker.prototype.setMyProperty = function (newValue) {
this.myProperty = newValue;
}
GMarker.prototype.getMyProperty = function () {
return this.myProperty;
}
Готино. OOP в действие
И още...
Пишете четлив код. Дори когато бързате адски. Струва си всяка отделена секунда.
А за коментарите си знаете
И още нещо - ако една функция е по-дълга от екрана и се налага да скролиратe за да видите началото и края - значи нещо не е наред