არქივი January, 2009

JavaScript WTF Vol. 5 – magic of onchange event

ხშირად იყენებთ HTML ფორმის ელემენტების ამ ივენთს? :) და რა შემთხვევაში? ალბათ უფრო SELECT ელემენტთან მუშაობისას ხომ? თქვენი არ ვიცი მაგრამ ჩემს პირად პრაქტიკაში განსაკუთრებული გამოყენება ამ ივენთს არ ჰქონია… თუმცა ორიოდე დღის წინ ყველაფერი შეიცვალა და ჩემთვის ერთი ფრიად საინტერესო აღმოჩენა გავაკეთე.

ასეთი რამ გინახავათ?

<div onchange="handleEvent()">
//some other markup
</div>

დამეთანხმებით რომ ერთი შეხედვით ამ ივენთის DIV ელემენტთან გამოყენება ცოტა არ იყოს უცნაურია ხომ? რა ცვლილება უნდა მოხდეს ისეთი DIV ელემენტში რომ მისი დამუშავება მოვახდინოთ ამგვარი გზით? ან დავუშვათ და მოხდა ასეთი ცვლილება მაგრამ რანაირად?

მინდა გაგახაროთ და გითხრათ, რომ, პასუხი მარტივია. DIV ელემენტში არანაირი ასეთი ცვლილება არ მოხდება, მაგრამ, თუ მის შიგნით გვაქვს რადმენიმე SELECT და INPUT ელემენტი რომელთა ცვლილების კონტროლი გვესაჭიროება ეს კოდი მომენტალურად იდეალურ გადაწყვეტად იქცევა!

კლასიკურად უფრო სწორად ძველი სკოლის მიდგომით ასეთი ამოცანის გადაჭრის დროს ყველა, SELECT და INPUT ელემენტის onchange ივენთს მივანიჭებდით ჰენდლერს. თუმცა თუ გავიხსენებთ ფაქტს რომ DOM დოკუმენტში ხდომილება ვრცელდება საწყისი ელემენტისგან(ელემენტი რომელზეც უშუალოდ მოხდა ესა თუ ის მოვლენა) ანუ ელემენტების იერარქიაში ქვევიდან ზევით, ჩემს მიერ ნაჩვენები კოდიც მომენტალურად პრაქტიკულ დანიშნულებას შეიძენს. ამ ინფორმაციაზე დაყრდნობით შესაძლებელია ასეთი კოდის დაწერა:

1
2
3
4
5
6
7
8
9
10
<div id="container">
   <input type="text" name="f1" />
   <br />
   <input type="text" name="f2" />
   <br />
   <select name="s1">
       <option value="v1">Value 1</option>
       <option value="v2">Value 2</option>
   </select>
</div>

ნაჩვენები კოდის შესაბამისი ამოცანა მდგომარეობს ყველა INPUT და SELECT ელემენტის onchange ივენთის დაჭერასა და შესაბამის დამუშავებაში. ნაცვლად იმისა რომ გამოვიყენოთ სათითაოდ ყველა ელემენტს onchange ივენთი, მარტივად შეგვიძლია გავაკეთოთ შემდეგი რამ:

1
2
3
4
5
6
7
8
9
10
11
12
13
document.getElementById('container').onchage = function(e) {
   
   //მოვიპოვოთ Event ობიექტი
   e = e || window.event;
   
   //მოვიპოვოთ საწყისი ელემენტი რომელზეც უშუალოდ დაფიქსირდა ივენთი
   var targetElement = e.target || e.srcElement;

   //თუ ელემენტი არის SELECT ან INPUT ტიპის შევასრულოთ დანარჩენი სამუშაო
   if (/^input|select$/i.test(target.nodeName)) {
       //do something here
   }
}

დამეთანხმებით რომ ძალიან მარტივია ყველა ელემენტის ცვლილების ამდაგვარი ცენტრალიზებული კონტროლი. ეს არის ზუსტად ე.წ. Event Delegation მოდელი რომელიც ძალიან პოპულარულია დღესდღეობით. რატომ არ ვიცი მაგრამ ჩემთვის onchange ივენთი იმდენად ცალსახად იყო ასოცირებული ფორმის SELECT ელემენტთან რომ მისი ამდაგვარი გზით გამოყენების შესახებ არასოდეს მიფიქრია, თუმცა საბოლოო შედეგმა ყოველგვარ მოლოდინს გადააჭარბა.

იმედია ეს პირადად ჩემთვის ჭკუის სასწავლებელი შემთხვევა თქვენთვისაც სასარგებლო იქნება.

enjoy :)

ტეგები: , ,

ქართული Tech(ნოლოგიური) ბლოგები

თითქმის წელიწად ნახევარი გავიდა მას შემდეგ რაც ქართული ტექნოლოგიური ბლოგების სიმცირის შესახებ დავწერე. რა შეიცვალა მას შემდეგ? სამწუხაროდ მინდა ვაღიარო რომ განსაკუთრებული არაფერი არ შეცვლილა. ამ დროის მანძილზე გამოჩნდა რამდენიმე ასეთი ბლოგი მაგრამ მხოლოდ რამდენიმე :(

რა გვჭირს? რატომ ვართ ასეთი ჩაკეტილები და რატომ არ ვწერთ? მესმის, ძალიან კარგად მესმის დროის სიმცირის ფაქტორი, მაგრამ, როგორ ახერხებენ ამ სფეროში ცნობილი დასავლელი კოლეგები თავიანთი ძირითადი საქმეების, კონფერენციებისა და სხვა აქტივობის პარალელურად ბლოგერობას? რატომ ვერ ვღებულობთ ჩვენ ამ შესანიშნავ საშუალებას ისე როგორც ეს ხდება სხვაგან? არა, არ იფიქროთ რომ ვინმეს ჭკუას ვარიგებ და ა.შ. სპეციალურად ვწერ მრავლობით რიცხვში და ჩემს თავსაც მოვიაზრებ როდესაც ვწერ “ჩვენ”. მინდა გითხრათ რომ ძალიან დიდ სიამოვნებას მანიჭებს ბლოგზე თუნდაც იშვიათად წერა, მცირე მაგრამ შეძლებისდაგვარად სასარგებლო საქმის კეთება GeoKBD – ს სახით და ა.შ. მაგრამ არც ეს მგონია საკმარისი.

დაახლოვებით 2005 წლიდან გავხდი ბლოგების აქტიური მკითხველი, შედარებით მოგვიანებით მე თვითონ დავიწყე წერა და რა მივიღე ამ წლების მანძილზე? რამდენიმე ძალიან მნიშვნელოვანი რამ: 1) მივიღე უზარმაზარი ცოდნა ისეთი ადამიანებისგან რომლებსაც არ ეზარებათ საკუთარი გამოცდილების გაზიარება; 2) ვისწავლე უკეთ წერა(არასოდეს არ გამოვირჩევოდი კარგი წერით და ძალიან ბევრი ხარვეზი მაქვს ამ მხრივ დღესაც) და აზრის უკეთ გადმოცემა; 3) დავინახე რომ თუნდაც ის მცირედი რასაც ამ ბლოგის მეშვეობით ვაკეთებ თურმე სასარგებლოც კი ყოფილა სხვა ადამიანებისთვის.

რა ვქნათ ახლა? კიდევ ერთხელ გავაკეთო მოწოდება? :D მოგიწოდებთ! კატეგორიულად მოგიწოდებთ! ჩვენ თავად თუ არ გავაუმჯობესეთ და არ შევცვალეთ ატმოსფერო ამ სფეროში, თუ არ გავხდით უფრო გახსნილები და ვიქნებით ასეთი კარჩაკეტილები ყოველთვის 10 წლით უკან ვიქნებით რაც დამეთანხმებით რომ ძალიან არასასიამოვნოა :D

P.S.
რამდენიმე ბლოგი რომელიც ამ პერიოდის მანძილზე შეიქმნა:

Georgian Game developers unite!
ActionScript.GE
გოდეს ინტერნეტ დავთარი
Blog for web developers
LedTechDesign

მეტი ახალი ბლოგები არ ვიცი და თუ მომაწოდებთ დიდად დამავალებთ :)

ტეგები:

PHP: Document Root for FTP Client?

ვებ სერვერზე PHP – თი ფაილებთან მუშაობა არაერთ სიურპრიზს გვთავაზობს, რაც ზოგჯერ საინტერესოა ზოგჯერ კი მართლა მოსაბეზრებელი :) თუმცა არის ერთი საკითხი რაზეც ამჯერად შევაჩერებ თქვენს ყურადღებას.

სერვერზე ფაილებთან მუშაობა PHP – ს შესაბამისი ფუნქციებით(fopen, fwrite, touch და ა.შ) საკმაოზე უფრო მოუხერხებელია უსაფრთხოების დეტალების გამო. არავისთვის არ წარმოადგენს საიდუმლოს რომ ვებ სერვერზე განთავსებულ ფაილებს უნდა გააჩნდეთ შექმნის, ჩაწერის, წაკითხვისა და წაშლის შეზღუდვები.

ასეთ შემთხვევაში ფაილებთან მუშაობის ერთადერთ სწორ და ეფექტურ გზად რჩება PHP FTP მოდულის გამოყენება, ან soeket – ებზე დაყრდნობით შექმნილი შესაბამისი რეალიზაციის გამოყენება, რაც ფაქტიურად ერთი და იგივეა. სრულად »

ტეგები:

გილოცავთ ახალ წელს! :)

ყველას გილოცავთ ახალ 2009 წელს! გისურვებთ ბედნიერებას, სიხარულს და წარმატებას ნებისმიერ ასპარეზზე!

ვისურვებდი რომ 2009 წელი ყოფილიყოს 2008 – ზე გაცილებით უკეთესი. ჩემთვის პირადად გასული წელი ძალიან ცუდიც იყო და ძალიან კარგიც, არც კი ვიცი რომელი ჭარბობს მაგრამ ვისურვებდი რომ ის ცუდი რაც 2008 წელს ვიხილე აღარასოდეს აღარ მეხილა და იგივეს ვუსურვებ ყველას ვინც კი ამ ბლოგს კითხულობს/წაიკითხავს/არ წაკითხავს და ა.შ. მოკლედ ყველას ყველას ყველას :) :)

აბა კიდევ ერთხელ ყველას გილოცავთ ახალ წელს :)

ტეგები: