Handling “onchange” event revisited

რამდენიმე თვის წინ დავწერე პოსტი, HTML ფორმის ელემენტის onchange ივენთისა და მისი დელეგირების შესახებ.

ნახსენებ პოსტში ნაჩვენებია onchange ივენთის დელეგირების მაგალითი სადაც ფორმის ყველა ელემენტის აღნიშნული ივენთის ცენტრალიზებული კონტროლი ხორციელდება მშობელი ელემენტის onchange ივენთის მეშვეობით.

მსგავსი შედეგის მიღწევა შესაძლებელი ე.წ. Event Bubbling – ის წყალობით რაც ივენთის, საწყისი ელემენტიდან მშობელი ელემენტისკენ გავრცელებას ეწოდება. მეტი თვალსაჩინოებისთვის იხ. სურათი(სურათისათვის განსაკუთრებული მადლობა ირაკლის):

picture-17

ივენთის გავცელების(შვილიდან მშობლის მიმართულებით) ასეთი მეთოდი ყველა ბრაუზერში ერთნაირად მუშაობს. და წესით ეს უნდა ეხებოდეს ყველა ტიპის ივენთს. თუმცა როგორც მოსალოდნელი იყო IE – ში მისი მერვე ვერსიის ჩათვლით სწორედ ამ ივენთზე აღმოჩნდა შეზღუდვა და იგი საწყისი ელემენტს(ელემენტი რომელზეც უშუალოდ წარმოიშვა ეს ივენთი) იქეთ არ ვრცელდება.

ერთი შეხედვით, ამ ჩიხიდან რამდენიმე გამოსავალი შეიძლება მოიძებნოს:

  1. ფორმის ყველა ელემენტის ჩამოვლა და მათთვის onchange ივენთ ჰენდლერის მინიჭება. თუმცა აქ მთელ რიგ პრობლემებს წავაწყდებით:

    • ელემენტებზე ასეთი გზით ივენთ ჰენდლერების მინიჭება IE – ში იწვევს მეხსიერებასთან დაკავშირებულ პრობლემებს, ე.წ. memory leaks. ეს გარემოება განსაკუთრებით მნიშვნელოვანია თუ ფორმაში ბევრი ელემენტები გვაქვს.
    • თუ ფორმის ელემენტები იტვირთება დინამიურად Ajax – ის მეშვეობით, ყოველი ასეთი ჩატვირთვის შემდეგ საჭიროა: ა) ყველა ფორმის ელემენტისა და მათი ივენთ ჰენდლერების განადგურება რათა თავიდან ავირიდოთ მეხსიერებასთან დაკავშირებული პრობლემები; ბ) ახლად ჩატვირთული ელემენტების იტერაცია და მათთვის შესაბამისი ივენთ ჰენდლერების განსაზღვრა.

    დამეთანხმებით რომ აღწერილი ორი მეთოდი დიდი მოქნილებით არ გამოირჩევა.

  2. ნაცვლად onchange ივენთისა გამოვიყენოთ onfocus და onblur ივენთები. თუმცა აღმოჩნდა რომ არც ამ ივენთების გავრცელება არ ხდება ტრადიციული(შვილიდან მშობლის მიმართულებით) მეთოდით.

გარკვეული კვლევა ძიების შემდეგ მივაგენი ისეთ ივენთებს(დიდი მადლობა PPK – ს) რომელთა ბაბლინგი IE – ში ისე მუშაობს როგორც საჭიროა. ეს ივენთებია onfocusin და onfocusout.

როგორ შეიძლება აღნიშნული ივენთების გამოყენება პრობლემის გადასაჭრელად? სანამ უშუალოდ კოდის წერას დავიწყებთ საჭიროა კარგად გავერკვეთ თუ როგორ მუშაობს onchange ივენთი HTML ფორმის ცალკეული ელემენტებისათვის და ასევე თუ რა გვერდის ავლის მექანიზმების გამოყენებაა შესაძლებელი IE – ში.

SELECT ელემენტი

ამ ელემენტის შემთხვევაში onchange ივენთი წარმოიშვება მხოლოდ იმ ჩამოსაშლელი სიიდან კონკრეტული ელემენტის ამორჩევის დროს. IE – ში იგივე ხდომილების ემულაციისათვის შესაძლებელია onclick ივენთის გამოყენება, თუმცა, ასეთ შემთხვევაში ივენთი ორჯერ წარმოიშვება ერთხელ ელემენტის გააქტიურებისას ხოლო მეორედ ჩამოსაშლელი სიიდან მნიშვნელობის არჩევისას. თუმცა ამ პრობლემის არიდება მარტივად არის შესაძლებელი სწორედ onfocusin და onfocusout ივენთების მეშვეობით რადგან ეს ორივე ივენთი წარმოიშვება onclick ივენთამდე, გამომდინარე აქედან შესაძლებელია წინა ივენთის ტიპის დამახსოვრება და შემდგომ უკვე დადგენა ეს იყო პირველი კლიკი თუ ჩამოსაშლელი მენიუდან ელემენტის არჩევა მოხდა?

INPUT text და TEXTAREA ელემენტები
ამ ელემენტების შემთხვევაში onchange ივენთი წარმოიშვება როდესაც ელემენტი კარგავს ფოკუსს. IE – ში იგივეს მიღწევა შესაძლებელია onfocusout ივენთის მეშვეობით.

INPUT checkbox და radio ელმენტები
ამ ელემენტების შემთხვევაში onchange ივენთი წარმოიშვება მათი მნიშვნელობის ცვლილების თანავე. IE – ში იგივე შედეგის მისაღებად მარტივად არის შესაძლებელი onclick ივენთის გამოყენება.

მაშ ასე წინა სამი პარაგრაფში გამოიკვეთა სამი ისეთი ივენთი რომელთა გამოყენებაც შესაძლებელია onchange ბაბლინგის ემულაციისათვის. ეს ივენთებია: onclick, onfocusin, onfocusout.

ამ ინფორმაციაზე დაყრდნობით მარტივად არის შესაძლებელი სულ რამდენიმე სტრიქონი კოდით გადავწყვიტოთ პრობლემა:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(function() {
   
   var div = document.getElementById('testonchange');
   
   //ყველა ბრაუზერი IE - ს გარდა
   if (document.addEventListener) {

      div.onchange = function(e) {
         //აქ შეგვიძლია გამოვიძახოთ ივენთის უშუალო ჰენდლერი
      };

   } else { //IE - ს სპეციფიური რეალიზაცია
     
      var previousEvent = null;
     
      div.onfocusin = div.onfocusout = div.onclick = function() {

         var e            = window.event,
            target       = e.srcElement,
            isSelect     = target.nodeName  == 'SELECT',
            notTextInput = target.nodeName  == 'INPUT' && /^radio|checkbox$/i.test(target.type),
            isTextInput  = (target.nodeName == 'INPUT' && target.type == 'text') || target.nodeName == 'TEXTAREA',
            validElement = notTextInput || isSelect;

         if (isSelect && !target.size && /^focus(in|out)$/.test(previousEvent)) {
            validElement = null;
         }

         previousEvent = e.type;

         if ((e.type == 'click' && validElement) || (e.type == 'focusout' && isTextInput)) {
            //აქ შეგვიძლია გამოვიძახოთ ივენთის უშუალო ჰენდლერი
         }

      };

   }
   
   div = null;
   
})();

ეს არის და ეს :) კოდის დეტალური გარჩევით თავს აღარ შეგაწყენთ, ხოლო რეალური დემონსტრაცია შეგიძლიათ იხილოთ აქ.

ტეგები: , ,

JavaScript: Regex and Multi-line Mode

დღეს აღმოვაჩინე რომ JavaScript – ის Regex იმპლემენტაციას გარდა სხვა ნაკლოვანებებისა ასევე არ გააჩნია ე.წ. “multi-line match mode”. ამ შემთხვევაში ლაპარაკი არ მაქვს რეგულარული გამოსახულების “m” მოდიფიკატორის მხარდაჭერაზე, ლაპარაკი მაქვს “s” მოდიფიკატორზე რომელიც “.“(წერტილი) სიმბოლოს აიძულებს გარდა სხვა სიმბოლოებისა(ნაგულისხმევად “.” ნიშნავს “ნებისმიერი სიმბოლო გარდა ახალი სტრიქონის სიმბოლოსი”) ასევე მოძებნოს ახალი სტრიქონის სიმბოლო.

ჩემი მარტივი ამოცანის გადასაჭრელად საჭირო იყო მოცემულ ტექსტში მეპოვა შემდეგი ტიპის მონაკვეთი:

1
2
3
function myFunction($param1, $param2) {
      return array($param1, $param2);
}

ხოლო ნაპოვნი მონაკვეთიდან ამომეღო {code}{/code} ტაგებს შორის მოქცეული ტექსტი. თუმცა ეს გასაგები მიზეზების გამო არ გამომივიდა.

ნებისმიერ PCRE – სთან თავსებად იმპლემენტაციას გააჩნია “s” მოდიფიკატორი რომლის მეშვეობითაც მსგავსი ამოცანა წყდება ძალიან მარტივად. მაგალითად PHP – ში რეგულარულ გამოსახულებას ჩავწერდით შემდეგნაირად:

1
2
3
//ყურადღება მიაქციეთ გამოსახულების ბოლოში
//მიწერილ "s" სიმბოლოს
$regex = '/{code lang="(\w+)"}(.*?){\/code}/s'

სამწუხაროდ ასეთ გამოსახულებას JavaScript – ში ვერ დავწერთ. თუმცა, ცოტაოდენი კვლევაძიებისა და ექსპერიმენტების შემდგომ მივაგენი გამოსავალს რაც გამოიხატება სპეციფიური ე.წ. character class – ის გამოყენებაში. ამისათვის საჭიროა “\s” და “\S” მეტა სიმბოლოების დაჯგუფება character class – ში. შედეგად მივიღებთ შემდეგ გამოსახულებას:

1
[\s\S]

სადაც “\s” შეესაბამება ნებისმიერ უხილავ სიმბოლოს, ხოლო “\S” შეესაბამება ნებისმიერ არა უხილავ სიმბოლოს.

შედეგად მივიღე ასეთი JavaScript – ის რეგულარული გამოსახულება:

1
/{code\s+lang="(\w+)"}([\s\S]*){\/code}/

ეს გამოსახულება მუშაობს ანალოგიურად PCRE – სთან თავსებადი გამოსახულებისა რომელიც იყენებს “s” მოდიფიკატორს.

ტეგები: ,

bmu.li

bmuli_logoესე იგი, იშვიათად თუ მახარებს რაიმე ქართულ ვებში, თუმცა გუშინ ირაკლი შემომეხმიანა და თავისი ახალი პროექტის შესახებ შემატყობინა ეს არის სოციალური სერვისი სახელად ბმუ.ლი. რა საჭიროა ასეთი სერვისი? იხ. ციტირება სერვისის ვებ საიტიდან:



წარმოიდგინეთ, რომ Amazon.com-ზე იპოვეთ საინტერესო ფოტო-კამერა, და გნებავთ მეგობარს გაუგზავნოთ მასზე ლინკი SMS-ით. Amazon-ის მისამართები საკმაოდ გრძელია და დაახლოებით ასე გამოიყურება:

http://www.amazon.com/Canon-Digital-Camera-18-55mm-3-5-5-6/dp/B0012YA85A/ref=sr_1_1? ie=UTF8&s=photo&qid=1239587390&sr=1-1

ცხადია ამხელა მისამართს SMS-ში არავინ აკრეფს. ამიტომ, თქვენ შეგიძლიათ შეამოკლოთ ის bmu.li-ს საშუალებით, რის შედეგადაც მიიღებთ მოკლე მისამართს, მაგალითად: http://bmu.li/ss4 რომლის SMS-ით გაგზავნაც არანაირ პრობლემას აღარ წარმოადგენს.
bmu.li მხოლოდ SMS-ისთვის არ არის სასარგებლო. იგი შეგიძლიათ გამოიყენოთ ყველგან სადაც გრძელი მისამართების გაცვლა მოუხერხებელია: ფორუმებზე, ბლოგებზე, სოციალურ ქსელებში (ფეისბუკი, ოდნოკლასნიკი და სხვ.), ტვიტერში, იმეილში, გაზეთებში, რადიოს და სატელევიზიო რეკლამებში და გამოშვებებში ან თუნდაც მეგობრისთჳის ფურცლის ნაგლეჯზე მისამართის უცებ დასაწერად.

ყველაფერი ძალიან მარტივია. ამ სერვისის მეშვეობით შეგვიძლია წარმატებით დავამოკლოდ უსაშველოდ გრძელი და გაუგებარი URL – ები სულ რაღაც 10 სიმბოლომდე(http:// პრეფიქსის გამოკლებით) და გამოვიყენოთ უამრავ შემთხვევაში.

მოკლედ ძალიან, ძალიან სასარგებლო სერვისია რომელიც აუცილებლად გამოგადგებათ და იმედია სათანადოდ დავაფასებთ სულ ცოტა ხანში :)

ასევე მინდა ცოტათი გავთქვა ინსაიდერული ინფორმაცია და გითხრათ, რომ, სულ ცოტა ხანში კიდევ რამდენიმე საინტერესო სირპრიზი დაემატება სერვისს რაც კიდევ უფრო კომფორტულს გახდის მის მოხმარებას.

ასე რომ Hold on B-)

ტეგები:

HTML Form “elements” Property

ამ პოსტის დაწერამდე რამდენიმე წუთით ადრე წავაწყდი HTML form ელემენტის elements თვისებასთან დაკავშირებულ ერთ პრობლემას(შეცდომას) რომლის შესახებაც აქამდე არაფერი მსმენია და ცოტა არ იყოს უაზროდ დამახარჯინა დრო.

ცნობილია, რომ form ელემენტის აღნიშნული თვისება არის HTMLCollection ტიპის კოლექცია და იგი შეიცავს კონკრეტული HTML ფორმის შიგნით გამოყენებულ ყველა(input, select, button) ელემენტს. სწორედ ეს კოლექცია წარმოადგენს საჭირო ფორმის ელემენტებთან წვდომის ყველაზე უსაფრთხო(თურმე პირობითად) გზას.

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

ჩემი ამოცანა მდგომარეობდა შემდეგში, რომ ფორმის ყველა ელემენტებისაგან მიმეღო მათი სახელებისა და მნიშნვნელობების ე.წ. key/value ობიექტი:

1
2
3
4
5
var map = {}, els = target.form.elements;
for (var i = 0, el; (el = els[i++]);) {
   map[el.name] = el.value;
}
console.log(map);

თუმცა ძალიან უცნაური შედეგი მივიღე რადგან fieldset ელემენტს არც name და არც value თვისებები არ გააჩნია.

პრობლემის იდენტიფიცირების შემდგომ ინტერნეტში მოვიძიე მცირეოდენი ინფორმაცია:

The HTML 4 standard adds new <fieldset> and <label> tags to the set of elements that can appear within a form. In IE 5 and later, placing a <fieldset> in a form causes a corresponding object to be added to the form’s elements[] array. Fieldset elements are not scriptable in interesting ways like other form elements are, and their objects do not have a type property like other form elements do. Therefore, the presence of Fieldset objects in the elements[] array seems like a mistaken design decision. This is particularly true since <label> tags do not cause corresponding objects to be added to the elements[] array. The Mozilla and Netscape 6 browsers have chosen to follow Microsoft’s lead on this in order to be compatible with IE.

What this means is that if you define a form that contains fieldsets, the contents of the elements[] array differ in recent, HTML 4-capable browsers and in older, pre-HTML 4 browsers. In this situation, using position-based numeric indexes in the elements[] array is not portable, and you should define name attributes for all your form elements and refer to them by name.

მოკლედ კვლავ IE :D ნუ რას ვიზამთ რეალობა ასეთია :P

ტეგები: , ,

YouTube EDU და ბევრი საინტერესო მასალა პროგრამისტებისათვის

youtubeedu-215x53 დღეს YouTube – მ დასტარტა ახალი სევერისი YouTube EDU. ეს არის შესანიშნავი საგანმანათლებლო რესურსი რომელზეც უკვე შესაძლებელია არაერთი შესანიშნავი ლექციისა თუ ლექციების კურსის ნახვა.

ძალიან გამეხარდა და მომეწონა რომ აღნიშნულ რესურსზე წარმოდგენილია ისეთი მოწინავე ტექნოლოგიური უნივერსიტეტების სასწავლო მასალა როგორიც არის მაგ. MIT.

ძალიან დიდი დრო არ დამიხარჯავს, თუმცა მოვასწარი MIT – ის გვერდზე განთავსებული კურსის MIT 6.046J / 18.410J Introduction to Algorithms (SMA 5503) პირველი ლექციის მოსმენა და მინდა გითხრათ რომ უსაზღვროდ მომეწონა. საოცარი ლექტორია საოცარი გადმოცემის უნარითა და ლექციის წაყვანის მანერით.

გარდა მაგ კურსისა თუ დაძებნით სხვა უამრავ საინტერესო მასალასაც მიაგნებთ.

enjoy :)

ტეგები:

საინტერესო ვაკანსია jobs.ge – ზე :D

მიუხედავად იმისა რომ სამსახურს არ ვეძებ მაინც საკმაოდ ხშირად ვსტუმრობ jobs.ge – ს. ამას მარტივი მიზეზი აქვს, მაინტერესებს თუ რა ტიპისა და რანგის ვაკანსიებია ინფორმაციული ტექნოლოგიების სფეროში. თუმცა ზოგჯერ მართლა გასაოცარ მარგალიტს შეიძლება წააწყდე :D

მოკლედ ერთ ასეთ ვაკანსიას წავაწყდი დღეს:

IBS (Integrated Business Solutions) is a Georgian official business partner of 1C and business partner of 1C-bitrix, the software business firm offering automated business systems. IBS is pleased to announce a vacancy for for the full-time position of Web Programmer/Designer.

Responsibilities:

** Learn 1C-bitrix software solutions
** Prepare the sites in compliance with 1C-bitrix and according to the client demand
** Carry out all duties defined by the Manager on time.

Requirements:

** Relevant higher education (preferably in web design field)
** At least 6 months work experience as a Web Programmer/Designer
** Knowledge of the following program languages: HTML, GSS, JavaScript, PHP, Ajax, Asp.Net
** Excellent knowledge of Russian language (ability to analyze Russian texts and strong knowledge of spoken Russian)
** English language knowledge is desirable
** Strong sense of responsibility, organized person
** Programming skills
** Ability to work in a team
** Time management skills.

მისამართი: http://www.jobs.ge/17376/

რითი მიიქცია ამ ვაკანსიამ ყურადღება? :D ჩამოთვლილი პუნქტებიდან ორმა ფრიად მომხიბლა:

** Relevant higher education (preferably in web design field)

ისა რომელ უმაღლესში ასწავლიან ამას? :D შეიძლება ასწავლიან და არ ვიცი თუ მეტყვით კარგი იქნება :D

** Knowledge of the following program languages: HTML, GSS, JavaScript, PHP, Ajax, Asp.Net

ესე იგი Knowledge of the following program languages როგორ უნდა გავიგოთ? პროგრამის ენები? ეგება პროგრამირების ენები უნდა იყოს? :D

კიდევ საინტერესოა GSS რომელი “პროგრამის” ენაა? :D

ასევე საინტერესოა Ajax პროგრამისა თუ პროგრამირების ენაა? ან ენაა საერთოდ? :P

ტეგები: