<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code.ge Blog &#187; JavaScript</title>
	<atom:link href="http://www.code.ge/posts/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.code.ge</link>
	<description>ბლოგი ვებ პროგრამირებისა და ტექნოლოგიების შესახებ</description>
	<lastBuildDate>Mon, 03 May 2010 14:38:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>JavaScript: String.replace()</title>
		<link>http://www.code.ge/posts/javascript-string-replace</link>
		<comments>http://www.code.ge/posts/javascript-string-replace#comments</comments>
		<pubDate>Wed, 16 Sep 2009 20:27:52 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[RegExp]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=332</guid>
		<description><![CDATA[რამდენიმე წლის წინ დავწერე პოსტი JavaScript &#8211; ით DOM ელემენტის სტილებთან მუშაობის შესახებ. ბრაუზერებს შორის სხვაობიდან გამომდინარე(კერძოდ კი IE &#8211; ს განსხვავებული მიდგომის გამო) პრობლემის გვერდის ასავლელად დავწერე ქვემოთ ნაჩვენები კოდი: 12345678910function getCamelCase&#40;string&#41; &#123; &#160; &#160; var tokens = string.split&#40;'-'&#41;; &#160; &#160; if &#40;tokens.length &#62; 1&#41; &#123; &#160; &#160; &#160; &#160; for &#40;var i = [...]]]></description>
			<content:encoded><![CDATA[<p>რამდენიმე წლის წინ დავწერე <a href="http://www.code.ge/posts/working-with-element-styles-part-two">პოსტი</a> JavaScript &#8211; ით DOM ელემენტის სტილებთან მუშაობის შესახებ. ბრაუზერებს შორის სხვაობიდან გამომდინარე(კერძოდ კი IE &#8211; ს განსხვავებული მიდგომის გამო) პრობლემის გვერდის ასავლელად დავწერე ქვემოთ ნაჩვენები კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> getCamelCase<span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> tokens <span style="color: #339933;">=</span> string.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'-'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tokens.<span style="color: #660066;">length</span> <span style="color: #339933;">&gt;</span> 1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> tokens.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tokens<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> tokens<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>0<span style="color: #339933;">,</span> 1<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> tokens<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>1<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; string <span style="color: #339933;">=</span> tokens.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> string<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>კოდის ერთადერთი დანიშნულებაა ტირეებიანი CSS ატრიბუტების მაგ. border-left-color, background-color გადაყვანა ე.წ. Camel Case ფორმატში ანუ borderLeftColor, backgroundColor და ა.შ.</p>
<p>დღეს კოდის წერისას იგივე პრობლემა მექანიკურად გადავჭერი სხვა უფრო მოხდენილი და რაც მთავარია გაცილებით მცირე ზომის კოდის მეშვეობით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;some-test-string&quot;</span><span style="color: #339933;">;</span><br />
str.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/-([\w])/gi</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a1<span style="color: #339933;">,</span> a2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> a2.<span style="color: #660066;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//კოდის შესრულების შემდეგ </span><br />
<span style="color: #006600; font-style: italic;">//სტრიქონი &quot;some-test-string&quot;</span><br />
<span style="color: #006600; font-style: italic;">//გარდაიქმნება შემდეგნაირად: &quot;someTestString&quot;</span></div></td></tr></tbody></table></div>
<p>დამეთანხმებით რომ თვალსაჩინო სხვაობაა <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  როგორ მუშაობს ეს კოდი? პირველ რიგში შეგახსენებთ თავად String ობიექტის replace() მეთოდის სიგნატურას:</p>
<blockquote><p>str.replace(regexp|substr, newSubStr|function[, Non-standard flags]);</p></blockquote>
<p>ანუ replace() მეთოდს მეორე პარამეტრად ახალი, ჩასანაცვლებელი სტრიქონის ნაცვლად შეგვიძლია გადავცეთ ქოლბექ ფუნქცია რომელიც დააბრუნებს დამუშავებულ სტრიქონს, ხოლო ეს დაბრუნებული სტრიქონი თავის მხრივ გამოყენებული იქნება რეგულარული გამოსახულების მიერ ნაპოვნი შესატყვისის ჩასანაცვლებლად.</p>
<p>საინტერესოა ასევე თუ რა პარამეტრებს გადასცემს replace() მეთოდი ქოლბექ ფუნქციას. გადასაცემი პარამეტრების რაოდენობა ცვალებადია და დამოკიდებულია მთელ რიგ ფაქტორებზე. მაგალითად ჩემს მიერ ნაჩვენებ მაგალითში ფუნქციას გადაეცემა ოთხი პარამეტრი, კერძოდ კი ფუნქცია გამოიძახება ორჯერ შემდეგი პარამეტრებით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//პიველი დამთხვევისათვის ანუ &quot;-t&quot;</span><br />
<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><br />
&nbsp; <span style="color: #3366CC;">&quot;-t&quot;</span><span style="color: #339933;">,</span> &nbsp;<span style="color: #006600; font-style: italic;">//რეგულარული გამოსახულების მიერ ნაპოვნი სტრიქონი სრულად</span><br />
&nbsp; <span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #339933;">,</span> &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//დამაჯგუფებელ ფრჩხილებში მოთავსებული შედეგი</span><br />
&nbsp; <span style="color: #CC0000;">4</span><span style="color: #339933;">,</span> &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//პოზიცია რომელზეც მოხდა პირველი დამთხვევა</span><br />
&nbsp; <span style="color: #3366CC;">&quot;some-test-string&quot;</span> <span style="color: #006600; font-style: italic;">//სრული სტრიქონი</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//მეორე დამთხვევისათვის ანუ &quot;-s&quot;</span><br />
<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><br />
&nbsp; <span style="color: #3366CC;">&quot;-s&quot;</span><span style="color: #339933;">,</span> &nbsp;<span style="color: #006600; font-style: italic;">//რეგულარული გამოსახულების მიერ ნაპოვნი სტრიქონი სრულად</span><br />
&nbsp; <span style="color: #3366CC;">&quot;s&quot;</span><span style="color: #339933;">,</span> &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//დამაჯგუფებელ ფრჩხილებში მოთავსებული შედეგი</span><br />
&nbsp; <span style="color: #CC0000;">9</span><span style="color: #339933;">,</span> &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//პოზიცია რომელზეც მოხდა პირველი დამთხვევა</span><br />
&nbsp; <span style="color: #3366CC;">&quot;some-test-string&quot;</span> <span style="color: #006600; font-style: italic;">//სრული სტრიქონი</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ნაჩვენები კოდიდან თვალსაჩინოა სავარაუდო პარამეტრების რაოდენობა, თუმცა მნიშვნელოვანია შემდეგი დეტალების გათვალისწინება, ქოლბექ ფუნქციას:</p>
<ul>
<li>პირველ პარამეტრად ყოველთვის გადაეცემა რეგულარული გამოსახულების მიერ ნაპოვნი სრული შესატყვისი;</li>
<li>ბოლო პარამეტრად ყოველთვის გადაეცემა სრული სტრიქონი რომლშიც განხორციელდა გარკვეული შესატყვისის ძიება;</li>
<li>ბოლოდან მეორე(ბოლოს წინა) პარამეტრად ყოველთვის გადაეცემა ნაპოვნი შესატყვისის პოზიცია. </li>
<li>თუ რამდენი პარამეტრის გადაცემა მოხდება პირველსა და ბოლო ორ პარამეტრს შორის დამოკიდებულია რეგულარულ გამოსახულებაში გამოყენებული დამაჯგუფებელი ფრჩხილების რაოდენობაზე(ჩემს მიერ ნაჩვენებ მაგალითში ასეთი პარამეტრი ერთია რადგან მხოლოდ ერთი დამაჯგუფება მაქვს გამოყენებული);</li>
<li>replace() მეთოდი გამოიძახებს ერთხელ თუ რეგულარული გამოსახულების ბოლოს არ გვაქვს მითითებული &#8220;<strong>g</strong>&#8221; ანუ გლობალური მოდიფიკატორი, ან გამოიძახებს იმდენჯერ რამდენი დამთხვევაც მოხდება კონკრეტული შესატყვისისათვის(ნაჩვენებ მაგალითში გამოძახება მოხდება ორჯერ).</li>
</ul>
<p>enjoy B-) </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-string-replace/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Jetpak &#8211; დამატებების ახალი სისტემა Mozilla &#8211; სგან</title>
		<link>http://www.code.ge/posts/jetpak</link>
		<comments>http://www.code.ge/posts/jetpak#comments</comments>
		<pubDate>Thu, 21 May 2009 11:27:59 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=260</guid>
		<description><![CDATA[საერთოდ ცნობილია რომ კონკურენცია ძალიან კარგი რამ არის. ამ მტკიცებულების სისწორის კიდევ ერთი ძალიან კარგი მაგალითი გვაქვს სახეზე კერძოდ კი Google Chrome &#8211; სა და Mofilla Firefox &#8211; ის ე.წ. extension &#8211; ების სისტემების სახით. მოგეხსენებათ რომ Google Chrome ძალიან ახალი ბრაუზერია რომელიც გასული წლის სექტემბრის დასაწყისში მოევლინა სამყაროს. მიუხედავად მისი ინოვაციურობისა მისი კრიტიკის ერთერთ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.code.ge/javascript/jetpak/attachment/jetpack_logo" rel="attachment wp-att-261"><img src="http://www.code.ge/wp-content/uploads/jetpack_logo.png" alt="jetpack_logo" title="jetpack_logo" width="486" height="233" class="alignleft size-full wp-image-261" style="float: left; margin: 0 4px 4px 0;"/></a> საერთოდ ცნობილია რომ კონკურენცია ძალიან კარგი რამ არის. ამ მტკიცებულების სისწორის კიდევ ერთი ძალიან კარგი მაგალითი გვაქვს სახეზე კერძოდ კი Google Chrome &#8211; სა და Mofilla Firefox &#8211; ის ე.წ. extension &#8211; ების სისტემების სახით.</p>
<p>მოგეხსენებათ რომ Google Chrome ძალიან ახალი ბრაუზერია რომელიც გასული წლის სექტემბრის დასაწყისში მოევლინა სამყაროს. მიუხედავად მისი ინოვაციურობისა მისი კრიტიკის ერთერთ მთავარ მიზეზად იქცა FF &#8211; ის მსგავსი დამატებების სისტემის არ ქონის გამო. </p>
<p>ცხადია ასე პირველივე დღიდან ყველაფერის ჩადებას ვერ მოახერხებდა Google თავის ახალ ბრაუზერში, თუმცა, როგორც მალე გაირკვა შეჩერებასაც არ აპირებდა. სულ რამდენიმე თვეში გამოჩნდა პირველი პროპოზალი რომელიც <a href="http://dev.chromium.org/developers/design-documents/extensions">Chrome &#8211; ს დამატებების პლატფორმას შეეხებოდა</a>. თუმცა ამ პროპოზალში ერთმა მეტად საგულისხმო დეტალმა გაიჟღერა &#8211; განსხვავებით FF &#8211; ის ანალოგიური სისტემისგან Chrome &#8211; ს დამატებების შესაქმნელად საკმარისია მხოლოდ HTML/CSS და JavaScript. არავითარი XUL, არავითარი რთული XML კონფიგურაციის ფაილები დამატების ინსტალაციისათვის და ა.შ.</p>
<p>Google &#8211; ს ეს გდაწყვეტილება ჩემთვის პირადად გაცილებით მისაღები იყო რადგან XUL &#8211; ის ვერანაირ აუცილებლობას ვერც FF &#8211; ში ვხედავდი მანამდე და სიმართლე ითქვას ვერც დღეს ვერ ვხედავ&#8230; თუმცა არც Mozilla &#8211; მ დააყოფნა და დღეს უკვე შემოგვთავაზა FF &#8211; ის დამატებების შექმნის ახალი მექანიზმი. კერძოდ კი <a href="http://labs.mozilla.com/2009/05/introducing-jetpack-call-for-participation/">Jetpak</a>!</p>
<p>ციტატა პროექტის საიტიდან:</p>
<blockquote><p>
In short, Jetpack is an API for allowing you to <strong>write Firefox add-ons using the web technologies you already know</strong>.
</p></blockquote>
<p>რითია საინტერესო Jetpak? პირველ რიგში ისევე როგორც Crhome &#8211; ს შემთხვევაში, Jetpak &#8211; ის შემთხვევაშიც დამატების შესაქმნელად საკმარისია მხოლოდ HTML/CSS და JavaScript. ამ შემთხვევაშიც არავითარი XUL და რთული XML კონფიგურაციის ფაილები. ასევე არავიტარი ბრაუზერის გადატვირთვა დამატების ინსტალაციის შემდგომ და რაც ყველაზე ყველაზე ყველაზე მნიშვნელოვანია დეველოპმენტის პროცესში შეგვიძლია გამოვიყენოთ ნებისმიერი არსებული ინსტრუმენტული საშუალებები და Firebug დებაგირებისათვის რაც არსებულ მოდელში პრაქტიკულად შეუძლებელია. ასევე jQuery &#8211; ს მოყვარულთათვის ძალიან მნიშვნელოვანი ფაქტია რომ ეს ბიბლიოთეკა ნაგულისხმევად არის ჩადებული Jetpak &#8211; ში, რაც კიდევ უფრო გაამარტივებს დამატებების პროგრამირებას.</p>
<p>მართალია დასრულებამდე და საყოველთაო გავრცელებამდე კიდევ დიდი გზა აქვს გასავლელი Jetpak &#8211; ს, თუმცა მისი გამოყენება უკვე შესაძლებელია. ასე რომ თუ არ გეზარებათ შეგიძლიათ დააინსტალიროთ და დამატებების წერასაც შეუდგეთ <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/jetpak/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Handling &#8220;onchange&#8221; event revisited</title>
		<link>http://www.code.ge/posts/handling-onchange-event-revisited</link>
		<comments>http://www.code.ge/posts/handling-onchange-event-revisited#comments</comments>
		<pubDate>Sat, 16 May 2009 18:10:17 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=241</guid>
		<description><![CDATA[რამდენიმე თვის წინ დავწერე პოსტი, HTML ფორმის ელემენტის onchange ივენთისა და მისი დელეგირების შესახებ. ნახსენებ პოსტში ნაჩვენებია onchange ივენთის დელეგირების მაგალითი სადაც ფორმის ყველა ელემენტის აღნიშნული ივენთის ცენტრალიზებული კონტროლი ხორციელდება მშობელი ელემენტის onchange ივენთის მეშვეობით. მსგავსი შედეგის მიღწევა შესაძლებელი ე.წ. Event Bubbling &#8211; ის წყალობით რაც ივენთის, საწყისი ელემენტიდან მშობელი ელემენტისკენ გავრცელებას ეწოდება. მეტი თვალსაჩინოებისთვის [...]]]></description>
			<content:encoded><![CDATA[<p>რამდენიმე თვის წინ დავწერე <a href="http://www.code.ge/posts/javascript-wtf-vol-5-magic-of-onchange-event">პოსტი</a>, HTML ფორმის ელემენტის <strong>onchange</strong> ივენთისა და  მისი დელეგირების შესახებ.</p>
<p>ნახსენებ პოსტში ნაჩვენებია <strong>onchange</strong> ივენთის დელეგირების მაგალითი სადაც ფორმის ყველა ელემენტის აღნიშნული ივენთის ცენტრალიზებული კონტროლი ხორციელდება მშობელი ელემენტის <strong>onchange</strong> ივენთის მეშვეობით.</p>
<p>მსგავსი შედეგის მიღწევა შესაძლებელი ე.წ. Event Bubbling  &#8211; ის წყალობით რაც ივენთის, საწყისი ელემენტიდან მშობელი ელემენტისკენ გავრცელებას ეწოდება. მეტი თვალსაჩინოებისთვის იხ. სურათი(<strong>სურათისათვის განსაკუთრებული მადლობა <a href="http://www.freshblurbs.com">ირაკლის</a></strong>): </p>
<p><a href="http://www.code.ge/posts/handling-onchange-event-revisited/picture-17" rel="attachment wp-att-250"><img src="http://www.code.ge/wp-content/uploads/picture-17.png" alt="picture-17" title="picture-17" width="387" height="267" class="aligncenter size-full wp-image-250" /></a></p>
<p>ივენთის გავცელების(შვილიდან მშობლის მიმართულებით) ასეთი მეთოდი ყველა ბრაუზერში ერთნაირად მუშაობს. და წესით ეს უნდა ეხებოდეს ყველა ტიპის ივენთს. თუმცა როგორც მოსალოდნელი იყო IE &#8211; ში მისი მერვე ვერსიის ჩათვლით სწორედ ამ ივენთზე აღმოჩნდა შეზღუდვა და იგი საწყისი ელემენტს(ელემენტი რომელზეც უშუალოდ წარმოიშვა ეს ივენთი) იქეთ არ ვრცელდება.</p>
<p>ერთი შეხედვით, ამ ჩიხიდან რამდენიმე გამოსავალი შეიძლება მოიძებნოს:</p>
<ol>
<li>ფორმის ყველა ელემენტის ჩამოვლა და მათთვის <strong>onchange</strong> ივენთ ჰენდლერის მინიჭება. თუმცა აქ მთელ რიგ პრობლემებს წავაწყდებით:<br />
</p>
<ul>
<li>
     ელემენტებზე ასეთი გზით ივენთ ჰენდლერების მინიჭება IE &#8211; ში იწვევს მეხსიერებასთან დაკავშირებულ პრობლემებს, ე.წ. memory leaks. ეს გარემოება განსაკუთრებით მნიშვნელოვანია თუ ფორმაში ბევრი ელემენტები გვაქვს.
</li>
<li>
 თუ ფორმის ელემენტები იტვირთება დინამიურად Ajax &#8211; ის მეშვეობით, ყოველი ასეთი ჩატვირთვის შემდეგ საჭიროა: ა) ყველა ფორმის ელემენტისა და მათი ივენთ ჰენდლერების განადგურება რათა თავიდან ავირიდოთ მეხსიერებასთან დაკავშირებული პრობლემები; ბ) ახლად ჩატვირთული ელემენტების იტერაცია და მათთვის შესაბამისი ივენთ ჰენდლერების განსაზღვრა.
</li>
</ul>
<p>დამეთანხმებით რომ აღწერილი ორი მეთოდი დიდი მოქნილებით არ გამოირჩევა.</p>
</li>
<li>
ნაცვლად <strong>onchange</strong> ივენთისა გამოვიყენოთ <strong>onfocus</strong> და <strong>onblur</strong> ივენთები. თუმცა აღმოჩნდა რომ არც ამ ივენთების გავრცელება არ ხდება ტრადიციული(შვილიდან მშობლის მიმართულებით) მეთოდით.
</li>
</ol>
<p>გარკვეული კვლევა ძიების შემდეგ მივაგენი ისეთ ივენთებს(დიდი მადლობა <a href="http://www.quirksmode.org/dom/events/index.html">PPK</a> &#8211; ს) რომელთა ბაბლინგი IE &#8211; ში ისე მუშაობს როგორც საჭიროა. ეს  ივენთებია <strong>onfocusin</strong> და <strong>onfocusout</strong>.</p>
<p>როგორ შეიძლება აღნიშნული ივენთების გამოყენება პრობლემის გადასაჭრელად? სანამ უშუალოდ კოდის წერას დავიწყებთ საჭიროა კარგად გავერკვეთ თუ როგორ მუშაობს <strong>onchange</strong> ივენთი HTML ფორმის ცალკეული ელემენტებისათვის და ასევე თუ რა გვერდის ავლის მექანიზმების გამოყენებაა შესაძლებელი IE &#8211; ში.</p>
<p><strong>SELECT ელემენტი</strong></p>
<p>ამ ელემენტის შემთხვევაში <strong>onchange</strong> ივენთი წარმოიშვება მხოლოდ იმ ჩამოსაშლელი სიიდან კონკრეტული ელემენტის ამორჩევის დროს. IE &#8211; ში იგივე ხდომილების ემულაციისათვის შესაძლებელია <strong>onclick</strong> ივენთის გამოყენება, თუმცა, ასეთ შემთხვევაში ივენთი ორჯერ წარმოიშვება ერთხელ ელემენტის გააქტიურებისას ხოლო მეორედ ჩამოსაშლელი სიიდან მნიშვნელობის არჩევისას. თუმცა ამ პრობლემის არიდება მარტივად არის შესაძლებელი სწორედ <strong>onfocusin</strong> და <strong>onfocusout</strong> ივენთების მეშვეობით რადგან ეს ორივე ივენთი წარმოიშვება <strong>onclick</strong> ივენთამდე, გამომდინარე აქედან შესაძლებელია წინა ივენთის ტიპის დამახსოვრება და შემდგომ უკვე დადგენა ეს იყო პირველი კლიკი თუ ჩამოსაშლელი მენიუდან ელემენტის არჩევა მოხდა?</p>
<p><strong>INPUT text და TEXTAREA ელემენტები</strong><br />
ამ ელემენტების შემთხვევაში <strong>onchange</strong> ივენთი წარმოიშვება როდესაც ელემენტი კარგავს ფოკუსს. IE &#8211; ში იგივეს მიღწევა შესაძლებელია <strong>onfocusout</strong> ივენთის მეშვეობით.</p>
<p><strong>INPUT checkbox და radio ელმენტები</strong><br />
ამ ელემენტების შემთხვევაში <strong>onchange</strong> ივენთი წარმოიშვება მათი მნიშვნელობის ცვლილების თანავე. IE &#8211; ში იგივე შედეგის მისაღებად მარტივად არის შესაძლებელი <strong>onclick</strong> ივენთის გამოყენება.</p>
<p>მაშ ასე წინა სამი პარაგრაფში გამოიკვეთა სამი ისეთი ივენთი რომელთა გამოყენებაც შესაძლებელია <strong>onchange</strong> ბაბლინგის ემულაციისათვის. ეს ივენთებია: <strong>onclick</strong>, <strong>onfocusin</strong>, <strong>onfocusout</strong>.</p>
<p>ამ ინფორმაციაზე დაყრდნობით მარტივად არის შესაძლებელი სულ რამდენიმე სტრიქონი კოდით გადავწყვიტოთ პრობლემა:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'testonchange'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//ყველა ბრაუზერი IE - ს გარდა</span><br />
&nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; div.<span style="color: #660066;">onchange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//აქ შეგვიძლია გამოვიძახოთ ივენთის უშუალო ჰენდლერი</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//IE - ს სპეციფიური რეალიზაცია</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> previousEvent <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; div.<span style="color: #660066;">onfocusin</span> <span style="color: #339933;">=</span> div.<span style="color: #660066;">onfocusout</span> <span style="color: #339933;">=</span> div.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #003366; font-weight: bold;">var</span> e &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; target &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=</span> e.<span style="color: #660066;">srcElement</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isSelect &nbsp; &nbsp; <span style="color: #339933;">=</span> target.<span style="color: #660066;">nodeName</span> &nbsp;<span style="color: #339933;">==</span> <span style="color: #3366CC;">'SELECT'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notTextInput <span style="color: #339933;">=</span> target.<span style="color: #660066;">nodeName</span> &nbsp;<span style="color: #339933;">==</span> <span style="color: #3366CC;">'INPUT'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009966; font-style: italic;">/^radio|checkbox$/i</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span>target.<span style="color: #660066;">type</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isTextInput &nbsp;<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>target.<span style="color: #660066;">nodeName</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'INPUT'</span> <span style="color: #339933;">&amp;&amp;</span> target.<span style="color: #660066;">type</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'text'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> target.<span style="color: #660066;">nodeName</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'TEXTAREA'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; validElement <span style="color: #339933;">=</span> notTextInput <span style="color: #339933;">||</span> isSelect<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isSelect <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>target.<span style="color: #660066;">size</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009966; font-style: italic;">/^focus(in|out)$/</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span>previousEvent<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; validElement <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;previousEvent <span style="color: #339933;">=</span> e.<span style="color: #660066;">type</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">type</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'click'</span> <span style="color: #339933;">&amp;&amp;</span> validElement<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">type</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'focusout'</span> <span style="color: #339933;">&amp;&amp;</span> isTextInput<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//აქ შეგვიძლია გამოვიძახოთ ივენთის უშუალო ჰენდლერი</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;div <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ეს არის და ეს <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  კოდის დეტალური გარჩევით თავს აღარ შეგაწყენთ, ხოლო რეალური დემონსტრაცია შეგიძლიათ იხილოთ <a href="http://www.code.ge/samples/onchange.html">აქ</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/handling-onchange-event-revisited/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript: Regex and Multi-line Mode</title>
		<link>http://www.code.ge/posts/javascript-regex-and-multi-line-mode</link>
		<comments>http://www.code.ge/posts/javascript-regex-and-multi-line-mode#comments</comments>
		<pubDate>Tue, 21 Apr 2009 09:43:27 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[RegExp]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=233</guid>
		<description><![CDATA[დღეს აღმოვაჩინე რომ JavaScript &#8211; ის Regex იმპლემენტაციას გარდა სხვა ნაკლოვანებებისა ასევე არ გააჩნია ე.წ. &#8220;multi-line match mode&#8221;. ამ შემთხვევაში ლაპარაკი არ მაქვს რეგულარული გამოსახულების &#8220;m&#8221; მოდიფიკატორის მხარდაჭერაზე, ლაპარაკი მაქვს &#8220;s&#8221; მოდიფიკატორზე რომელიც &#8220;.&#8220;(წერტილი) სიმბოლოს აიძულებს გარდა სხვა სიმბოლოებისა(ნაგულისხმევად &#8220;.&#8221; ნიშნავს &#8220;ნებისმიერი სიმბოლო გარდა ახალი სტრიქონის სიმბოლოსი&#8221;) ასევე მოძებნოს ახალი სტრიქონის სიმბოლო. ჩემი მარტივი ამოცანის [...]]]></description>
			<content:encoded><![CDATA[<p>დღეს აღმოვაჩინე რომ JavaScript &#8211; ის Regex იმპლემენტაციას გარდა სხვა ნაკლოვანებებისა ასევე არ გააჩნია ე.წ. &#8220;multi-line match mode&#8221;. ამ შემთხვევაში ლაპარაკი არ მაქვს რეგულარული გამოსახულების &#8220;<strong>m</strong>&#8221; მოდიფიკატორის მხარდაჭერაზე, ლაპარაკი მაქვს &#8220;<strong>s</strong>&#8221; მოდიფიკატორზე რომელიც &#8220;<strong>.</strong>&#8220;(წერტილი) სიმბოლოს აიძულებს გარდა სხვა სიმბოლოებისა(ნაგულისხმევად &#8220;<strong>.</strong>&#8221; ნიშნავს &#8220;ნებისმიერი სიმბოლო გარდა ახალი სტრიქონის სიმბოლოსი&#8221;) ასევე მოძებნოს  ახალი სტრიქონის სიმბოლო.</p>
<p>ჩემი მარტივი ამოცანის გადასაჭრელად საჭირო იყო მოცემულ ტექსტში მეპოვა შემდეგი ტიპის მონაკვეთი:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">function</span> myFunction<span style="color: #009900;">&#40;</span><span style="color: #000088;">$param1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$param1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ხოლო ნაპოვნი მონაკვეთიდან ამომეღო {code}{/code} ტაგებს შორის მოქცეული ტექსტი. თუმცა ეს გასაგები მიზეზების გამო არ გამომივიდა.</p>
<p>ნებისმიერ PCRE &#8211; სთან თავსებად იმპლემენტაციას გააჩნია &#8220;<strong>s</strong>&#8221; მოდიფიკატორი რომლის მეშვეობითაც მსგავსი ამოცანა წყდება ძალიან მარტივად. მაგალითად PHP  &#8211; ში რეგულარულ გამოსახულებას ჩავწერდით შემდეგნაირად:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//ყურადღება მიაქციეთ გამოსახულების ბოლოში </span><br />
<span style="color: #006600; font-style: italic;">//მიწერილ &quot;s&quot; სიმბოლოს</span><br />
$regex <span style="color: #339933;">=</span> <span style="color: #3366CC;">'/{code lang=&quot;(<span style="color: #000099; font-weight: bold;">\w</span>+)&quot;}(.*?){<span style="color: #000099; font-weight: bold;">\/</span>code}/s'</span></div></td></tr></tbody></table></div>
<p>სამწუხაროდ ასეთ გამოსახულებას JavaScript  &#8211; ში ვერ დავწერთ. თუმცა, ცოტაოდენი <a href="http://www.regular-expressions.info/dot.html#nodotall">კვლევაძიებისა</a> და ექსპერიმენტების შემდგომ მივაგენი გამოსავალს რაც გამოიხატება სპეციფიური ე.წ. character class &#8211; ის გამოყენებაში. ამისათვის საჭიროა &#8220;<strong>\s</strong>&#8221; და &#8220;<strong>\S</strong>&#8221; მეტა სიმბოლოების დაჯგუფება character class &#8211; ში. შედეგად მივიღებთ შემდეგ გამოსახულებას:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#91;</span>\s\S<span style="color: #009900;">&#93;</span></div></td></tr></tbody></table></div>
<p>სადაც &#8220;<strong>\s</strong>&#8221; შეესაბამება ნებისმიერ უხილავ სიმბოლოს, ხოლო &#8220;<strong>\S</strong>&#8221; შეესაბამება ნებისმიერ არა უხილავ სიმბოლოს.</p>
<p>შედეგად მივიღე ასეთი JavaScript &#8211; ის რეგულარული გამოსახულება:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">/</span><span style="color: #009900;">&#123;</span>code\s<span style="color: #339933;">+</span>lang<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;(<span style="color: #000099; font-weight: bold;">\w</span>+)&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>\s\S<span style="color: #009900;">&#93;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>\<span style="color: #339933;">/</span>code<span style="color: #009900;">&#125;</span><span style="color: #339933;">/</span></div></td></tr></tbody></table></div>
<p>ეს გამოსახულება მუშაობს ანალოგიურად PCRE &#8211; სთან თავსებადი გამოსახულებისა რომელიც იყენებს &#8220;<strong>s</strong>&#8221; მოდიფიკატორს.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-regex-and-multi-line-mode/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HTML Form &#8220;elements&#8221; Property</title>
		<link>http://www.code.ge/posts/html-form-elements-property</link>
		<comments>http://www.code.ge/posts/html-form-elements-property#comments</comments>
		<pubDate>Sun, 05 Apr 2009 23:16:04 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=219</guid>
		<description><![CDATA[ამ პოსტის დაწერამდე რამდენიმე წუთით ადრე წავაწყდი HTML form ელემენტის elements თვისებასთან დაკავშირებულ ერთ პრობლემას(შეცდომას) რომლის შესახებაც აქამდე არაფერი მსმენია და ცოტა არ იყოს უაზროდ დამახარჯინა დრო. ცნობილია, რომ form ელემენტის აღნიშნული თვისება არის HTMLCollection ტიპის კოლექცია და იგი შეიცავს კონკრეტული HTML ფორმის შიგნით გამოყენებულ ყველა(input, select, button) ელემენტს. სწორედ ეს კოლექცია წარმოადგენს საჭირო ფორმის [...]]]></description>
			<content:encoded><![CDATA[<p>ამ პოსტის დაწერამდე რამდენიმე წუთით ადრე წავაწყდი HTML <strong>form</strong> ელემენტის <strong>elements</strong> თვისებასთან დაკავშირებულ ერთ პრობლემას(შეცდომას) რომლის შესახებაც აქამდე არაფერი მსმენია და ცოტა არ იყოს უაზროდ დამახარჯინა დრო. </p>
<p>ცნობილია, რომ <strong>form</strong> ელემენტის აღნიშნული თვისება არის <strong>HTMLCollection</strong> ტიპის კოლექცია და იგი შეიცავს კონკრეტული HTML ფორმის შიგნით გამოყენებულ ყველა(input, select, button) ელემენტს. სწორედ ეს კოლექცია წარმოადგენს საჭირო ფორმის ელემენტებთან წვდომის ყველაზე უსაფრთხო(თურმე პირობითად) გზას. </p>
<p>როგორც აღმოჩნდა თუ ფორმის ელემენტებს მოვათავსებთ <strong>fieldset</strong> ტეგში(და წესით ეს ასეც უნდა გავაკეთოთ) <strong>elements</strong> კოლექცია მოულოდნელ რეზულტატს დაგვიბრუნებს. კერძოდ კი <strong>fieldset</strong> ელემენტიც(ან ელემენტები) ამ კოლექციაში აღმოჩნდება.</p>
<p>ჩემი ამოცანა მდგომარეობდა შემდეგში, რომ ფორმის ყველა ელემენტებისაგან მიმეღო მათი სახელებისა და მნიშნვნელობების ე.წ. key/value ობიექტი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> map <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> els <span style="color: #339933;">=</span> target.<span style="color: #660066;">form</span>.<span style="color: #660066;">elements</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> 0<span style="color: #339933;">,</span> el<span style="color: #339933;">;</span> <span style="color: #009900;">&#40;</span>el <span style="color: #339933;">=</span> els<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;map<span style="color: #009900;">&#91;</span>el.<span style="color: #000066;">name</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> el.<span style="color: #660066;">value</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <br />
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>map<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუმცა ძალიან უცნაური შედეგი მივიღე რადგან <strong>fieldset</strong> ელემენტს არც <strong>name</strong> და არც <strong>value</strong> თვისებები არ გააჩნია.</p>
<p>პრობლემის იდენტიფიცირების შემდგომ ინტერნეტში მოვიძიე მცირეოდენი ინფორმაცია:</p>
<blockquote><p>The HTML 4 standard adds new &lt;fieldset&gt; and &lt;label&gt; tags to the set of elements that can appear within a form.<strong> In IE 5 and later, placing a &lt;fieldset&gt; in a form causes a corresponding object to be added to the form&#8217;s elements[] array</strong>. 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 &lt;label&gt; tags do not cause corresponding objects to be added to the elements[] array. <strong>The Mozilla and Netscape 6 browsers have chosen to follow Microsoft&#8217;s lead on this in order to be compatible with IE.</strong></p>
<p>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.</p></blockquote>
<p>მოკლედ კვლავ IE <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ნუ რას ვიზამთ რეალობა ასეთია <img src='http://www.code.ge/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/html-form-elements-property/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JavaScript: arrayChunk</title>
		<link>http://www.code.ge/posts/javascript-arraychunk</link>
		<comments>http://www.code.ge/posts/javascript-arraychunk#comments</comments>
		<pubDate>Fri, 20 Feb 2009 19:01:46 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=200</guid>
		<description><![CDATA[დღეს კოდის წერისას დამჭირდა მასივის რამდენიმე თანაბარ ნაწილად დაყოფა, PHP &#8211; ს ამ ამოცანის გადასაჭრელად გააჩნია შესაბამისი array_chunk() ფუნქცია, მაგრამ, JavaScript &#8211; ს მსგავსი არაფერი გააჩნია. ეს არის ე.წ. quick solution ამ ამოცანის გადასაჭრელად: 1234567function arrayChunk&#40;array, size&#41; &#123; &#160; &#160; var start = 0, result = &#91;&#93;, chunk = &#91;&#93;; &#160; &#160; while&#40;&#40;chunk = array.slice&#40;start, [...]]]></description>
			<content:encoded><![CDATA[<p>დღეს კოდის წერისას დამჭირდა მასივის რამდენიმე თანაბარ ნაწილად დაყოფა, PHP &#8211; ს ამ ამოცანის გადასაჭრელად გააჩნია შესაბამისი <a href="http://www.php.net/manual/en/function.array-chunk.php">array_chunk()</a> ფუნქცია, მაგრამ, JavaScript &#8211; ს მსგავსი არაფერი გააჩნია.</p>
<p>ეს არის ე.წ. quick solution ამ ამოცანის გადასაჭრელად:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> arrayChunk<span style="color: #009900;">&#40;</span>array<span style="color: #339933;">,</span> size<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> start <span style="color: #339933;">=</span> 0<span style="color: #339933;">,</span> result <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> chunk <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>chunk <span style="color: #339933;">=</span> array.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span>start<span style="color: #339933;">,</span> start <span style="color: #339933;">+=</span> size<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>chunk<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ფუნქცია ღებულობს ორ პარამეტრს 1) მასივი რომელიც გვინდა დავყოთ; 2) თითოეული დანაყოფის ზომა;</p>
<p>თუ ამ ფუნქციას შეასრულებთ FireBug &#8211; ის კონსოლში:</p>
<pre>
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(arrayChunk(a, 2));
</pre>
<p>მიიღებთ შემდეგ შედეგს:</p>
<pre>
 [[1, 2], [3, 4], [5, 6], [7, 8], [9]]
</pre>
<p>შედეგიდან გამომდინარე ფუნქციის საბოლოო რეზულტატი თვალსაჩინოა, იგი აბრუნებს სასურველი(ამ შემთხვევაში 2) ზომის მასივების მასივს. </p>
<p>დამატებითი დეტალების ახსნისგან თავს შევიკავებ რადგან ფუნქცია უმარტივესია, თუმცა ძალიან სასარგებლო <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-arraychunk/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jCSS &#8211; რელიზის კანდიდატი</title>
		<link>http://www.code.ge/posts/jcss-%e1%83%a0%e1%83%94%e1%83%9a%e1%83%98%e1%83%96%e1%83%98%e1%83%a1-%e1%83%99%e1%83%90%e1%83%9c%e1%83%93%e1%83%98%e1%83%93%e1%83%90%e1%83%a2%e1%83%98</link>
		<comments>http://www.code.ge/posts/jcss-%e1%83%a0%e1%83%94%e1%83%9a%e1%83%98%e1%83%96%e1%83%98%e1%83%a1-%e1%83%99%e1%83%90%e1%83%9c%e1%83%93%e1%83%98%e1%83%93%e1%83%90%e1%83%a2%e1%83%98#comments</comments>
		<pubDate>Wed, 18 Feb 2009 10:19:27 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jcss]]></category>
		<category><![CDATA[Selector Engine]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=194</guid>
		<description><![CDATA[დაუღალავი და საკმაოდ მძიმე შრომის შემდეგ დღეს ყველა ჩემს ხელთ არსებულ ვებ ბრაუზერში უნიტ ტესტებმა მწვანე აანთო რაც ნიშნავს იმას რომ jCSS &#8211; მა ყველა მითითებული ტესტი გაიარა წარმატებით(იხ. jCSS Test Suite). ამ ეტაპისთვის ცოტას შევისვენებ და შემდეგ მოვუვლი კოდში არსებულ ინდუიზმს რომლისაც ცოტა არ იყოს და მრცხვენია. იმედი მაქვს რომ კვირის ბოლოს 1.0 ვერსიის [...]]]></description>
			<content:encoded><![CDATA[<p>დაუღალავი და საკმაოდ მძიმე შრომის შემდეგ დღეს ყველა ჩემს ხელთ არსებულ ვებ ბრაუზერში უნიტ ტესტებმა მწვანე აანთო <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  რაც ნიშნავს იმას რომ jCSS &#8211; მა ყველა მითითებული ტესტი გაიარა წარმატებით(იხ. <a href="http://www.code.ge/jcss-test/slickspeed/frameworks/test/">jCSS Test Suite</a>).</p>
<p><a href="http://www.code.ge/wp-content/uploads/picture-31.png"><img src="http://www.code.ge/wp-content/uploads/picture-31-300x187.png" alt="picture-31" title="picture-31" width="300" height="187" class="alignnone size-medium wp-image-195" /></a></p>
<p>ამ ეტაპისთვის ცოტას შევისვენებ და შემდეგ მოვუვლი კოდში არსებულ ინდუიზმს რომლისაც ცოტა არ იყოს და მრცხვენია. იმედი მაქვს რომ კვირის ბოლოს 1.0 ვერსიის რელიზს მოვასწრებ.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/jcss-%e1%83%a0%e1%83%94%e1%83%9a%e1%83%98%e1%83%96%e1%83%98%e1%83%a1-%e1%83%99%e1%83%90%e1%83%9c%e1%83%93%e1%83%98%e1%83%93%e1%83%90%e1%83%a2%e1%83%98/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>jCSS &#8211; CSS Selector Engine</title>
		<link>http://www.code.ge/posts/jcss-css-selector-engine</link>
		<comments>http://www.code.ge/posts/jcss-css-selector-engine#comments</comments>
		<pubDate>Thu, 12 Feb 2009 10:18:01 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>
		<category><![CDATA[jcss]]></category>
		<category><![CDATA[Selector Engine]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=182</guid>
		<description><![CDATA[Hi all, ესე იგი მინდა წარმოგიდგინოთ ჩემი ერთერთი პატარა პროექტი სახელად jCSS. იგი წარმოადგენს JavaScript &#8211; ზე დაწერილ ე.წ. CSS Selector Engine &#8211; ს რომლის მეშვეობითაც მარტივად შეძლებთ HTML დოკუმენტის DOM ელემენტების ძებნას და რეზულტატის მიღებას ტიპიური CSS სელექტორების გამოყენებით. მინდა აღვნიშნო რომ არავისთვის კონკურენციის გაწევას არ ვაპირებ ანუ jQuery, Mootools, Seezle და ა.შ. ეს [...]]]></description>
			<content:encoded><![CDATA[<p>Hi all, ესე იგი მინდა წარმოგიდგინოთ ჩემი ერთერთი პატარა პროექტი სახელად jCSS. იგი წარმოადგენს JavaScript  &#8211; ზე დაწერილ ე.წ. CSS Selector Engine &#8211; ს რომლის მეშვეობითაც მარტივად შეძლებთ HTML დოკუმენტის DOM ელემენტების ძებნას და რეზულტატის მიღებას ტიპიური CSS სელექტორების გამოყენებით.</p>
<p>მინდა აღვნიშნო რომ არავისთვის კონკურენციის გაწევას არ ვაპირებ ანუ jQuery, Mootools, Seezle და ა.შ. <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ეს არის ჩემი პირადი ექსპერიმენტი რომელსაც გარდა პრაქტიკული დანიშნულებისა გააჩნია წმინდა შემეცნებითი დატვირთვა და ამ მინი პროექტზე მუშაობისას ჩემს ძირითად ამოცანას წარმოადგენდა DOM ელემენტებში ნავიგაციისა და ციკლების წარმადობის კვლევა. ნებისმიერ შემთხვევაში სკრიპტი სრულად ფუნქციონალურია და შეგიძლიათ გამოიყენოთ.</p>
<p>წარმადობისა და რეალიზებული CSS სელექტორების ტესტი შეგიძლიათ ნახოთ <a href="http://www.code.ge/jcss-test/slickspeed/">აქვე</a>. ტესტირებისათვის ვიყენებ Mootools &#8211; ის ავტორის მიერ შექმნილ ტესტირების სისტემას სახელად SlickSpeed ასე რომ შედეგებში ტენდენციურობა გამორიცხული <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  შედარებისათვის გარდა jCSS &#8211; ისა ტესტში გამოვიყენე jQuery &#8211; ისა და Mootools &#8211; ის ბოლო სტაბილური ვერსიები.</p>
<p><a href="http://www.code.ge/jcss-test/slickspeed/frameworks/jcss.js">გადაწერეთ jCSS!</a></p>
<p>გამოყენების მაგალითები:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> els <span style="color: #339933;">=</span> jCSS<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#my-element-id div.my-class-name ul a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> els.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//do something wit elements</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>სულ ეს არის და ეს, ამ ეტაპზე მეტის დაწერას აზრი არ აქვს. თუ თქვენს მოსაზრებებსაც გამიზიარებთ ძალიან ძალიან გამახარებთ.</p>
<p>enjoy <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Update:</strong><br />
განვაახლე jCSS აწი უფრო სწრაფია FF, Opera და IE &#8211; ში.</p>
<p>SlickSpeed Benchmark: <a href="http://www.code.ge/jcss-test/slickspeed/">http://www.code.ge/jcss-test/slickspeed/</a></p>
<p>დავამატე Unit Test Suite ბრაუზერებს შორის და სხვადასხვა ტიპის სელექტორების იმპლემენტაციის სისწორის კონტროლისათვის:<br />
Unit Test Suite: <a href="http://www.code.ge/jcss-test/slickspeed/frameworks/test/">http://www.code.ge/jcss-test/slickspeed/frameworks/test/</a></p>
<p><strong>Update:</strong></p>
<ul>
<li>დაიფიქსა ყველა ძირითადი ბაგი;</li>
<li>დაიხვეწა და განვითარდა Query Parser;</li>
<li>დაემატა ყველა ე.წ. ფსევდო კლასების მხარდაჭერა გარდა nth-child და nth-last-child ფსევდო კლასებისა;</li>
<li>კომპლექსური ფსევდო კლასების მხარდაჭერა;</li>
<li>დავამატე DOM ელემენტების სორტირება ნეითივ სელექტორების მიერ დაბრუნებულ რეზულტატებთან თავსებადობის გამო. თუმცა ამან წარმადობა შედარებით დაწია IE &#8211; სა და Opera &#8211; ში. </li>
<li>დაიხვეწა კონტექსტური პარამეტრების მხარდაჭერა, გარდა DOM ელემენტისა კონტექსტურ პარამეტრად შესაძლებელია გამოვიყენოთ როგორც სელექტორი ასევე DOM ელემენტების მასივი. მაგ:<br />
</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #003366; font-weight: bold;">var</span> nodes <span style="color: #339933;">=</span> jCSS<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp;<span style="color: #3366CC;">'div &gt; p.paragraph-class-name'</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp;document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element-id'</span><span style="color: #009900;">&#41;</span><br />
&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp;<span style="color: #003366; font-weight: bold;">var</span> nodes <span style="color: #339933;">=</span> jCSS<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp;<span style="color: #3366CC;">'div &gt; p.paragraph-class-name'</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp;<span style="color: #3366CC;">'#my-element-id:visible'</span><br />
&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp;<span style="color: #003366; font-weight: bold;">var</span> nodes <span style="color: #339933;">=</span> jCSS<span style="color: #009900;">&#40;</span><br />
&nbsp; <span style="color: #3366CC;">'a em'</span><span style="color: #339933;">,</span> <br />
&nbsp; document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'h1'</span><span style="color: #009900;">&#41;</span><br />
&nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
</li>
<li>განვაახლე SlicckSpeed ანუ დავამატე YUI!, Prototype და Peppy სელექტორ ენჯინები;
<p>SlickSpeed Benchmark: <a href="http://www.code.ge/jcss-test/slickspeed/">http://www.code.ge/jcss-test/slickspeed/</a></li>
<li>განვაახლე და გავამდიდრე UnitTest ფრეიმვორკი:
<p>Unit Test Suite: <a href="http://www.code.ge/jcss-test/slickspeed/frameworks/test/">http://www.code.ge/jcss-test/slickspeed/frameworks/test/</a></li>
</ul>
<p>კომპლექსური სელექტორების იმპლემენტაცია საშუალებას იძლევა ელემენტები მოვძებნოთ დაახლოვებით მსგავსი სელექტორების გამოყენებით:</p>
<div class="codecolorer-container css blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #cc00cc;">#form</span> option<span style="color: #00AA00;">:</span>not<span style="color: #00AA00;">&#40;</span><span style="color: #00AA00;">:</span>contains<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'Nothing'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">,</span><span style="color: #cc00cc;">#option1b</span><span style="color: #00AA00;">,:</span>selected<span style="color: #00AA00;">&#41;</span><br />
<br />
<span style="color: #cc00cc;">#form</span> option<span style="color: #00AA00;">:</span>not<span style="color: #00AA00;">&#40;</span><span style="color: #00AA00;">:</span>not<span style="color: #00AA00;">&#40;</span><span style="color: #00AA00;">:</span>selected<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">&#91;</span>id<span style="color: #00AA00;">^=</span><span style="color: #ff0000;">'option3'</span><span style="color: #00AA00;">&#93;</span><br />
<br />
<span style="color: #3333ff;">:input</span><span style="color: #00AA00;">:</span>not<span style="color: #00AA00;">&#40;</span><span style="color: #3333ff;">:image</span><span style="color: #00AA00;">,</span><span style="color: #3333ff;">:input</span><span style="color: #00AA00;">,:</span>submit<span style="color: #00AA00;">&#41;</span></div></td></tr></tbody></table></div>
<p>ამ ეტაპზე ნეითივ სელექტორები გათიშული მაქვს Safari, Chrome, IE8 და FF3.1 &#8211; სთვის უკუთავსებადობის სრული ტესტირებისათვის. გარდა მაგისა არც ნეიტივ სელექტორები არ არის სრულყოფილად რეალიზებული და ნებისმიერ შემთხვევაში საჭიროა ე.წ. Custom Implmentation(განსაკუთრებით ეს ეხება IE8 &#8211; ს).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/jcss-css-selector-engine/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JavaScript WTF Vol. 5 &#8211; magic of onchange event</title>
		<link>http://www.code.ge/posts/javascript-wtf-vol-5-magic-of-onchange-event</link>
		<comments>http://www.code.ge/posts/javascript-wtf-vol-5-magic-of-onchange-event#comments</comments>
		<pubDate>Sat, 31 Jan 2009 11:06:59 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>
		<category><![CDATA[JavaScript WTF]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=168</guid>
		<description><![CDATA[ხშირად იყენებთ HTML ფორმის ელემენტების ამ ივენთს? და რა შემთხვევაში? ალბათ უფრო SELECT ელემენტთან მუშაობისას ხომ? თქვენი არ ვიცი მაგრამ ჩემს პირად პრაქტიკაში განსაკუთრებული გამოყენება ამ ივენთს არ ჰქონია&#8230; თუმცა ორიოდე დღის წინ ყველაფერი შეიცვალა და ჩემთვის ერთი ფრიად საინტერესო აღმოჩენა გავაკეთე. ასეთი რამ გინახავათ? &#60;div onchange="handleEvent()"&#62; //some other markup &#60;/div&#62; დამეთანხმებით რომ ერთი შეხედვით [...]]]></description>
			<content:encoded><![CDATA[<p>ხშირად იყენებთ HTML ფორმის ელემენტების ამ ივენთს? <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  და რა შემთხვევაში? ალბათ უფრო SELECT ელემენტთან მუშაობისას ხომ? თქვენი არ ვიცი მაგრამ ჩემს პირად პრაქტიკაში განსაკუთრებული გამოყენება ამ ივენთს არ ჰქონია&#8230; თუმცა ორიოდე დღის წინ ყველაფერი შეიცვალა და ჩემთვის ერთი ფრიად საინტერესო აღმოჩენა გავაკეთე.</p>
<p>ასეთი რამ გინახავათ?</p>
<pre>
&lt;div onchange="handleEvent()"&gt;
//some other markup
&lt;/div&gt;
</pre>
<p>დამეთანხმებით რომ ერთი შეხედვით ამ ივენთის <strong>DIV </strong> ელემენტთან გამოყენება ცოტა არ იყოს უცნაურია ხომ? რა ცვლილება უნდა მოხდეს ისეთი <strong>DIV </strong> ელემენტში რომ მისი დამუშავება მოვახდინოთ ამგვარი გზით? ან დავუშვათ და მოხდა ასეთი ცვლილება მაგრამ რანაირად? </p>
<p>მინდა გაგახაროთ და გითხრათ, რომ, პასუხი მარტივია. <strong>DIV </strong> ელემენტში არანაირი ასეთი ცვლილება არ მოხდება, მაგრამ, თუ მის შიგნით გვაქვს რადმენიმე SELECT და INPUT ელემენტი რომელთა ცვლილების კონტროლი გვესაჭიროება ეს კოდი მომენტალურად იდეალურ გადაწყვეტად იქცევა!</p>
<p>კლასიკურად უფრო სწორად ძველი სკოლის მიდგომით ასეთი ამოცანის გადაჭრის დროს ყველა, SELECT და INPUT ელემენტის <strong>onchange</strong> ივენთს მივანიჭებდით ჰენდლერს. თუმცა თუ გავიხსენებთ ფაქტს რომ DOM დოკუმენტში ხდომილება ვრცელდება საწყისი ელემენტისგან(ელემენტი რომელზეც უშუალოდ მოხდა ესა თუ ის მოვლენა) ანუ ელემენტების იერარქიაში ქვევიდან ზევით, ჩემს მიერ ნაჩვენები კოდიც მომენტალურად პრაქტიკულ დანიშნულებას შეიძენს.  ამ ინფორმაციაზე დაყრდნობით შესაძლებელია ასეთი კოდის დაწერა:</p>
<div class="codecolorer-container html4strict blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;container&quot;</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;f1&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;f2&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/select.html"><span style="color: #000000; font-weight: bold;">select</span></a> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;s1&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;v1&quot;</span>&gt;</span>Value 1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;v2&quot;</span>&gt;</span>Value 2<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/option.html"><span style="color: #000000; font-weight: bold;">option</span></a>&gt;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/select.html"><span style="color: #000000; font-weight: bold;">select</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>ნაჩვენები კოდის შესაბამისი ამოცანა მდგომარეობს ყველა INPUT და SELECT ელემენტის <strong>onchange</strong> ივენთის დაჭერასა და შესაბამის დამუშავებაში. ნაცვლად იმისა რომ გამოვიყენოთ სათითაოდ ყველა ელემენტს onchange ივენთი, მარტივად შეგვიძლია გავაკეთოთ შემდეგი რამ:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'container'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onchage</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//მოვიპოვოთ Event ობიექტი</span><br />
&nbsp; &nbsp;e <span style="color: #339933;">=</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//მოვიპოვოთ საწყისი ელემენტი რომელზეც უშუალოდ დაფიქსირდა ივენთი</span><br />
&nbsp; &nbsp;<span style="color: #003366; font-weight: bold;">var</span> targetElement <span style="color: #339933;">=</span> e.<span style="color: #660066;">target</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">srcElement</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//თუ ელემენტი არის SELECT ან INPUT ტიპის შევასრულოთ დანარჩენი სამუშაო</span><br />
&nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^input|select$/i</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span>target.<span style="color: #660066;">nodeName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//do something here</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>დამეთანხმებით რომ ძალიან მარტივია ყველა ელემენტის ცვლილების ამდაგვარი ცენტრალიზებული კონტროლი. ეს არის ზუსტად ე.წ. Event Delegation მოდელი რომელიც ძალიან პოპულარულია დღესდღეობით. რატომ არ ვიცი მაგრამ ჩემთვის onchange ივენთი იმდენად ცალსახად იყო ასოცირებული ფორმის SELECT ელემენტთან რომ მისი ამდაგვარი გზით გამოყენების შესახებ არასოდეს მიფიქრია, თუმცა საბოლოო შედეგმა ყოველგვარ მოლოდინს გადააჭარბა.</p>
<p>იმედია ეს პირადად ჩემთვის ჭკუის სასწავლებელი შემთხვევა თქვენთვისაც სასარგებლო იქნება.</p>
<p>enjoy <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-wtf-vol-5-magic-of-onchange-event/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Ant, Rhino, YUICompressor &amp; JS Packer</title>
		<link>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer</link>
		<comments>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer#comments</comments>
		<pubDate>Mon, 22 Dec 2008 07:06:33 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Ant]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=155</guid>
		<description><![CDATA[დაახლოვებით ერთი წლის წინ ზედაპირულად შევეხე JavaScript ფაილების კომპრესიას. ძველი პოსტის მიხედვით თუ ვიმსჯელებთ არცთუ ისე ცუდი შედეგია. თუმცა რამდენიმე დეტალი მაინც საჭიროებს გადახედვას, კერძოდ კი: JavaScript ფაილების კომპრესიის პროცესი არ არის ავტომატიზებული; ფაილების კომპრესია მთლიანად ეყრდნობა დენ ედვარდსის ე.წ Packer &#8211; ს რომელიც გარკვეულ მიზეზთა გამო საკმაოდ მოუხერხებელია; პირველ რიგში სანამ გადავალთ უშუალოდ ფაილების [...]]]></description>
			<content:encoded><![CDATA[<p>დაახლოვებით ერთი წლის წინ ზედაპირულად შევეხე JavaScript ფაილების კომპრესიას. <a href="http://www.code.ge/apache/mod_deflate-js-css-file-compression">ძველი პოსტის</a> მიხედვით თუ ვიმსჯელებთ არცთუ ისე ცუდი შედეგია. თუმცა რამდენიმე დეტალი მაინც საჭიროებს გადახედვას, კერძოდ კი:</p>
<ul>
<li>JavaScript ფაილების კომპრესიის პროცესი არ არის ავტომატიზებული;</li>
<li>ფაილების კომპრესია მთლიანად ეყრდნობა დენ ედვარდსის ე.წ Packer &#8211; ს რომელიც გარკვეულ მიზეზთა გამო საკმაოდ მოუხერხებელია;</li>
</ul>
<p>პირველ რიგში სანამ გადავალთ უშუალოდ ფაილების კომპრესიის ავტომატიზაციის პროცედურაზე საჭიროა საბოლოო ამოცანის სრულად ჩამოყალიბება.</p>
<p><strong>მიზანი</strong></p>
<ul>
<li>JavaScript ფაილების გაერთიანება და ერთი საბოლოო ფაილის მიღება;</li>
<li>გაერთიანების შედეგად მიღებული ფაილის მინიფიკაცია და ობფუსკაცია;</li>
<li>მინიფიცირებული ფაილის ზომაში კიდევ უფრო მეტად შემცირება base62 კოდირებით;</li>
<li>საბოლოო ფაილის gzip კომპრესია;</li>
</ul>
<p><span id="more-155"></span><br />
პირველ რიგში მანამდე სანამ შევუდგებით JavaScript ფაილების კომპრესიის პროცესს მოვამზადოთ შესაბამისი გარემო, პირველ რიგში თქვენთვის მოსახერხებელ მისამართზე შექმენით კატალოგების შემდეგი სტრუქტურა:</p>
<pre>
project
    tools
    src
    build
</pre>
<p>ჩამოთვლილი პუნქტების რეალიზაციისათვის პოსტის სათაურში ნახსენები უტილიტებს გამოვიყენებთ.</p>
<p>უფრო კონკრეტულად კი მიზნის მისაღწევად დაგვჭირდება:</p>
<ul>
<li><a href="http://ant.apache.org/">Apache Ant</a> &#8211; თუ გიყენიათ JDK მას დამატებითი ინსტალაცია არ ესაჭიროება;</li>
<li>მოზილას <a href="http://www.mozilla.org/rhino/">Rhino &#8211; JavaScript for Java</a>, JavaScript კოდის შესასრულებლად. გადმოწერეთ ბოლო ვერსია გახსენით არქივი და დააკოპირეთ js.jar ფაილი /project/tools კატალოგში;</li>
<li>ჟულიენ ლეკომტეს მიერ შექმნილი <a href="http://www.julienlecomte.net/yuicompressor/">YUICompressor</a> რომელსაც გამოვიყენებთ JavaScript ფაილების მინიფიკაციისა და ობფუსკაციისათვის. გადმოწერეთ ბოლო ვერსია გახსენით არქივი დააკოპირეთ build კატალოგში არსებული yuicompressor-2.x.x.ჯარ ფაილი /project/tools კატალოგში, შეუცვალეთ მას სახელი და დაარქვით yuicompressor.jar;</li>
<li>დენ ედვარდსის <a href="http://dean.edwards.name/packer/">Packer</a> რომლის მეშვეობითაც შევამცირებთ უკვე მინიფიცირებულ ფაილის მოცულობას</li>
<li>ჩემს მიერ დაწერილ პატარა სკრიპტი რომელიც საშულებას მოგვცემს Ant სკრიპტიდან გამოვიძახოთ Packer &#8211; ის pack მეთოდი მინიფიცირებული კოდის base62 კოდირებისათვის. ფაილი აერთიანებს როგორც ჩემს მიერ დაწერილ კოდს, ასევე დენ ედვარდსის Packer &#8211; ს. გადმოწერეთ ფაილი და დააკოპირეთ იგი /project/tools კატალოგში</li>
</ul>
<p>სამუშაო გარემოს დასასრულებლად /project კატალოგში შექმენით ცარიელი build.xml ფაილი.<br />
საბოლოო ჯამში მივიღებთ კატალოგებისა და ფაილების ასეთ სტრუქტურას:</p>
<pre>
project
    tools
        js.jar
        yuicompressor.jar
        pack.js
    src
    build
    build.xml
</pre>
<p>მანამდე სანამ შევუდგებით ფაილების უშუალო კომპრესიას /project/src კატალოგში დააკოპირეთ თქვენთვის სასურველი/საჭირო JavaScript ფაილები. ამ პოსტის წერისას, ტესტირებისათვის გამოვიყენე ორი ფაილი, jquery-1.2.6.js და jQuery &#8211; ს პლაგინი jquery.form.js .</p>
<p>დროა შევუდგეთ Ant სკრიპტის წერას რომლის მეშვეობითაც გავაერთიანებთ ფაილებს, გამოვიძახებთ შესაბამის უტილიტებს საჭირო პარამეტრებით და მივიღებთ საბოლოო შედეგს.</p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project name="MyProject" default="build" basedir="."&gt;

    &lt;!-- Source Directory --&gt;
    &lt;property name="src" value="src" /&gt;
    &lt;!-- Build Directory --&gt;
    &lt;property name="build" value="build" /&gt;
    &lt;!-- Tools Directory --&gt;
    &lt;property name="tools" value="tools" /&gt;

    &lt;target name="init"&gt;
        &lt;!-- Cleanup build folder --&gt;
        &lt;delete&gt;
            &lt;fileset dir="${build}" includes="**/*.*"/&gt;
        &lt;/delete&gt;
    &lt;/target&gt;

    &lt;target name="build" depends="init"&gt;
        &lt;!-- Concatenate source files --&gt;
        &lt;concat destfile="${build}/library.js"&gt;
            &lt;filelist dir="${src}" files="jquery-1.2.6.js,jquery.form.js"/&gt;
        &lt;/concat&gt;
        &lt;!-- Minify concatenated file with YUICompressor --&gt;
        &lt;java fork="true" jar="${tools}/yuicompressor.jar"&gt;
            &lt;arg line="-o ${build}/library.min.js ${build}/library.js" /&gt;
        &lt;/java&gt;
        &lt;!-- Pack minified file with Dean Edwards' Packer --&gt;
        &lt;java fork="true" jar="${tools}/js.jar"&gt;
            &lt;arg line="${tools}/pack.js ${build}/library.min.js ${build}/library.pack.js" /&gt;
        &lt;/java&gt;
    &lt;/target&gt;

&lt;/project&gt;
</pre>
<p>ნაჩვენები Ant სკრიპტის დეტალების განხილვა სცილდება ამ პოსტის მიზანს, თუმცა ყველა მნიშნველოვან დირექტივას თანდართული აქვს კომენტარები ზოგადი წარმოდგენის შესაქმნელად. </p>
<p>სკრიპტის შექმნის შემდეგ ტერმინალიდან შედით თქვენი პროექტის კატალოგში და აკრიფეთ შემდეგი ბრძანება:</p>
<pre>
ant
</pre>
<p>პროცესის დასრულების შემდეგ ტერმინალში დაინახავთ დაახლოვებით მსგავს შედეგს:</p>
<pre>
Buildfile: /Users/iosebdzmanashvili/Sites/test/pack/build.xml
init:
build:
     [java] completed...
BUILD SUCCESSFUL
Total time: 17 seconds
</pre>
<p>მაშ ასე ფაილების გაერთიანების, მინიფიკაციის, ობფუსკაციისა და კოდის base62 კოდირებაში გადაყვანის პროცესი დასრულებულია. თუ შეხვალთ /project/build კატალოგში, დაგხვდებათ სამი ფაილი:</p>
<ul>
<li><strong>library.js</strong> &#8211; რომელშიც გაერთიანებულია ზემოთ ნახსენები ორი JS ფაილი. ამ ფაილის ზომა დაახლოვებით 124KB &#8211; ს შეადგენს;</li>
<li><strong>library.min.js</strong> &#8211; YUICompressor &#8211; ის მეშვეობით მინიფიცირებული ფაილი რომლის ზომაც დაახლოვებით 64KB &#8211; ა;</li>
<li><strong>library.pack.js</strong> &#8211; Packer &#8211; ის მეშვეობით base62 კოდირებაში გადაყვანილი ფაილი რომლის ზომაც დაახლოვებით 36KB &#8211; ა;</li>
</ul>
<p>დამერწმუნებით რომ შედეგი თვალსაჩიანოა და დამატებით კომენტარებს არ საჭიროებს, 124KB &#8211; დან საბოლოო ფაილი დავიყვანეთ 36KB &#8211; მდე რაც უდავოდ მნიშვნელოვანი სხვაობაა. თუ ამ ფაილს დამატებით პოსტის დასაწყიში ნახსენები მეთოდით დავამუშავებთ მისი ზომა დაახლოვებით 20KB &#8211; მდე დავა რაც თავისთავად ასევე მნიშვნელოვანია.</p>
<p>რეზიუმეს სახით ასევე მნიშვნელოვანია რამდენიმე დეტალი. თუ ფაილის მინიფიკაციის პროცესს შევასრულებდით მხოლოდ Packer &#8211; ის გამოყენებით, მივიღებდით დაახლოვებით იგივე შედეგს. თუმცა არსებობს ერთი საჩოთირო დეტალი რამაც YUICompressor &#8211; ის ჩართვისაკენ მიბიძგა.</p>
<p>როდესაც ვიყენებთ Packer &#8211; ს, მნიშნველოვანია გავითვალისწინოთ რომ ნებისმიერი ფუნქცია რომელსაც აღვწერთ სხვა ფუნქციისა ან მეთოდის შიგნით უნდა მთავრდებოდეს წერტილ მძიმით &#8220;;&#8221;. თუ ეს პირობა არ არის დაცული Packer &#8211; ის მიერ დაპატარავებული ფაილი უსარგებლო იქნება. ამ პროლემას აგვარებს YUICompressor, რადგან იგი ასეთ ფუნქციებს ავტომატურად ასრულებს წერტილ მძიმით ხოლო შედეგად ვღებულობთ სუფთა, Packer &#8211; ისათვის გამოსადეგ კოდს. მაგალითში ნაჩვენებია ასეთი შემთხვევა:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> myFunction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> myPrivateFunction <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//rest of code here</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #006600; font-style: italic;">//აქ აუცილებელია წერტილ მძიმე</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>სამწუხაროდ Packer &#8211; ს არ აქვს იმის უნარი რომ ასეთი მცირე პრობლემები მოაგვაროს თავისით, თუმცა როგორც უკვე აღვნიშნე ამ პრობლემის თავიდან არიდება შესაძლებელია YUICompressor &#8211; ის მეშვეობით.</p>
<p>ასევე ყურადღებას შევაჩერებ ჩემს მიერ დაწერილ პატარა სკრიპტზე რომლის მეშვეობითაც ხდება მინიფიცირებული კოდის base62 კოდირებაში გადაყვანა. სკრიპტი არის Rhino &#8211; ს რამდენიმე სტრიქონი კლიენტი რომლის შესრულებაც შესაძლებელია ტერმინალიდან. მას ესაჭიროება ორი პარამეტრი: 1) საწყისი ფაილი რომლის კოდირებაც გვესაჭიროება; 2) საბოლოო ფაილის სახელი; </p>
<p>Rhino &#8211; ს კლიენტი კითხულობს პირველ პარამეტრად გადაცემული ფაილიდან JavaScript კოდს, იძახებს Packer &#8211; ის pack მეთოდს შესაბამისი პარამეტრებით, და მიღებულ შედეგს ინახავს შესაბამის ფაილში:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">output <span style="color: #339933;">=</span> java.<span style="color: #660066;">io</span>.<span style="color: #660066;">FileWriter</span><span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">//obtain FileWriter object</span><br />
output.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; pack<span style="color: #009900;">&#40;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//invoke Dean Edward's packer function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; readFile<span style="color: #009900;">&#40;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//read input file: http://www.mozilla.org/rhino/shell.html</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arguments<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">//input file path</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #CC0000;">62</span><span style="color: #339933;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//base62 encode</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #CC0000;">0</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//shrink variable names?</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
output.<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'completed...'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//Dean Edwrads' Packer code here</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ant-rhino-yuicompressor-js-packer/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery &#8211; მორიგი დიდი აღიარება 2</title>
		<link>http://www.code.ge/posts/jquery-%e1%83%9b%e1%83%9d%e1%83%a0%e1%83%98%e1%83%92%e1%83%98-%e1%83%93%e1%83%98%e1%83%93%e1%83%98-%e1%83%90%e1%83%a6%e1%83%98%e1%83%90%e1%83%a0%e1%83%94%e1%83%91%e1%83%90-2</link>
		<comments>http://www.code.ge/posts/jquery-%e1%83%9b%e1%83%9d%e1%83%a0%e1%83%98%e1%83%92%e1%83%98-%e1%83%93%e1%83%98%e1%83%93%e1%83%98-%e1%83%90%e1%83%a6%e1%83%98%e1%83%90%e1%83%a0%e1%83%94%e1%83%91%e1%83%90-2#comments</comments>
		<pubDate>Mon, 29 Sep 2008 05:59:23 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=148</guid>
		<description><![CDATA[თითქმის ერთი წელი გავიდა მას შემდეგ რაც jQuery &#8211; ს დიდ აღიარებაზე დავპოსტე. ამ JavaScript ბიბლიოთეკას ჩემი ადვოკატობა ნამდვილად არ ესაჭიროება, მაგრამ, ამჯერად მისი აღიარების ძალიან მნიშვნელოვან ფაქტს აქვს ადგილი და არ შემიძლია არ დავწერო jQuery &#8211; ს ოფიციალურ ბლოგზე ბოლო პოსტი ამ ღირსშესანიშნავ მოვლენას ეძღვნება: jQuery, Microsoft, and Nokia Microsoft თავის ცნობილ ASP.NET Ajax [...]]]></description>
			<content:encoded><![CDATA[<p>თითქმის ერთი წელი გავიდა მას შემდეგ რაც <a href="http://www.code.ge/javascript/jquery-მორიგი-დიდი-აღიარება">jQuery &#8211; ს დიდ აღიარებაზე დავპოსტე</a>. ამ JavaScript ბიბლიოთეკას ჩემი ადვოკატობა ნამდვილად არ ესაჭიროება, მაგრამ, ამჯერად მისი აღიარების ძალიან მნიშვნელოვან ფაქტს აქვს ადგილი და არ შემიძლია არ დავწერო <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>jQuery &#8211; ს ოფიციალურ ბლოგზე ბოლო პოსტი ამ ღირსშესანიშნავ მოვლენას ეძღვნება: <a href="http://jquery.com/blog/2008/09/28/jquery-microsoft-nokia/">jQuery, Microsoft, and Nokia</a></p>
<p>Microsoft თავის ცნობილ <a href="http://www.asp.net/ajax/">ASP.NET Ajax</a> ფრეიმვორკს სწორედ jQuery &#8211; თი გააფართოვებს და იგი გავრცელდება ვიჟუალ სტუდიოსთან ერთად. Nokia კი თავის <a href="http://www.s60.com/life/thisiss60/s60indetail/technologiesandfeatures/webruntime">Web Run-Time</a> &#8211; ს გაამდიდრებს ამ ბიბლიოთეკით.</p>
<p>ასევე ამ თემას ეხება და ძალიან საინტერესოა GWTQuery(jQuery &#8211; ის მსგავსი იმპლემენტაცია) რომელიც GWT &#8211; ს ბოლო რელიზის პრეზენტაციის დროს აშკარად აქცენტირებული იყო <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>მანამდე რომ YUI &#8211; შიც დაამატეს ე.წ &#8220;query selector&#8221; &#8211; ის იმპლემენტაცია მაგაზე აღარაფერს ვამბობ&#8230; მთავარი ერთია, რომ ის მიდგომა რომელიც შეიმუშავა ჯონ რეზიგმა, დომინანტი აღმოჩნდა დღევანდელ JavaScript ბიბლიოთეკების გადატვირთულ ბაზარზე. არადა როგორ მწარედ მახსოვს რამდენჯერ მიკამათია მწარედ როგორც .Net &#8211; ის, ასევე GWT &#8211; სა და YUI &#8211; ს თაყვანისმცემლებთან jQuery &#8211; ის უპირატესობაზე&#8230; მაგრამ უშედეგოდ <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  თუმცა როგორც იტყვიან აღდგომა და ხვალეო, დრომ ყველაფერი დაამტკიცა და თავის ადგილზე დააყენა&#8230; </p>
<p>Long Live jQuery <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/jquery-%e1%83%9b%e1%83%9d%e1%83%a0%e1%83%98%e1%83%92%e1%83%98-%e1%83%93%e1%83%98%e1%83%93%e1%83%98-%e1%83%90%e1%83%a6%e1%83%98%e1%83%90%e1%83%a0%e1%83%94%e1%83%91%e1%83%90-2/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>საინტერესო JavaScript ტესტი meebo.com &#8211; ზე</title>
		<link>http://www.code.ge/posts/interesting-javascript-test-at-meeb</link>
		<comments>http://www.code.ge/posts/interesting-javascript-test-at-meeb#comments</comments>
		<pubDate>Wed, 23 Jul 2008 23:28:48 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=134</guid>
		<description><![CDATA[ეხლახანს meebo.com &#8211; ზე შევიარე, და რატომღაც ვაკანსიების განყოფილებას გადავხედე, დამაინტერესა რა პოზიციებზე აქვს ვაკანსიები ამ კომპანიას&#8230; ერთერთი აღმოჩნდა javascript engineer (javascript ninja) და რატომღაც გადავხედე პოსტში, ვაკანსიის აღწერის გარდა მითითებულია რამდენიმე JavaScript &#8211; თან დაკავშირებული შეკითხვა, და შევეცადე პასუხები გამეცა, ჩემის აზრით ეს დაგაინტერესებთ: 1. When does div.setAttribute(&#8220;###&#8221;) not equal div.###? საკმაოდ მარტივი შეკითხვაა [...]]]></description>
			<content:encoded><![CDATA[<p>ეხლახანს meebo.com &#8211; ზე შევიარე, და რატომღაც ვაკანსიების განყოფილებას გადავხედე, დამაინტერესა რა პოზიციებზე აქვს ვაკანსიები ამ კომპანიას&#8230; ერთერთი აღმოჩნდა <a href="http://www.meebo.com/jobs/javascript/">javascript engineer (javascript ninja)</a> და რატომღაც გადავხედე <img src='http://www.code.ge/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>პოსტში, ვაკანსიის აღწერის გარდა მითითებულია რამდენიმე JavaScript &#8211; თან დაკავშირებული შეკითხვა, და შევეცადე პასუხები გამეცა, ჩემის აზრით ეს დაგაინტერესებთ<span id="more-134"></span>:</p>
<blockquote><p><strong>1. When does div.setAttribute(&#8220;###&#8221;) not equal div.###?</strong></p></blockquote>
<p>საკმაოდ მარტივი შეკითხვაა რადგან MDC &#8211; ს დოკუმენტაციაში პირდაპირ წერია, რომ, DOM ელემენტს ატრიბუტის შექმნის და მისთვის საწყისი მნიშნველობის მინიჭების აუცილებლობის შემთხვევაში უნდა გამოვიყენოთ el.setAttribute(attName, attValue); მეთოდი. ხოლო ამ ატრიბუტის მნიშვნელობის შემდეგი ცვლილებისათვის უნდა გამოვიყენოთ ელემენტის თვისება, ანუ: el.attName = attValue და არა setAttribute მეთოდი;</p>
<p>ციტატა დოკუმენტაციის გვერდიდან:</p>
<blockquote><p>Using setAttribute() to modify certain attributes, most notably value in XUL and HTML and selected in HTML, works inconsistently, as the attribute specifies the default value. To access or modify the current values, you should use the properties. For example, use elt.value instead of elt.setAttribute(&#8216;value&#8217;, val).</p></blockquote>
<blockquote><p><strong>2. What&#8217;s the difference between these two statements:</strong></p>
<pre>a. var x = 3;
b. x = 3;</pre>
</blockquote>
<p>ეს შეკითხვაც არ მიეკუთვნება რთულ კატეგორიას. var ქივორდის გამოყენება ცვლადის აღწერის წინ მისი სკოუპის(გლობალური, ფუნქციის, კლასის) ფიქსაციისათვის გამოიყენება. ხოლო თუ არარსებულ ცვლადს მივანიჭებთ მნიშვნელობას var &#8211; ის გამოყენების გარეშე, მაშინ ეს ცვლადი გლობალურ კონტექსტში მოხვდება.</p>
<blockquote><p><strong>3. What&#8217;s the difference between:</strong></p>
<pre>a. !!(obj1 &#038;&#038; obj2)
b. (obj1 &#038;&#038; obj2)</pre>
</blockquote>
<p>ამ შემთხვევაში ნაჩვენებ ორ გამოსახულებას შორის <strong>მგონი</strong> არანაირი განსხვავება არ უნდა იყოს. <strong>a</strong> ვარიანტში, გამოსახულების წინ მითითებული ორი ძახილის ნიშანი(!!) ნიშნავს შემდეგს: მარჯვენა ძახილის  ნიშანი (obj1 &#038;&#038; obj2) გამოსახულების დაიყვანს boolean ტიპზე და შეცვლის მას საპირისპირო მნიშვნელობით(ანუ თუ გამოსახულების შედეგია false საპირისპირო მნიშვნელობა იქნება true და პირიქით), ხოლო მარცხენა ძახილის ნიშანი კვლავ შეცვლის ამ საპირისპირო მნიშვნელობას შესაბამისად.</p>
<p><strong>a</strong> შემთხვევაში (obj1 &#038;&#038; obj2) გამოსახულება ნებისმიერ შემთხვევაში დააბრუნების boolean ტიპის მნიშნველობას &#038;&#038; &#8211; ის გამო, ხოლო ზემოთ აღწერილი ძახილის ნიშნების გამოყენება საბოლოო ჯამში მაინც იგივე შედეგს მოგვცემს.</p>
<p>რადან b შემთხვევაშიც a &#8211; ს მსგავსად, გამოსახულება აუცილებლად აბრუნებს boolean ტიპის მნიშვნელობას, ეს ნიშნავს იმას რომ ამ ორ გამოსახულებას შორის არანაირი განსხვავება არ არსებობს.</p>
<blockquote><p><strong>4. Write a one-line piece of JavaScript code that concatenates all strings passed into a function:</strong></p>
<pre>function concatenate(/*any number of strings*/) {
    var string = /*your one line here*/
    return string;
}</pre>
</blockquote>
<p>ეს შეკითხვა ძალიან საინტერესოა. პირობა მოითხოვს რომ, concatenate() ფუნქციისათვის გადაცემული ნებისმიერი რაოდენობის სტრიქონული ტიპის პარამეტრის კონკატენაცია მოხდეს ერთი სტრიქონი კოდით. JavaScript &#8211; ში ფუნქციის გამოძახების დროს, მას შეგვიძლია გადავცეთ ნებისმიერი რაოდენობის პარამეტრი. ფუნქციისათვის გადაცემული ყველა პარამეტრი ინახება <strong>arguments</strong> ობიექტში ჩამონათვალის სახით. ერთი შეხედვით arguments ობიექტი მასივს წააგავს, მაგრამ სინამდვილეში იგი ნამდვილი მასივი არ არის. გამომდინარე აქედან,  არგუმენტების გაერთიანებას Array ობიექტის join() მეთოდის გამოყენებით ვერ შევძლებთ&#8230; რადგან arguments ობიექტს Array ობიექტის მეთოდები არ გააჩნია.</p>
<p>ამისათვის მოგვიწევს მსგავსი კოდის დაწერა:</p>
<pre>function concatenate() {
    var string = Array.prototype.join.call(arguments);
    return string;
}

alert(concatenate('s1', 's2', 's3', 's4'));</pre>
<p>გამოსავალი მდგომარეობს ფუნქციის <strong>call</strong> მეთოდის გამოყენებაში(იხ. <a href="http://www.code.ge/javascript/javascript-wtf-vol-1">პოსტი call და apply მეთოდების შესახებ</a>). </p>
<p>პირველ რიგში Array ობიექტის join მეთოდს მივმართავთ prototype თვისების მეშვეობით. ხოლო შემდეგ ვიძახებთ ფუნქციის call მეთოდს, რომელსაც პირველ პარამეტრად გადაეცემა კონტექსტი. ამიტომ join() მეთოდის შესრულება მოხდება უშუალოდ arguments ობიექტის კონტექსტში, რაც თავის მხრივ join() მეთოდს წვდომას მისცემს arguments ობიექტის ყველა თვისებაზე. გამომდინარე იქედან რომ, arguments ობიექტი არის იტერირებადი, და მას გააჩნია length თვისება(რომელიც ასევე გააჩნია Array ობიექტს), join() მეთოდს ეძლევა იმის საშუალება რომ arguments ობიექტის ელემენტები დააჯგუფოს. შედეგად მივიღებთ ასეთ &#8220;s1,s2,s3,s4&#8243; კონკატენირებულ სტრიქონს.</p>
<blockquote><p><strong>5. What do these two examples have in common?</strong></p>
<p><strong>Example 1:</strong></p>
<pre>var obj = document.getElementById('adiv');
document.getElementById('adiv').ptr = obj;</pre>
<p><strong>Example 2:</strong></p>
<pre>function assignClick() {
    var el = document.createElement('div');
    function handleClick() {
        el.innerHTML = 'clicked!';
    }
    el.attachEvent("onclick", handleClick);
}</pre>
</blockquote>
<p>ხო, ამ შეკითხვამ ცოტა არ იყოს დამაბნია, და არ ვიცი რამდენად სწორად მივხვდი. თუ თქვენს მოსაზრებებს მომაშველებთ ძალიან გამახარებთ <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>რამდენადაც მე ვვარაუდობ, პირველ მაგალითში DOM ელემენტის .ptr თვისებას უბრალოდ ვანიჭებთ obj ობიექტს.</p>
<p><del datetime="2008-07-27T19:56:55+00:00">მეორე მაგალითშიც იგივესთან უნდა გვქონდეს საქმე, რადგან attachEvent არის ივენთებთან მუშაობის IE &#8211; ს მოდელი რომელიც არცერთ სხვა ბრაუზერში არ გვხვდება. ნაჩვენებ კოდსა el.attachEvent(&#8220;onclick&#8221;, handleClick) და el.onclick =  handleClick ამ კოდს შორის კი არანაირი განსხვავება არ არსებობს. W3C მოდელისგან განსხვავებით IE &#8211; ს attachEvent ზუსტად იგივეს აკეთებს რაც ელემენტის თვისებაზე ობიექტის მინიჭებაა(იხ. <a href="http://www.code.ge/javascript/ie-vs-w3c-event-handling">განსხვავება IE და W3C მოდელებს შორის</a>). ამ განსხვავების საფუძველზე ვივარაუდე ეს პასუხი, თუმცა დარწმუნებული ნამდვილად არ ვარ.</del></p>
<p><strong>Update:</strong> სწორი პასუხი იხილეთ კომენტარებში, მთელი წინა(წაშლილი) აბზაცი წარმოადგენს სრულ სისულელეს <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/interesting-javascript-test-at-meeb/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IE6: მეხსიერების მენეჯმენტი და საინტერესო გამოსავალი</title>
		<link>http://www.code.ge/posts/ie6-memory-managemnt-and-interesting-solution</link>
		<comments>http://www.code.ge/posts/ie6-memory-managemnt-and-interesting-solution#comments</comments>
		<pubDate>Wed, 12 Mar 2008 13:14:07 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/ie6-memory-managemnt-and-interesting-solution</guid>
		<description><![CDATA[ამ ბოლო დროს საკმაოდ ბევრს ვმუშაობა IE6 &#8211; ის მეხსიერებასთან დაკავშირებულ პრობლემებზე ე.წ. &#8220;memory leaks&#8221;. გამოცდილი JavaScript(უფრო სწორად JScript IE &#8211; ს კონტექსტში) დეველოპერებისათვის ეს პრობლემა უცხო არ არის. იმაზე ლაპარაკი თუ რატომ არსებობს ეს პრობლემა შორს წაგვიყვანს, ამიტომ კონკრეტული პრობლემის აღწერითა და მოძებნილი გამოსავალით შემოვიფარგლები. მიუხედავად იმისა, რომ მეხსიერებასთან დაკავშირებული გაუგებრობების თავიდან ასაცილებლად არსებობს [...]]]></description>
			<content:encoded><![CDATA[<p>ამ ბოლო დროს საკმაოდ ბევრს ვმუშაობა IE6 &#8211; ის მეხსიერებასთან დაკავშირებულ პრობლემებზე ე.წ. &#8220;memory leaks&#8221;. გამოცდილი JavaScript(უფრო სწორად JScript IE &#8211; ს კონტექსტში) დეველოპერებისათვის ეს პრობლემა უცხო არ არის. იმაზე ლაპარაკი თუ რატომ არსებობს ეს პრობლემა შორს წაგვიყვანს, ამიტომ კონკრეტული პრობლემის აღწერითა და მოძებნილი გამოსავალით შემოვიფარგლები.</p>
<p>მიუხედავად იმისა, რომ მეხსიერებასთან დაკავშირებული გაუგებრობების თავიდან ასაცილებლად არსებობს გარკვეული წესები რომლებიც აუცილებლად უნდა დავიცვათ, მაინც ჩემის აზრით ძალიან უცნაურ პრობლემას და შესაბამისად გამოსავალს წავაწყდი.</p>
<p>ჩემი ამოცანა იყო გამეკეთებინა ისეთი ტეგი, რომელზეც მაუსით დაწკაპუნებისას იგი გარდაიქმნებოდა ტექსტურ ველად, რათა შესაძლებელი გამხდარიყო ამ ტეგის შიგთავსის რედაქტირება (იხ. <a href="http://www.code.ge/samples/memleak.htm">მაგალითი</a>).<span id="more-112"></span></p>
<p>ამოცანა ძალიან მარტივია, თუმცა ჩემდა გასაოცრად მეხსიერების პრობლემა წარმოიქმნა. მეხსიერებაში რჩებოდა მიმთითებელი ამ ახლად შექმნილ input ელემენტზე, რასაც IE6 &#8211; ის შემთხვევაში მეხსიერების გადავსებამდე მივყევართ.</p>
<p>ამ ამოცანის გადასაწყვეტად დავწერე შემდეგი კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//ფუნქცია რომელიც ქმნის ტექსტურ ველს</span><br />
<span style="color: #003366; font-weight: bold;">function</span> getInput<span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> input <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input.<span style="color: #660066;">type</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">'text'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; input.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> value <span style="color: #339933;">||</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> window.<span style="color: #660066;">event</span> <span style="color: #339933;">||</span> e<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">cancelBubble</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">returnValue</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input.<span style="color: #660066;">onkeydown</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> key <span style="color: #339933;">=</span> e.<span style="color: #660066;">which</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">keyCode</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>key <span style="color: #339933;">==</span> 13<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #000066;">onblur</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input.<span style="color: #000066;">onblur</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> input<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ფუნქცია რომლის მეშვეობითაც კონკრეტული ელემენტს ვაქცევთ რედაქტირებად ველად</span><br />
<span style="color: #003366; font-weight: bold;">function</span> makeEditable<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> input <span style="color: #339933;">=</span> getInput<span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">innerHTML</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">firstChild</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">firstChild</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; obj.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; input.<span style="color: #660066;">select</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; input.<span style="color: #000066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ეს ორი ფუნქცია ძალიან მარტივია და მათი დეტალური აღწერით არ შეგაწყენთ თავს. რაც მთავარია ამ კოდმა იმუშავა და შედეგიც შესაბამისი მივიღე. თუმცა ნაჩვენები მაგალითის <a href="http://blogs.msdn.com/gpde/pages/javascript-memory-leak-detector.aspx">Memory Leak Detector</a> &#8211; ით გატესტვის შემდეგ (IE6 რეჟიმში), აღმოჩნდა რომ input ელემენტზე რჩებოდა მიმთითებელი.</p>
<p>კერძოდ კი, ინსტრუმენტმა მიმითითა კოდის ამ ნაწილზე:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; &nbsp;input.<span style="color: #660066;">onkeydown</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> key <span style="color: #339933;">=</span> e.<span style="color: #660066;">which</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">keyCode</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>key <span style="color: #339933;">==</span> 13<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #000066;">onblur</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>სიმართლე ითქვას საბოლოოდ ვერ გავერკვიე რა იყო ამის მიზეზი, იმიტომ რომ სხვა მსგავს შემთხვევებში ნამდვილად არ წავწყდომივარ იგივე პრობლემას.</p>
<p>რაც შეეხება გამოსავალს, ერთადერთი რასაც მივხვდი input ელემენტი როგორმე უნდა გამენადგურებინა თავად &#8220;getInput&#8221; ფუნქციაში. რამდენიმე ხერხი გამოვიყენე, და საბოლოო ჯამში მივედი ასეთ შედეგამდე რამაც საბოლოოდ მოაგვარა პრობლემა:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> getInput<span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> input <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">type</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">'text'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; input<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> value <span style="color: #339933;">||</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> window.<span style="color: #660066;">event</span> <span style="color: #339933;">||</span> e<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">cancelBubble</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">returnValue</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">onkeydown</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> key <span style="color: #339933;">=</span> e.<span style="color: #660066;">which</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">keyCode</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>key <span style="color: #339933;">==</span> 13<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #000066;">onblur</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; input<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span>.<span style="color: #000066;">onblur</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> input.<span style="color: #660066;">pop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>განსხვავებით პირველი ვარიანტისგან, თუ ყურადღებით დააკვირდებით კოდს დაინახავთ რომ ნაცვლად ცვლადზე პირდაპირ DOM ელემენტის მინიჭებისა, ამისათვის გამოვიყენე ჩვეულებრივი მასივი. ხოლო ფუნქციიდან მნიშვნელობის დაბრუნების დროს მასივის &#8220;pop&#8221; მეთოდი რომელიც მასივიდან ამოაგდებს ბოლო ელემენტს და აბრუნებს მას.</p>
<p>ამ მიდგომით ფაქტიურად ფუნქციაშივე მოვახდინეთ ელემენტის ე.წ. dereference, რამაც საბოლოო ჯამში მეხსიერების პრობლემა მოაგვარა. იგივე ინსტრუმენტით სკრიპტის გატესტვის შემდგომ აღარავითარი მიმთითებელი &#8220;input&#8221; ელემენტზე აღარ დარჩა.</p>
<p>მიუხედავად იმისა რომ ჩემთვის პირადად ბუნდოვანი დარჩა რა იწვევს მეხსიერების ამ პრობლემას, ჩემის აზრით ამ პატარა ამოცანამ ძალიან საინტერესო ხერხი მასწავლა, რომელიც ფუნქციიდან დასაბრუნებელ მნიშვნელობის მასივის მეშვეობით განადგურებაში მდგომარეობს.</p>
<p>იმედია ეს პატარა მაგრამ საინტერესო(ჩემის აზრით) დეტალი თქვენთვისაც სასარგებლო იქნება <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ie6-memory-managemnt-and-interesting-solution/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JavaScript ფაილების ჩატვირთვა საჭიროების მიხედვით</title>
		<link>http://www.code.ge/posts/loading_javascript_files_on_demand</link>
		<comments>http://www.code.ge/posts/loading_javascript_files_on_demand#comments</comments>
		<pubDate>Sat, 08 Mar 2008 12:21:24 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/loading_javascript_files_on_demand</guid>
		<description><![CDATA[თანამედროვე ე.წ. RIA ვებ აპლიკაციებში, კლიენტის მხარეს განსაკუთრებული და საპასუხისმგებლო როლი აკისრია. სწორედ კლიენტის მხარეს იყრის თავს უამრავი CSS/JavaScript და სხვადასხვა გრაფიკული ელემენტები. RIA ტიპისი სისტემებში JavaScript &#8211; ს განსაკუთრებული როლი უჭირავს, რადგან სწორედ მისი მეშვეობით მიიღწევა აპლიკაციის განსაკუთრებული და მიმზიდველი ინტერქატიულობა. რაც უფრო მეტად არის დატვირთული მსგავსი ტიპის ელემენტებით აპლიკაცია მით უფრო მეტ რესურსს [...]]]></description>
			<content:encoded><![CDATA[<p>თანამედროვე ე.წ. RIA ვებ აპლიკაციებში, კლიენტის მხარეს განსაკუთრებული და საპასუხისმგებლო როლი აკისრია. სწორედ კლიენტის მხარეს იყრის თავს უამრავი CSS/JavaScript და სხვადასხვა გრაფიკული ელემენტები. RIA ტიპისი სისტემებში JavaScript &#8211; ს განსაკუთრებული როლი უჭირავს, რადგან სწორედ მისი მეშვეობით მიიღწევა აპლიკაციის განსაკუთრებული და მიმზიდველი ინტერქატიულობა. რაც უფრო მეტად არის დატვირთული მსგავსი ტიპის ელემენტებით აპლიკაცია მით უფრო მეტ რესურსს საჭიროებს იგი.</p>
<p>ერთი შეხედვით ამ ტიპის რესურსები(იგულისხმება ფაილების რაოდენობა, ზომა და ა.შ.) არ უნდა იწვედნენ განსაკუთრებულ სირთულეს, არც ჩატვირთვისა და არც სისწრაფის მიხედვით&#8230; თუმცა ეს მხოლოდ ერთი შეხედვით ჩანს ასე.</p>
<p>Yahoo! &#8211; ს ინჟინრებმა საკმაოდ საფუძვლიანი კვლევა ჩაატარეს ამ თემასთან დაკავშირებით და აღმოჩნდა რომ სერვერის გადატვირთვას სწორედ, დოკუმენტში ჭარბად გამოყენებული მსგავსი ელემენტები იწვევენ. გარდა სერვერის დატვირთვისა ეს თავისთავად ცხადია უარყოფითად აისახება თავად აპლიკაციის მომხმარებლებზე(ჩატვირთვის სისწრაფე, კოდის შესრულების/ინტერპრეტაციის დრო).<span id="more-111"></span></p>
<p>თუ მათ(და არა მხოლოდ მათ) რეკომენდაციებს გავითვალისწინებთ, ყოველი არასაჭირო ელემენტი უნდა ჩაიტვირთოს საჭიროების მიხედვით და არა ერთბაშად როგორც ეს ხდება უამრავ აპლიკაციაში.</p>
<p>ხშირ შემთხვევაში გამომდინარე ამოცანიდან და სისტემის სირთულიდან ასეთი ელემენტების საერთო რაოდენობამ ზომის მხრივ შესაძლებელია ჯამში შეადგინოს 500/1000 KB. ამ რესურსების ჩამოტვირთვას დამეთანხმებით რომ არცთუ ცოტა დრო და რესურსი ესაჭიროება. თუმცა ამ ელემენტებიდან მე პირადად გამოვარჩევდი JavaScript ფაილებს.</p>
<h2>პრობლემა</h2>
<p>რითია განსაკუთრებული JavaScript ფაილების ჩატვირთვის პროცესი? პირველ რიგში გავიხსენოთ თუ როგორ ვტვირთავთ JS ფაილებს ბრაუზერში:</p>
<pre>
&lt;script src="somefolder/somefile.js" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<p>ეს არის სტანდარტული კოდი რომელსაც ვიყენებთ ყველა JS ფაილების ჩასატვირთად. რა არის მასში განსაკუთრებული და პრობლემატური? პირველ რიგში განსაკუთრებულობა მდგომარეობს იმაში, რომ სანამ ბრაუზერი სერვერიდან ჩამოტვირთავს ამ ფაილს, სხვა ყველა პროცესი ჩერდება. გარდა ჩამოტვირთვისა ბრაუზერმა ჩამოტვირთულ კოდს უნდა გაუკეთოს ანალიზი, აღარაფერს ვამბობ იმ შემთხვევაზე თუ ფაილი ჩატვირთვის თანავე სრულდება და გარკვეული სირთულის ოპერაციებს ასრულებს. </p>
<p>ცხადია ერთი და ორი მცირე ზომის ფაილის შემთხვევაში ეს არანაირ პრობლემას არ წარმოადგენს, მაგრამ შეგახსენებთ რომ ამ შემთხვევაში საუბარი გვაქვს RIA &#8211; ზე, სადაც ხშირ შემთხვევაში ათობით მსგავსი ფაილის ჩატვირთვა ხდება საჭირო, რაც თავისთავად ცხადია იწვევს აპლიკაციის ჩატვირთვის საგრძნობლად შენელებას.</p>
<p>ამ პრობლემის გვერდის ავლის რამდენიმე მექანიზმი არსებობს, მათ შორის ბევრი ფაილის ერთ ფაილში მოქცევა და მისი კომპრესია რაც ნამდვილად ძალიან ეფექტური საშუალებაა, და ასევე JS ფაილების ჩატვირთვის კოდის დოკუმენტის ბოლოში მოქცევა body ტეგის დახურვამდე.</p>
<p>ამ საშუალებებიდან პირველი ნებისმიერ შემთხვევაში აუცილებელია, თუმცა მეორე მიდგომა ყოველთვის არ გამოდგება, რადგან ხშირად აპლიკაცია სრულად JavaScript &#8211; ზეა დამოკიდებული და მისი ჩატვირთვა/ინტერპრეტირება/შესრულება ნებისმიერ შემთხვევაში უნდა დასრულდეს რათა მომხმარებელმა შეძლოს სისტემასთან მუშაობა.</p>
<p>მიუხედავად პირველი მეთოდის ეფექტურობისა და აუცილებლობისა(!) ხშირად ესეც კი არ არის საკმარისი. წარმოგიდგენიათ ისეთი სისტემა რომელსაც ყველა მოდული ერთდროულად ესაჭიროება? და ამ ყველაფრის ერთად ჩატვირთვა აუცილებელია? დამეთანხმებით რომ ასეთი ტიპის სისტემებს იშვიათად შევხვდებით. სწორედ ამ ბოლო პრობლემიდან გამომდინარეობს JS ფაილების საჭიროების მიხედვით ჩატვირთვის ამოცანა. ამ პრობლემის გადასაჭრელად არსებობს სპეციალური ბიბლიოთეკები, სხვადასხვა ბიბლიოთეკებს გააჩნიათ ამ ამოცანის გადაჭრის საშუალებები, თუმცა ყოველთვის გარე ბიბლიოთეკებზე დამოკიდებულნი ვერ ვიქნებით და ზოგს შესაძლებელია ჩემსავით უყვარს ამ ენაზე კოდირება და პრობლემების თავად გადაჭრა. სწორედ ასეთი ხალხისთვის არის განკუთვნილი ეს პოსტი <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>გადაწყვეტა</h2>
<p>როგორ უნდა ჩავტვირთოთ JS ფაილი საჭიროების დროს? პრინციპში ეს ძალიან მარტივი გასაკეთებელია(თუმცა ერთი შეხედვით), მაგალითში მოყვანილია შესაბამისი კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* @param String source of the JavaScript file<br />
&nbsp;*/</span><br />
<span style="color: #003366; font-weight: bold;">function</span> loadJS<span style="color: #009900;">&#40;</span>src<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//შევქმნათ &quot;script&quot; ელემენტი</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> script <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//მივუთითოთ ფაილის მისამართი</span><br />
&nbsp; &nbsp; &nbsp; script.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> src<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; script.<span style="color: #660066;">type</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'text/javascript'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ჩავამატოთ ახლად შექმნილი &quot;script&quot; ელემენტი, დოკუმენტის head სექციაში</span><br />
&nbsp; &nbsp; &nbsp; document.<span style="color: #660066;">head</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>სიმართლე ითქვას ფაილის ჩასატვირთად ზემოთ ნაჩვენები კოდი სრულებით საკმარისია&#8230; მაგრამ ზემოთ აღვნიშნე რომ ეს ამოცანა მარტივი მხოლოდ ერთი შეხედვით არის.</p>
<p>რაში მდგომარეობს ზუსტი პრობლემა? ამ ამოცანის გადაჭრისას თავის დროზე წავაწყდი შემდეგ პრობლემებს:</p>
<ol>
<li>თუ ფაილი ჩატვირთულია აღარ უნდა მოხდეს მისი ხელახალი ჩატვირთვა;</li>
<li>ფაილის ზომიდან და ქსელის სისწრაფიდან გამომდინარე არ ვიცით როდის დაასრულებს ფაილი ჩატვირთვას;</li>
<li>უნდა დავადგინოთ როდის დასრულდა ფაილის ჩატვირთვა, და ის კოდი რომელის შესრულებაც დამოკიდებულია ახლად ჩატვირთულ ფაილზე, შესრულდეს მხოლოდ ჩამოტვირთვის დასრულების შემდეგ;</li>
<li>დასრულდა თუ არა ფაილის ჩამოტვირთვა მარტივი დასადგენია, თუმცა აქ განსხვავებამ იჩინა თავი ბრაუზერებს შორის. რა თქმა უნდა IE &#8211; მ გაიბრწყინა ტრადიციულად;</li>
</ol>
<p>მაშ ასე, მივყვეთ ლოგიკურად:</p>
<ol>
<li><strong>თუ ფაილი ჩატვირთულია აღარ უნდა მოხდეს მისი ხელახალი ჩატვირთვა</strong>
<p>ეს დეტალი სირთულეს არ წარმოადგენს, რადგან შესაძლებელია ჩატვირთული სკრიპტების მისამართების შენახვა და შემდგომ უკვე შედარების გაკეთება უკვე არსებულ მონაცემებთან. </p>
<p>მე პირადად ამისათვის გამოვიყენე ჩვეულებრივი ობიექტი შემდეგი ხერხით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* @param String source of the JavaScript file<br />
&nbsp;*/</span><br />
<span style="color: #003366; font-weight: bold;">function</span> loadJS<span style="color: #009900;">&#40;</span>src<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//რადგან ფუნქცია ასევე არის ობიექტი, </span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//მისთვის ახალი &quot;სტატიკური&quot; წევრის დამატება </span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//შესაძლებელია ქვემოთ ნაჩვენები ხერხით</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>loadJS.<span style="color: #660066;">scripts</span> <span style="color: #339933;">==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ობიექტის შექმნა რომელშიც შევინახავთ ჩატვირთული ფაილების მისამართებს</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">scripts</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ყველა &quot;script&quot; ელემენტის მოპოვება და შემდგომ იტერაციის გზის მისამართების მოგროვება</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> scripts <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> scripts.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>scripts<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">&amp;&amp;</span> scripts<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//მისამართის შენახვა ობიექტის გასაღების სახით</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">scripts</span><span style="color: #009900;">&#91;</span>scripts<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">src</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>როგორც მაგალითიდან ვხედავთ, ამ პრობლემის გადასაჭრელად საკმაოდ მარტივი მეთოდი გამოვიყენეთ. &#8220;script&#8221; ელემენტების იტერაციითა და &#8220;src&#8221; ატრიბუტის მნიშვნელობების მოგროვების გზით.</p>
</li>
<li><strong>ფაილის ზომიდან და ქსელის სისწრაფიდან გამომდინარე არ ვიცით როდის დაასრულებს ფაილი ჩატვირთვას;</strong></li>
<li><strong>უნდა დავადგინოთ როდის დასრულდა ფაილის ჩატვირთვა, და ის კოდი რომელის შესრულებაც დამოკიდებულია ახლად ჩატვირთულ ფაილზე, შესრულდეს მხოლოდ ჩამოტვირთვის დასრულების შემდეგ;</strong>
<p>მეორე და მესამე პუნქტები ურთიერთდაკავშირებულია, და ამ პრობლემების გადასაჭრელად გვესაჭიროება ორი რამ: ა) &#8220;loadJS&#8221; ფუნქციისათვის მეორე პარამეტრის დამატება, რომელიც იქნება ე.წ. callback &#8211; ფუნქცია, რომლის გამოიძახებაც ფაილის ჩატვირთვის დასრულების შემდეგ მოხდება; ბ) ე.წ. queue(რიგი) რომელშიც შევინახავთ ამ callback &#8211; ებს, რათა მათი შესრულება მოხდეს კონკრეტულად მოთხოვნილი სკრიპტის ჩატვირთვის დასრულების შემდეგ. ეს საჭიროა იმ შემთხვევისათვის თუ ერთსა და იმავე სკრიპტზე მოთხოვნა რამდენჯერმე განმეორდება.</p>
<p>აღსანიშნავია რომ &#8220;ა&#8221; პუნქტისათვის გასათვალისწინებელია ერთი დეტალი: ფუნქცია ყოველთვის არ სრულდება თავის საკუთარ კონტექსტში, ხშირად აუცილებელია ფუნქციის კონკრეტული ობიექტის კონტექსტში შესრულება. ამ პრობლემის თავიდან ასარიდებლად გამოვიყენებთ ჩვეულებრივ მასივს, რომლის პირველი ელემენტიც იქნება ობიექტი(ამ შემთხვევაში კონტექსტი), ხოლო მეორე პარამეტრი თავად callback ფუნქცია.</p>
<p>&#8220;ბ&#8221; პუნქტისათვის საკმარისია აღვნიშნოთ, რომ &#8220;queue&#8221; &#8211; ს შესაქმნელად საკმარისია ჩვეულებრივი JS ობიექტი, რომელშიც გასაღების სახით გამოვიყენებთ &#8220;loadJS&#8221; ფუნქციის &#8220;src&#8221; პარამეტრს, ხოლო მნიშვნელობად ჩვეულებრივ მასივს რომელშიც შევინახავთ კონკრეტული მისამართის შესაბამის callback &#8211; ებს.</p>
<p>თავად იმის დასადგენად სკრიპტის ჩამოტვირთვა დასრულებულია თუ არა გამოვიყენებთ &#8220;script&#8221; ელემენტის &#8220;onload&#8221; ივენთს, სწორედ მისი წარმოქმნის შემთხვევაში გვეცოდინება გარანტირებულად რომ სკრიპტი ჩამოიტვირთა და უსაფრთხოდ შეიძლება ამ სკრიპტთან დაკავშირებული callback &#8211; ების შესრულება.</p>
<p>აქედან გამოდინარე კოდი მიიღებს შემდეგ სახეს:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* @param String source of the JavaScript file<br />
&nbsp;* @param Mixed callback function or object + function pair<br />
&nbsp;*/</span><br />
<span style="color: #003366; font-weight: bold;">function</span> loadJS<span style="color: #009900;">&#40;</span>src<span style="color: #339933;">,</span> callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//რადგან ფუნქცია ასევე არის ობიექტი, </span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//მისთვის ახალი &quot;სტატიკური&quot; წევრის დამატება </span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//შესაძლებელია ქვემოთ ნაჩვენები ხერხით</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>loadJS.<span style="color: #660066;">scripts</span> <span style="color: #339933;">==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ობიექტის შექმნა რომელშიც შევინახავთ ჩატვირთული ფაილების მისამართებს</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">scripts</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ყველა &quot;script&quot; ელემენტის მოპოვება და შემდგომ იტერაციის გზის მისამართების მოგროვება</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> scripts <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> scripts.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>scripts<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">&amp;&amp;</span> scripts<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//მისამართის შენახვა ობიექტის გასაღების სახით</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">scripts</span><span style="color: #009900;">&#91;</span>scripts<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">src</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//თუ &quot;queue&quot; ობიექტი არ არსებობს შევქმნათ იგი</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>loadJS.<span style="color: #660066;">queue</span> <span style="color: #339933;">==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">queue</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//&quot;script&quot; ელემენტის &quot;onload&quot; ივენთის ჰენდლერი</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* @param String source of the JavaScript File<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> finishLoad <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//თუ მიმდინარე სკრიპტი იმყოფება რიგში</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>loadJS.<span style="color: #660066;">queue</span><span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//იტერაციის მეშვეობით სათითოად ვიღებთ ყველა &quot;callback&quot; ფუნქციას, და ვასრულებთ მათ</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> loadJS.<span style="color: #660066;">queue</span><span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> _callback <span style="color: #339933;">=</span> loadJS.<span style="color: #660066;">queue</span><span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//თუ _callback არ არის მასივი ვასრულებთ მას როგორც ფუნქციას</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//თუ მასივია ფუნქციის &quot;.call&quot; მეთოდის მეშვეობით ვასრულებთ მას შესაბამის კონტექსტში</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">!</span>_callback.<span style="color: #660066;">length</span> <span style="color: #339933;">?</span> _callback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> _callback<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>_callback<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//რადგან სკრიპტის ჩატვირთვა დასრულდა, ვამატებთ მას ჩატვირთული კსრიპტების სიაში</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">scripts</span><span style="color: #009900;">&#91;</span>s<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//რადგან სკრიპტის ჩატვირთვა დასრულდა, ვშლით მას რიგიდან</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">delete</span> loadJS.<span style="color: #660066;">queue</span><span style="color: #009900;">&#91;</span>src<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//შევამოწმოთ ჩატვირთულია თუ არა მოთხოვნილი სკრიპტი</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>loadJS.<span style="color: #660066;">scripts</span><span style="color: #009900;">&#91;</span>src<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//სკრიპტი არ არის ჩატვირთული</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//შევამოწმოთ სკრიპტი ხომ არ იტვირთება (იმყოფება თუ არა რიგში)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>loadJS.<span style="color: #660066;">queue</span><span style="color: #009900;">&#91;</span>src<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ჩავამატოთ მისამართი რიგში, და შევქმნათ მასივი callback - ებისათვის</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">queue</span><span style="color: #009900;">&#91;</span>src<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//შევქმნათ &quot;script&quot; ელემენტი და დავიწყოთ სკრიპტის ჩატვირთვა</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> script &nbsp;<span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; script.<span style="color: #660066;">type</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'text/javascript'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; script.<span style="color: #660066;">src</span> &nbsp;<span style="color: #339933;">=</span> src<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//&quot;_src&quot; ატრიბუტი ხელოვნურია, და მისი მეშვეობით </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//&quot;loadJS&quot; ფუნქციის &quot;src&quot; პარამეტრის საწყის </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//მნიშვნელობას ვინახავთ თავიდან გაუგებრობების ასაცილებლად</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; script._src <span style="color: #339933;">=</span> src<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//&quot;script&quot; ელემენტის &quot;onload&quot; ივენთის გამოყენება &quot;callback&quot; ფუნქციების შესასრულებლად</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; script.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ფაილის ჩამოტვირთვა დასრულებულია, შევასრულოთ მისი შესაბამისი რიგში მყოფი callback - ები</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; finishLoad<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>._src<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//ზემოთ შექმნილი &quot;_src&quot; ატრიბუტის გამოყენება</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ჩავამატოთ ახლად შექმნილი &quot;script&quot; ელემენტი, დოკუმენტის head სექციაში</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; document.<span style="color: #660066;">head</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ამ მომენტისათვის მოთხოვნილი სკრიპტი გარანტირებულად ზის რიგში,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//უკვე შესაძლებელია დავამატოთ შესაბამისი callback - ი</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loadJS.<span style="color: #660066;">queue</span><span style="color: #009900;">&#91;</span>src<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//თუ ფაილი უკვე ჩატვირთულია პირდაპირ ვასრულებთ ჰენდლერს</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//&quot;callback[1]&quot; არის ფუნქცია, ხოლო &quot;callback[0]&quot; ობიექტი(კონტექსტი)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">!</span>callback.<span style="color: #660066;">length</span> <span style="color: #339933;">?</span> callback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> callback<span style="color: #009900;">&#91;</span>1<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#91;</span>0<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
</li>
<li><strong>დასრულდა თუ არა ფაილის ჩამოტვირთვა მარტივი დასადგენია, თუმცა აქ განსხვავებამ იჩინა თავი ბრაუზერებს შორის. რა თქმა უნდა IE &#8211; მ გაიბრწყინა ტრადიციულად;</strong>
<p>რაც შეეხება IE &#8211; ს, განსხვავება ამ შემთხვევაში ძალიან მარტივი აღმოჩნდა და გამომდინარე აქედან მარტივადაც მოგვარდა. განსხვავება კი &#8220;script&#8221; ელემენტის &#8220;onload&#8221; ივენთი აღმოჩნდა, განსხვავებით სხვა ბრაუზერებისგან IE &#8211; ს &#8220;onload&#8221; &#8211; ის ნაცვლად აქვს &#8220;onreadystatechange&#8221; ივენთი. ამ ივენთის დამუშავების სპეციფიკა კარგად არის ყველასათვის ნაცნობი XHR ობიექტის დამსახურებით. </p>
<p>ერთადერთი რაც ამ არათავსებადობის აღმოსაფხვრელად გვესაჭიროება არის შემდეგი კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//თუ ბრაზუერი IE - ა</span><br />
script.<span style="color: #660066;">onreadystatechange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//უნდა შევამოწმოთ ორი სტატუსი: &quot;loaded&quot; და &quot;complete&quot;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^loaded|complete$/i</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">readyState</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ფაილის ჩამოტვირთვა დასრულებულია, შევასრულოთ მისი შესაბამისი რიგში მყოფი callback - ები</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; finishLoad<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>._src<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//ზემოთ შექმნილი &quot;_src&quot; ატრიბუტის გამოყენება</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>სულ ეს არის და ეს <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</li>
</ol>
<h2>დასკვნა</h2>
<p>იმედი მაქვს ამჯერადაც თქვენთვის საინტერესო თემას შევეხე და ეს მცირედი მაგალითი სასარგებლო იქნება ამ ბლოგის JavaScript &#8211; ით დაინტერესებული მკითხველისათვის. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/loading_javascript_files_on_demand/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>IE vs W3C event handling</title>
		<link>http://www.code.ge/posts/ie-vs-w3c-event-handling</link>
		<comments>http://www.code.ge/posts/ie-vs-w3c-event-handling#comments</comments>
		<pubDate>Wed, 05 Mar 2008 22:50:06 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/ie-vs-w3c-event-handling</guid>
		<description><![CDATA[ივენთები საკმაოდ პრობლემატური საკითხია თანამედროვე JavaScript პროგრამირებაში, რაც ცალსახად გამოწვეულია ყველასათვის კარგად ცნობილი და &#8220;საყვარელი&#8221; InternetExplorer &#8211; ის გამო. პრინციპში ძალიან ცოტაა ისეთი შემთხვევები როდესაც ამ პრობლემაზე გვერდის ავლა არ შეიძლება მარტივად, თუმცა ასევე არსებობს შემთხვევები როდესაც ეს არათავსებოდა ძალიან არასასიამოვნოდ იჩენს ხოლმე თავს. მიუხედავად იმისა, რომ, W3C &#8211; ს მიერ საკმაოდ მკაფიოდ არის ჩამოყალიბებული [...]]]></description>
			<content:encoded><![CDATA[<p>ივენთები საკმაოდ პრობლემატური საკითხია თანამედროვე JavaScript პროგრამირებაში, რაც ცალსახად გამოწვეულია ყველასათვის კარგად ცნობილი და &#8220;საყვარელი&#8221; InternetExplorer &#8211; ის გამო. პრინციპში ძალიან ცოტაა ისეთი შემთხვევები როდესაც ამ პრობლემაზე გვერდის ავლა არ შეიძლება მარტივად, თუმცა ასევე არსებობს შემთხვევები როდესაც ეს არათავსებოდა ძალიან არასასიამოვნოდ იჩენს ხოლმე თავს.</p>
<p>მიუხედავად იმისა, რომ, <a href="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html">W3C &#8211; ს მიერ</a> საკმაოდ მკაფიოდ არის ჩამოყალიბებული ივენთ მენეჯმენტის მოდელი, IE როგორც სხვა, ასევე ამ შემთხვევაშიც მოწოდების სიმაღლეზეა და თავის განსაკუთრებულ და &#8220;უფრო სწორ&#8221; მიდგომას გვთავაზობს, რაც საბოლოო ჯამში იწვევს ორმაგი(მინიმუმ) კოდის წერის აუცილებლობას.<span id="more-107"></span></p>
<h2>პრობლემა</h2>
<p>W3C მოდელის მიხედვით DOM ელემენტის რომელიმე ივენთისათვის(მაგ. onclick, onmousedown, onmouseup და ა.შ.) შესაძლებელია იმდენი ივენთ ჰენდლერის(ფუნქცია/მეთოდი რომელიც ავტომატურად გამოიძახება ამ ივენთის წარმოქმნის შემთხვევაში) რეგისტრაცია რამდენიც ეს საჭიროა კონკრეტული ამოცანისათვის, ეს მიიღწევა DOM ელემენტის addEventListener  მეთოდის გამოყენებით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> myHandler1<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> myHandler2<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> myHandler3<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>როგორც ვხედავთ მაგალითიდან, მეთოდის სიგნატურა ძალიან მარტივია:</p>
<ul>
<li>ივენთის სახელი(ყურადღება მიაქციეთ ივენთის სახელი გადაეცემა &#8220;on&#8221; პრეფიქსის გარეშე);</li>
<li>ფუნქცია რომელიც გამოძახებული იქნება ამ ივენთის წარმოშობის შემთხვევაში;</li>
<li>და მესამე პარამეტრი რომელიც DOM &#8211; ის ხეში ივენთის გავრცელების მიმართულებას(ქვევიდან ზევით ანუ შვილიდან მშობლისკენ ან პირიქით ზევიდან ქვევით ანუ მშობლიდან შვილისკენ) განსაზღვრავს, თუმცა ეს თემა მიმდინარე პოსტს სცილდება ამიტომ უბრალოდ მუდმივად გამოვიყენებთ &#8220;false&#8221; პარამეტრს;</li>
</ul>
<p>რა ხდება ივენთების ამ გზით რეგისტრაციის შემთხვევაში და როგორ მუშაობს ეს მოდელი?</p>
<p>როგორც ზემოთ ავღნიშნე, საჭირო ივენთის წარმოქმნის შემთხვევაში(ამ შემთხვევაში onclick) გამოიძახება  შესაბამისი ფუნქცია(ამ მაგლითისათვის გამოძახებული იქნება: myHandler1, myHandler2 და myHandler3 ფუნქციები), მაგრამ აქ მნიშვნელოვანია ის დეტალი რომ ფუნქცია გამოიძახება არა თავის საკუთარ არამედ DOM ელემენტის კონტექსტში. ეს ნიშნავს იმას რომ &#8220;this&#8221; ფუნქციის შიგნით მიუთითებს DOM ელემენტს. მაგალითად:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> myHandler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//&quot;this&quot; მიუთითებს DOM ელემენტს,</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//რაც ნიშნავს იმას რომ ფუნქცია სრულდება ამ ელემენტის(ობიექტის) კონტექსტში</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;element's id is: &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> myHandler<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>&#8220;my-element&#8221; &#8211; ზე დაწკაპუნების შემთხვევაში დავინახავთ შეტყობინებას &#8220;element&#8217;s id is: my-element&#8221;, რაც თავისთავად თვალსაჩინოს ხდის იმ ფაქტს რომ ივენთ მენეჯერი აკოპირებს ჰენლდერ ფუნქციის და იგი სრულდება მიმდინარე DOM ელემენტის კონტექსტში(უფრო მეტი სიცხადისათვის იხ. <a href="http://www.code.ge/javascript/dynamic-event-handlers">ანონიმური ივენთ ჰენდლერები</a> და <a href="http://www.code.ge/javascript/javascript-wtf-vol-2">ანონიმური ფუნქციები</a>).</p>
<p>ანალოგიური შედეგი შეგვეძლო მიგვეღწია შემდეგი ხერხით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> myHandler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;element's id is: &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> myHandler<span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ან უბრალოდ ასე:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;element's id is: &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>მიუხედავად იმისა რომ მეორე და მესამე მაგალითები თავსებადია ყველა ბრაუზერთად, მას აქვს ერთი უარყოფითი მხარე, ამ ხერხით შეუძლებელია ერთსა და იმავე ივენთისათვის მრავალი ჰენდლერ ფუნქციის რეგისტრაცია, რაც გარკვეულ შემთხვევებში დიდ უხერხულობებს იწვევს.</p>
<p>რა განსხვავებებია InetrnetExplorer &#8211; ში? IE &#8211; ს გააჩნია ზემოთ W3C &#8211; ს მსგავსი მიდგომა, თუმცა ეს მხოლოდ მსგავსებაა და ფუნქციონალურობის თვალსაზრისით აბსოლუტურად არაფერი არ აქვს საერთო ზემოთ აღნიშნულ მოდელთან.</p>
<p>IE გვთავაზობს ელემენტის ივენთის რეგისტრაციის თავისებურ მექანიზმს DOM ელემენტის attachEvent მეთოდის მეშვეობით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onclick'</span><span style="color: #339933;">,</span> myHandler1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onclick'</span><span style="color: #339933;">,</span> myHandler2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onclick'</span><span style="color: #339933;">,</span> myHandler3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ეს მაგალითი მსგავისა W3C მოდელისა, თუმცა გარდა მეთოდის სახელის განსხვავებისა, ასევე განსხვავებულია თავად მეთოდის სიგნატურა:</p>
<li>ივენთის სახელი, თუმცა ამ შემთხვევაში &#8220;on&#8221; პრეფიქსი აუცილებელია;</li>
<li>შესაბამისი ჰენდლერი;</li>
<li>მესამე პარამეტრი საერთოდ არ არსებობს;</li>
<p>ამ მოდელის დანიშნულება ანალოგიურია W3C მოდელისა, და ამ ერთი შეხედვით მარტივი არათავსებადობის აღმოსაფხვრელად თითქოს საკმარისი მარტივი ე.წ. ვრაპერის დაწერა რომელიც ამ განსხვავებას დამალავს საბოლოო კოდისაგან. თუმცა თუ გადავწერთ პირველ მაგალითს ასე:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> myHandler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//ამ შემთხვევაში &quot;this&quot; მიუთითებს &quot;window&quot; ობიექტს</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;element's id is: &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
el.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onclick'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>და შევასრულებთ IE &#8211; ში, მივიღებთ სრულიად განსხვავებულ რეზულტატს. რატომ? ეს ხდება იმიტომ რომ IE &#8211; ს ივენთების მენეჯერი უბრალოდ გამოიძახებს ამ ფუნქციას(ცხადია ეს ხდება DOM ელემენტის კონტექსტს მიღმა) და ამ შემთხვევაში &#8220;this&#8221; მიუთითებს არა DOM ელემენტს, არამედ გლობალურ &#8220;window&#8221; ობიექტს.</p>
<h2>გამოსავალი</h2>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> EventWrapper <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #006600; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp; * @param Object DOM element<br />
&nbsp; &nbsp; &nbsp; * @param String Event Name<br />
&nbsp; &nbsp; &nbsp; * @param Function Event Handler<br />
&nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; &nbsp;addListener<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>el<span style="color: #339933;">,</span> eventName<span style="color: #339933;">,</span> handler<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//თუ ბრაუზერს გააჩნია W3C მოდელის რეალიზაცია</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> handler<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><span style="color: #006600; font-style: italic;">//მხოლოდ InternetExplorer - ის შემთხვევაში</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> fn <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//კონტექსტის ფიქსაცია ფუნქციის &quot;call&quot; მეთოდის გამოყენებით</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//&quot;call&quot; მეთოდს პირველ პარამეტრად გადაეცემა სასურველი კონტექსტი</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handler.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; el.<span style="color: #660066;">attachEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'on'</span> <span style="color: #339933;">+</span> eventName<span style="color: #339933;">,</span> fn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>მაგალითიდან ნათლად ჩანს თუ რა განსხვავებაა W3C მოდელსა და InternetExplorer &#8211; ისათვის განკუთვნილ კოდში. პრობლემის აღმოფხვრა მარტივად ხორციელდება ფუნქციის &#8220;call&#8221; მეთოდის მეშვეობით, რაც სრულად ხსნის აღწერილ პრობლემას. თუ როგორ მუშაობს ფუნქციის &#8220;call&#8221; მეთოდი, <a href="http://www.code.ge/javascript/javascript-wtf-vol-1">შეგიძლია იხილოთ შესაბამისი პოსტი</a>.</p>
<h2>დასკვნა</h2>
<p>მიუხედავად იმისა, რამდენად განსხვავებულიც არ უნდა იყოს ბრაუზერებს შორის ამა თუ იმ დეტალის რეალიზაცია, ნებისმიერ შემთხვევაში საჭიროა ალტერნატიული გზების ძებნა. ჩემს კონკრეტულ შემთხვევაშიც კი, მიუხედავად იმისა რომ პრიმიტივიზმის მომხრე ვარ და ყოველთვის ვცდილობ დავიცვა ეს წესი, მაინც ხშირად ვაწყდები მსგავს გამოუვალ მდგომარეობებს. ასეთი მდგომარეობებიდან გამოსავალის პოვნა როგორც წესი არ არის რთული, თუმცა არის შემთხვევები როდესაც მიგნებული გამოსავალი არ არის საუკეთესო და უფრო მეტ კვლევას შედარებით უფრო დახვეწილი შედეგისკენ მივყევარ. იმედია ეს პოსტი უფრო მეტ ნათელს მოჰფენს ამ საკითხს, ხოლო აღწერილი გამოსავალი პრობლემიდან სასარგებლო იქნება თქვენთვის.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ie-vs-w3c-event-handling/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ajax: HTML ფორმის სერიალიზაცია POST რიქვესტისთვის</title>
		<link>http://www.code.ge/posts/ajax-html-%e1%83%a4%e1%83%9d%e1%83%a0%e1%83%9b%e1%83%98%e1%83%a1-%e1%83%a1%e1%83%94%e1%83%a0%e1%83%98%e1%83%90%e1%83%9a%e1%83%98%e1%83%96%e1%83%90%e1%83%aa%e1%83%98%e1%83%90-post-%e1%83%a0%e1%83%98</link>
		<comments>http://www.code.ge/posts/ajax-html-%e1%83%a4%e1%83%9d%e1%83%a0%e1%83%9b%e1%83%98%e1%83%a1-%e1%83%a1%e1%83%94%e1%83%a0%e1%83%98%e1%83%90%e1%83%9a%e1%83%98%e1%83%96%e1%83%90%e1%83%aa%e1%83%98%e1%83%90-post-%e1%83%a0%e1%83%98#comments</comments>
		<pubDate>Wed, 05 Dec 2007 08:10:44 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/ajax-html-%e1%83%a4%e1%83%9d%e1%83%a0%e1%83%9b%e1%83%98%e1%83%a1-%e1%83%a1%e1%83%94%e1%83%a0%e1%83%98%e1%83%90%e1%83%9a%e1%83%98%e1%83%96%e1%83%90%e1%83%aa%e1%83%98%e1%83%90-post-%e1%83%a0%e1%83%98</guid>
		<description><![CDATA[ვაგრძელებ სერიალიზაციის თემას, და ამჯერად შევეხები HTML ფორმის სერიალიზაციას. HTML ფორმის სერიალიზაციაში იგულისხმება მისი ველების სახელებისა და მნიშვნელობების ჩვეულებრივ პარამეტრი/მნიშვნელობა(parameter/value) სტრიქონში გადაყვანა. ეს ფორმატი ყველასთვის კარგად არის ცნობილი და მას აქვს ტრადიცულად შემდეგი სახე: param1=value1&#038;param2=value2&#038;param3=value3 ანუ პარამეტრი/მნიშვნელობა წყვილების ერთობლიობა, სადაც წყვილის გამოყოფად გამოიყენება &#38; სიმბოლო. რა საჭიროა ფორმის ველებისა და მნიშნველობების ასეთი ფორმატში გადაყვანა? ეს [...]]]></description>
			<content:encoded><![CDATA[<p>ვაგრძელებ სერიალიზაციის თემას, და ამჯერად შევეხები HTML ფორმის სერიალიზაციას. HTML ფორმის სერიალიზაციაში იგულისხმება მისი ველების სახელებისა და მნიშვნელობების ჩვეულებრივ პარამეტრი/მნიშვნელობა(parameter/value) სტრიქონში გადაყვანა. ეს ფორმატი ყველასთვის კარგად არის ცნობილი და მას აქვს ტრადიცულად შემდეგი სახე:</p>
<pre>
param1=value1&#038;param2=value2&#038;param3=value3
</pre>
<p>ანუ პარამეტრი/მნიშვნელობა წყვილების ერთობლიობა, სადაც წყვილის გამოყოფად გამოიყენება &amp; სიმბოლო. </p>
<p>რა საჭიროა ფორმის ველებისა და მნიშნველობების ასეთი ფორმატში გადაყვანა? ეს მნიშვნელოვანი და აუცილებელია  <strong>XMLHttpRequest (XHR)</strong> კონტექსტში. ცნობილია რომ ე.წ. &#8220;Ajax&#8221; აპლიკაციებში ფართოდ სწორედ ეს ობიექტი გამოიყენება, და უშუალოდ მისი მეშვეობით ხორციელდება ასინქრონული რიქვესტები(მოთხოვნები?) სერვერზე. გამომდინარე იქედან რომ XHR სერვერვთან კომუნიკაციისათვის იყენებს ჩვეულებრივ HTTP პროტოკოლს, მისი მეშვეობით სევერზე მონაცემების გაგზავნა შეგვიძლია ტრადიციულად ან POST ან GET მეთოდით. </p>
<p>ცნობილია რომ GET მეთოდის გამოყენება რეკომენდირებულია ისეთ შემთხვევაში, როდესაც სერვერზე გასაგზავნი ინფორმაცია არის ძალიან მცირე. რადგან ამ მეთოდის გამოყენებისას სერვერზე გასაგზავნი ყველა პარამეტრი იგზავნება URI &#8211; ს მეშვეობით ცხადია რომ გარკვეული შეზღუდვა ინფორმაციის ზომაზე არსებობს.</p>
<p>რაც შეეხება POST მეთოდს, იგი გამოიყენება ისეთ შემთხვევაში როდესაც სერვერზე გასაგზავნი ინფორმაციის ოდენობა არის დიდი. გამომდინარე იქედან რომ GET მეთოდისაგან განსხვავებით ამ ინფორმაციის გაგზავნა სერვერზე ხდება არა URI &#8211; ს მეშვეობით არამედ ის იდება უშუალოდ HTTP &#8211; ს ტანში ეს შეზღუდვა გარკვეულწილად იხსენბა. </p>
<p>ტრადიციული გზით(იგულისხმება XHR &#8211; ის გარეშე) ფორმის სერვერზე გაგზავნის შემთხვევაში ზემოთთქმული ხორციელდება ავტომატურად, ბრაუზერის მიერ. თუმცა XHR &#8211; ს მსგავსი რამ არ შეუძლია და ასეთ შემთხვევაში პარამეტრების შესაბამისი მომზადება და ობიექტის მეთოდებისათვის მათი გადაცემის პასუხისმგელობა მთლიანად პროგრამისტს ეკისრება.<span id="more-104"></span></p>
<p>GET მეთოდის შემთხვევაში ეს არ წარმოადგენს პრობლემას, ზემოთ მოხსენიებული მიზეზის გამო და ასეთი URI &#8211; ს აწყობა საკმაოდ მარტივია თუნდაც პრიმიტიული ხელოვნური მეთოდით. მაგრამ POST მეთოდის გამოყენების შემთხვევაში საქმე ოდნავ უფრო რთულად არის. როგორც ზემოთ აღვნიშნე XHR &#8211; ში ფორმის ელემენტების HTTP ტანში ჩადება ავტომატურად არ ხდება&#8230; ამისათვის საჭიროა 1) ფორმის ყველა ელემენტისაგან ჯერ ავაწყოთ &amp; სიმბოლოთი გაყოფილი პარამეტრი/მნიშვნელობა ტიპის სტრიქონი; 2) XHR &#8211; ის <strong>send</strong> მეთოდს გადავცეთ ეს სტრიქონი პარამეტრად.</p>
<p>ეს ყველაფერი საკმაოდ მარტივია და დროა შევუდგეთ პრობლემის რეალურად გადაჭრას.</p>
<p><strong><br />
ფორმის სერიალიზაციისათვის საკმარისია ქვემოთ მოყვანილი JavaScript ფუნქციის გამოყენება, რომელიც პარამეტრად ღებულობს ფორმას, მისი ველების საფუძველზე აწყობს პარამეტრი/მნიშნველობა ტიპის სტრიქონს და აბრუნებს მას:</strong></p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> formToParams<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> fld<span style="color: #339933;">,</span> type<span style="color: #339933;">,</span> params <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> encode <span style="color: #339933;">=</span> encodeURIComponent<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;</span>form .<span style="color: #660066;">elements</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>form.<span style="color: #660066;">elements</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #000066;">name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fld <span style="color: #339933;">=</span> form.<span style="color: #660066;">elements</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> type <span style="color: #339933;">=</span> fld.<span style="color: #660066;">type</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^checkbox|radio$/i</span>.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span>type<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>fld.<span style="color: #660066;">checked</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>fld.<span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;=&quot;</span> <span style="color: #339933;">+</span> encode<span style="color: #009900;">&#40;</span>fld.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>type <span style="color: #339933;">==</span> <span style="color: #3366CC;">'select-one'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>fld.<span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;=&quot;</span> <span style="color: #339933;">+</span> encode<span style="color: #009900;">&#40;</span>fld.<span style="color: #660066;">value</span> <span style="color: #339933;">||</span> fld.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>fld.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>type <span style="color: #339933;">==</span> <span style="color: #3366CC;">'select-multiple'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> opts <span style="color: #339933;">=</span> fld.<span style="color: #660066;">options</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> j<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> j<span style="color: #339933;">&lt;</span>opts.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>opts<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">selected</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>fld.<span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;=&quot;</span> <span style="color: #339933;">+</span> encode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>opts<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;value&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> opts<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!/^</span>button<span style="color: #339933;">|</span>reset<span style="color: #339933;">|</span>file<span style="color: #339933;">|</span>undefined$<span style="color: #339933;">/</span>i.<span style="color: #660066;">test</span><span style="color: #009900;">&#40;</span>type<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>fld.<span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;=&quot;</span> <span style="color: #339933;">+</span> encode<span style="color: #009900;">&#40;</span>fld.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> params.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&amp;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ პატარ ფუნქციის მეშვეობით უკვე შესაძლებელია ნებისმიერი ფორმის სერიალიზაცია, საკმარისია მას გადავცეთ მხოლოდ ჩვენთვის სასურველი HTML ფორმის ობიექტი. ერთადერთი მნიშვნელოვანი დეტალი აქ არის <strong>encodeURIComponent</strong> ფუნქციის გამოყენება, რომლის მეშვეობითაც ხდება მნიშვნელობის ე.წ. კოდირება(?). ეს აუცილებელია რათა არ მოხდეს მნიშვნელობების დამახინჯება.</p>
<p><strong>შემდეგ ეტაპზე საჭიროა მეთოდი რომელიც XHR &#8211; ის მეშვეობით სასურველ მისამართზე გაგზავნის სერიალიზებულ ფორმას:</strong></p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> doRequest<span style="color: #009900;">&#40;</span>config<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> req <span style="color: #339933;">=</span> window.<span style="color: #660066;">XMLHttpRequest</span> <span style="color: #339933;">?</span> <span style="color: #003366; font-weight: bold;">new</span> XMLHttpRequest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> ActiveXObject<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Microsoft.XMLHTTP&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; req.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>config.<span style="color: #660066;">method</span><span style="color: #339933;">,</span> config.<span style="color: #660066;">url</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; req.<span style="color: #660066;">onreadystatechange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; config.<span style="color: #660066;">callback</span><span style="color: #009900;">&#40;</span>req<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; req.<span style="color: #660066;">setRequestHeader</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;content-type&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;application/x-www-form-urlencoded&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; req.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span>config.<span style="color: #660066;">params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp;<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ეს ფუნქცია პარამეტრად ღებულობს ერთ config ობიექტს. რომელსაც შესაძლებელია გააჩნდეს მსგავსი სახე:</p>
<pre>
{
    method: 'POST',
    url: 'http://mydomain.com/actionurl.php',
    params: 'param1=value1&#038;param2=value2',
    callback: function(req) {
        if (req.readyState == 4 &#038;&#038; req.status == 200) {
            //do something with result
        }
    }
}
</pre>
<p>კონფიგურაციის ობიექტი ძალიან მარტივია. მას აქვს შემდეგი თვისებები: </p>
<ul>
<li>method &#8211; სასურველი HTTP მეთოდი;</li>
<li>url &#8211; მისამართი რომელზეც გვსურს ინფორმაციის გაგზავნა;</li>
<li>params &#8211; პარამეტრი/მნიშვნელობა ტიპის სტრიქონი სტრიქონი;</li>
<li>callback &#8211; ფუნქცია რომელიც ავტომატურად იქნება გამოძახებული XHR ობიექტის <strong>onreadystatechange </strong>ხდომილების დროს;</li>
</ul>
<p>რაც შეეხება ამ ფუნქციების გამოყენების რეალურ მაგალითს მას შესაძლებელია ჰქონდეს მსგავსი სახე:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> test<span style="color: #009900;">&#40;</span>button<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> params <span style="color: #339933;">=</span> formToParams<span style="color: #009900;">&#40;</span>button.<span style="color: #660066;">form</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'result'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> params<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; doRequest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; method<span style="color: #339933;">:</span> button.<span style="color: #660066;">form</span>.<span style="color: #660066;">method</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; url<span style="color: #339933;">:</span> button.<span style="color: #660066;">form</span>.<span style="color: #660066;">action</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'?nocache='</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; params<span style="color: #339933;">:</span> params<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; callback<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>req<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>req.<span style="color: #660066;">readyState</span> <span style="color: #339933;">==</span> 4 <span style="color: #339933;">&amp;&amp;</span> req.<span style="color: #000066;">status</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//do something here</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ ფუნქციას პარამეტრად გადაეცემა ჩვეულებრივი button ტიპის input ელემენტი. ეს ელემენტი ფლობს საჭირო ინფორმაციას ფორმის შესახებ. ხოლო ფორმას თავის მხრივ გააჩნია საკმაო ინფორმაცია(method, action ატრიბუტები) იმისათვის რომ ავაწყოთ პარამეტრების ობიექტი. ამ ფუნქციაში ყურადღებას იმსახურებს url პარამეტრის მნიშვნელობის აგება. ფორმის action ატრიბუტის მნიშვნელობას ვამატებთ nocache პარამეტრს რომლის მნიშვნელობაც არის მიმდინარე დრო. ეს აუცილებელია იმისათვის რათა IE &#8211; ში თავიდან ავირიდოთ კეშირება.</p>
<p>ამ ფუნქციებისა და ინფორმაციის მეშვეობით ძალიან მარტივია რეალური მუშა მაგალითის აგება სადაც დავინახავთ რეალურ შედეგს, თუმცა მანამდე შეგიძლიათ ნახოთ <a href="http://www.code.ge/samples/formtoparams.htm">ამ პოსტისათვის შექმნილი რეალური მუშა მაგალითი</a> და დააკოპიროთ მისი კოდი.</p>
<p>ამ მაგლითისათვის სერვერის მხარეს გამოიყენება ერთი PHP ფაილი რომელშიც გამოყენებულია ქვემოთ მოყვანილი კოდი:</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;pre&gt;'</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/print_r"><span style="color: #990000;">print_r</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/pre&gt;'</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>enjoy <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ajax-html-%e1%83%a4%e1%83%9d%e1%83%a0%e1%83%9b%e1%83%98%e1%83%a1-%e1%83%a1%e1%83%94%e1%83%a0%e1%83%98%e1%83%90%e1%83%9a%e1%83%98%e1%83%96%e1%83%90%e1%83%aa%e1%83%98%e1%83%90-post-%e1%83%a0%e1%83%98/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>JavaScript: ობიექტის JSON სერიალიზაცია</title>
		<link>http://www.code.ge/posts/javascript-object-to-json-serialization</link>
		<comments>http://www.code.ge/posts/javascript-object-to-json-serialization#comments</comments>
		<pubDate>Tue, 04 Dec 2007 10:26:42 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/javascript-object-to-json-serialization</guid>
		<description><![CDATA[JSON (JavaScript Object Notation) &#8211; ნოტაცია დღესდღეობით ფართოდ გამოყენებადი და ძალიან მოხერხებული საშუალებაა ინფორმაციის გაცვლისათვის. გამომდინარე იქედან რომ იგი არის ჩვეულებრივი სტრიქონი, იგი არ არის დამოკიდებული არც ენაზე და არც პლატფორმაზე. JSON თანაბარი წარმატებით გამოიყენება ისეთი მაღალი დონის ენებში როგორიც არის: Java, PHP, Ruby, C#, JavaScript და ა.შ. გარდა ამისა იგი არის ერთერთი შეუცვლელი ნაწილი [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.json.org/">JSON (JavaScript Object Notation)</a> &#8211; ნოტაცია დღესდღეობით ფართოდ გამოყენებადი და ძალიან მოხერხებული საშუალებაა ინფორმაციის გაცვლისათვის. გამომდინარე იქედან რომ იგი არის ჩვეულებრივი სტრიქონი, იგი არ არის დამოკიდებული არც ენაზე და არც პლატფორმაზე.</p>
<p>JSON თანაბარი წარმატებით გამოიყენება ისეთი მაღალი დონის ენებში როგორიც არის: Java, PHP, Ruby, C#, JavaScript და ა.შ. გარდა ამისა იგი არის ერთერთი შეუცვლელი ნაწილი თანამედროვე Ajax აპლიკაციებისა და ფართოდ გამოიყენება კლიენტსა და სერვერს შორის ინფორმაციის მიმოცვლისათვის.<span id="more-103"></span></p>
<p><strong><br />
პრობლემა</strong></p>
<p>მიუხედავად იმისა რომ JSON &#8211; ს საფუძვლად უდევს JavaScript ობიექტი, ამ ენას არ გააჩნია არანაირი საშუალება იმისათვის რომ ობიექტი გარდაქმნას JSON სტრიქონად. ბუნებრივია ეს აუცილებელია რადგან პირდაპირ JavaScript ობიექტის გაგზავნა/მიღება http პროტოკოლის მეშვეობით შეუძლებელია. გაგზავნისათვის საჭიროა ამ ობიექტის სერიალიზაცია(ანუ სტრიქონულ ფორმატში გადაყვანა, ხოლო მიღების დროს JSON სტრიქონის, უკან JavaScript ობიექტში გადაყვანა. </p>
<p>JSON სტრიქონის გადაყვანა ობიექტში, ძალიან მარტივია. ამისათვის საკმარისია JavaScript &#8211; ის eval ფუნქციის გამოყენება და გამზადებული ობიექტი ხელთ გვაქვს. თუმცა ობიექტის ხელახალი სერიალიზაცია JSON &#8211; ში ასეთი მარტივი არ არის.</p>
<p><strong><br />
გამოსავალი</strong></p>
<p>იმისათვის რომ მოვახდინოთ ობიექტის სერიალიზაცია შესაძლებელია გამოვიყენოთ ქვემოთ მოყვანილი გზებიდან ერთერთი.</p>
<p>მაგალითში გამოყენებული იქნება შემდეგი სახის ობიექტი:</p>
<pre>
var myObj = {
    id: 'some-unique-id',
    name: 'obj-name',
    values: [1, 2, true, false, null, 'some string'],
    nested: {
        name: 'nested obj name',
        value: {name: 'other nested obj'}
    }
}
</pre>
<ul>
<li><strong>JSON სტრიქონის ხელოვნურად აწყობა</strong>
<p>ასეთ შემთხვევაში, როდესაც საქმე გვაქვს მარტივ ობიექტთან, მისი ხელოვნური გზით სერიალიზაცია დიდ პრობლემას არ წარმოადგენს&#8230; თუმცა ეს მაინც არასასიამოვნო პროცესია.</p>
<p>მაგალითად ზემოთ ნაჩვენები ობიექტის JSON სტრიქონად გარდაქმნისათვის საჭიროა მსგავსი მანიპულაციები:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> json <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
json.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'{id: &quot;'</span> <span style="color: #339933;">+</span> myObj.<span style="color: #660066;">id</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&quot;,'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
json.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'name: &quot;'</span> <span style="color: #339933;">+</span> myObj.<span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&quot;,'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
json.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'values: ['</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> myObj.<span style="color: #660066;">values</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;json.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>myObj.<span style="color: #660066;">values</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">','</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>და ასე შემდეგ&#8230; რა თქმა უნდა ეს კოდი მოყვანილია პირობით მაგალითად თუ რა არის საჭირო ასეთ გზით JSON სტრიქონის ასაწყობად, და იგი ნათლად ასახავს თუ რამდენად არაეფექტური, შრომატევადი და რაც ყველაზე მნიშვნელოვანია შეცდომებისათვის განწირულია ასეთი მიდგომა.</p>
</li>
</li>
<li><strong>JSON სერიალიზაცია სპეციალური უნივერსალური მეთოდის მეშვეობით</strong><br />
განსხვავებით წინა მაგალითისგან, ეს გზა არის გამართლებული, რეკომენდირებული და ასეთი გზით შეცდომების დაშვების ალბათობა დადის მინიმუმზე. იმ შემთხვევაშიც კი თუ აღმოჩენილი იქნება სერიალიზაციის შეცდომა, მისი ძებნა მოგვიწევს მხოლოდ ერთ ადგილას, და მისი აღმოფხვრა აისახება მთლიან შედეგზე, რაც ნიშნავს იმას რომ დაშვებული შეცდომების ძებნა არ არის საჭირო ბევრ ადგილას რაც გარდაუვალი იქნებოდა ობიექტების სერიალიზაციის ზემოთ ნაჩვენები მიდგომის გამოყენების შემთხვევაში.</p>
<p>ობიექტის სერიალიზაციის კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> serialize<span style="color: #009900;">&#40;</span>o<span style="color: #339933;">,</span> l<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> res <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> tmp <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> l <span style="color: #339933;">=</span> l <span style="color: #339933;">||</span> 1<span style="color: #339933;">,</span> key<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> repeat <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>str<span style="color: #339933;">,</span> count<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> tmp <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> count<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tmp.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> tmp.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> k <span style="color: #000066; font-weight: bold;">in</span> o<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; key <span style="color: #339933;">=</span> o.<span style="color: #660066;">constructor</span> <span style="color: #339933;">==</span> Object <span style="color: #339933;">?</span> k <span style="color: #339933;">+</span> <span style="color: #3366CC;">': '</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">==</span> Object<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tmp.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>repeat<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> l<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> key <span style="color: #339933;">+</span> serialize<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> l<span style="color: #339933;">+</span>1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">==</span> Array<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tmp.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>repeat<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> l<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> key <span style="color: #339933;">+</span> serialize<span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> l<span style="color: #339933;">+</span>1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">==</span> String<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tmp.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>repeat<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> l<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> key <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&quot;'</span> <span style="color: #339933;">+</span> o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tmp.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>repeat<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> l<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> key <span style="color: #339933;">+</span> o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>o<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span> <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tmp.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>repeat<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> l<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> key <span style="color: #339933;">+</span> <span style="color: #3366CC;">'null'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; res.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">constructor</span> <span style="color: #339933;">==</span> Object <span style="color: #339933;">?</span> <span style="color: #3366CC;">'{'</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">'['</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; res.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>tmp.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;,<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; res.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">+</span> repeat<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>l <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>o.<span style="color: #660066;">constructor</span> <span style="color: #339933;">==</span> Object <span style="color: #339933;">?</span> <span style="color: #3366CC;">'}'</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">']'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> res.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ ფუნქციის გამოყენება ძალიან მარტივია, და განსხვავებით წინა მაგალითისგან ობიექტის სერიალიზაციისათვის საკმარისია შემდეგი კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> json <span style="color: #339933;">=</span> serialize<span style="color: #009900;">&#40;</span>myObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #006600; font-style: italic;">//json ცვლადის მნიშნველობა არის სწორად ფორმირებული JSON სტრიქონი </span><br />
<span style="color: #006600; font-style: italic;">//რომლის გაგზავნაც შესაძლებელია სერვერზე.</span></div></td></tr></tbody></table></div>
<p>ნაჩვენები კოდი ძალიან მარტივია, იგი არის ჩვეულებრივი რეკურსიული ფუნქცია რომელიც იქცევა ობიექტის თვისებების მნიშვნელობების მიხედვით, საბოლოო ჯამში კი აბრუნებს სწორად ფორმირებულ JSON სტრიქონს. აღასანიშნავია ის რომ ამ მეთოდს შეგვიძლია გადავცეთ ნებისმიერი სირთულის ობიექტი, ხოლო შედეგად მივიღებთ JSON სტრიქონს. ასევე აღსანიშნავია რომ ეს მეთოდი სტრიქონის ფორმირებისათვის იყენებს ახალი ხაზის(\n)  და ტაბულაციის(\t) სიმბოლოებს, რაც მნიშვნელოვანია მიღებული შედეგის კითხვადობის თვალსაზრისით.</p>
</li>
</li>
</ul>
<p>რაც შეეხება დესერიალიზაციას JavaScript &#8211; ში, და სერიალიაზაცია/დესერიალიზაციას სერვერულ ენებში:</p>
<ul>
<li><strong>JavaScript</strong>
<pre>
//eval ფუნქციის გამოყენებით
var myObj = eval(jsonString);
</pre>
<p>თუმცა JavaScript &#8211; ში გაუგებრობების თავიდან ასაცილებლად, json სტრიქონის დესერიალიზაციისას მართებულია მოვიქცეთ შემდეგნაირად:</p>
<pre>
try {
    //სტრიქონი მოვაქციოთ ფრჩხილებში
    var myObj = eval('(' + jsonString + ')');
} catch(e) {
    //სხვა, შესაბამისი მოქმედებები
}
</pre>
<p>ამ შემთხვევაში ორი თავდაცვითი მექანიზმი გამოვიყენეთ: 1) JSON სტრიქონი მოვაქციეთ ფრჩხილებში; 2) კოდი შევასრულეთ try/catch ბლოკის შიგნით, რადგან თუ eval ფუნქციას გადავცემთ არაკორექტულ სტრიქონს მისი ობიექტად გარდაქმნა ვერ მოხერხდება რაც გამოიწვევს შეცდომას, ხოლო try/catch ბლოკი ამ შემთხვევაში საუკეთესო გამოსავალია შესაძლო გაუმართავობის სწორად დასამუშავებლად;</p>
</li>
<li><strong>PHP</strong>
<pre>
//PHP5 - ს აქვს ორი შესაბამისი ფუნქცია
//სერიალიზაცია
$arr = array('key1'=>'value2', 'key2'=>'value2');
$json = json_encode($arr);
//დესერიალიზაცია
$deserialized = json_decode($json);
</pre>
</li>
</ul>
<p>სხვადასხვა ენებში არსებობს შესაბამისი ბიბლიოთეკები JSON მანიპულაციისათვის, და მათი გამოყენება ისეთივე მარტივია როგორც ზემოთ ნაჩვენები მაგალითები.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascript-object-to-json-serialization/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>jQuery &#8211; მორიგი დიდი აღიარება</title>
		<link>http://www.code.ge/posts/jquery-%e1%83%9b%e1%83%9d%e1%83%a0%e1%83%98%e1%83%92%e1%83%98-%e1%83%93%e1%83%98%e1%83%93%e1%83%98-%e1%83%90%e1%83%a6%e1%83%98%e1%83%90%e1%83%a0%e1%83%94%e1%83%91%e1%83%90</link>
		<comments>http://www.code.ge/posts/jquery-%e1%83%9b%e1%83%9d%e1%83%a0%e1%83%98%e1%83%92%e1%83%98-%e1%83%93%e1%83%98%e1%83%93%e1%83%98-%e1%83%90%e1%83%a6%e1%83%98%e1%83%90%e1%83%a0%e1%83%94%e1%83%91%e1%83%90#comments</comments>
		<pubDate>Tue, 06 Nov 2007 22:32:50 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/jquery-%e1%83%9b%e1%83%9d%e1%83%a0%e1%83%98%e1%83%92%e1%83%98-%e1%83%93%e1%83%98%e1%83%93%e1%83%98-%e1%83%90%e1%83%a6%e1%83%98%e1%83%90%e1%83%a0%e1%83%94%e1%83%91%e1%83%90</guid>
		<description><![CDATA[ყველასათვის თუ არა, დეველოპერთა დიდი ნაწილისათვის ძალიან კარგად არის ცნობილი http://code.google.com სერვისი&#8230; ეს არის Google &#8211; ს ერთერთი ძალიან სასარგებლო რესურსი რომელიც გვთავაზობს უფასო ე.წ. პროექტების ჰოსტინგს&#8230; თუმცა, დღეს სასიამოვნოდ გაოცებული დავრჩი როდესაც ამ რესურსზე შესვლისას აღმოვაჩინე, რომ იგი მთლიანად გადაკეთებულია&#8230; თვალშისაცემი იყო ახალი გადამუშავებული და დახვეწილი ინტერფეისი&#8230; ცხადია სულმა წამძლია და ჩავიხედე სორსში, ძალიან [...]]]></description>
			<content:encoded><![CDATA[<p>ყველასათვის თუ არა, დეველოპერთა დიდი ნაწილისათვის ძალიან კარგად არის ცნობილი <a href="http://code.google.com">http://code.google.com </a>სერვისი&#8230; ეს არის Google &#8211; ს ერთერთი ძალიან სასარგებლო რესურსი რომელიც გვთავაზობს უფასო ე.წ. პროექტების ჰოსტინგს&#8230; </p>
<p>თუმცა, დღეს სასიამოვნოდ გაოცებული დავრჩი როდესაც ამ რესურსზე შესვლისას აღმოვაჩინე, რომ იგი მთლიანად გადაკეთებულია&#8230; თვალშისაცემი იყო ახალი გადამუშავებული და დახვეწილი ინტერფეისი&#8230; ცხადია სულმა წამძლია და ჩავიხედე სორსში, ძალიან გამიკვირდა რომ მასში აღმოვაჩინე jQuery.js ფაილი. </p>
<p>ცოტაოდენი დაძებნის შემდეგ მოვხვდი ამ პროექტის ბლოგზე, და წავაწყდი ამ პოსტს: <a href="http://google-code-updates.blogspot.com/2007/11/my-how-weve-grown.html">My How We&#8217;ve Grown</a></p>
<p>სადაც ყურადღება მიიპყრო შემდეგმა მოანკვეთმა:</p>
<blockquote><p>And we&#8217;re pleased to use jQuery, the wonderful open source JavaScript library (not ours, we&#8217;re just fans), to help power each page. Stay tuned &#8212; over the upcoming weeks we&#8217;ll offer detailed articles and tutorials about how we built the various parts of Google Code using open technologies.</p></blockquote>
<p>ფრიად სასიამოვნო ფაქტია ამ შესანიშნავი და ჩემის აზრით ყველაზე პროგრესული ბიბლიოთეკის მომხმარებელთათვის <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/jquery-%e1%83%9b%e1%83%9d%e1%83%a0%e1%83%98%e1%83%92%e1%83%98-%e1%83%93%e1%83%98%e1%83%93%e1%83%98-%e1%83%90%e1%83%a6%e1%83%98%e1%83%90%e1%83%a0%e1%83%94%e1%83%91%e1%83%90/feed</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>GeoKBD: პირველი განახლება</title>
		<link>http://www.code.ge/posts/geokbd-first-update</link>
		<comments>http://www.code.ge/posts/geokbd-first-update#comments</comments>
		<pubDate>Fri, 26 Oct 2007 09:47:46 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[GeoKBD]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/geokbd-first-update</guid>
		<description><![CDATA[პირველ რიგში დიდი მადლობა მინდა გადავუხადო გიორგი კობერიძეს აღმოჩენილი შეცდომისათვის სკრიპტში. რადგან სრულფასოვნად ვერ გავტესტე სკრიპტი, ბუნებრივია რომ არ იყო გამორიცხული მას ჰქონოდა შეცდომები&#8230; ეს ასეც აღმოჩნდა და ეხლა უშეცდომოდ(იმედი მაქვს) მუშაობს ყველაფერი. გარდა შეცდომის შესწორებისა რომელიც მდგომარებოდა ერთი და იგივე ფორმის ელემენტების ქართულ კლავიატურასთან მიბმაში, სკრიპტში ასევე შევიტანე სხვა მცირე ცვლილებები რომლებიც მის მოხმარებას [...]]]></description>
			<content:encoded><![CDATA[<p>პირველ რიგში დიდი მადლობა მინდა გადავუხადო გიორგი კობერიძეს აღმოჩენილი შეცდომისათვის სკრიპტში.</p>
<p>რადგან სრულფასოვნად ვერ გავტესტე სკრიპტი, ბუნებრივია რომ არ იყო გამორიცხული მას ჰქონოდა შეცდომები&#8230; ეს ასეც აღმოჩნდა <img src='http://www.code.ge/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  და ეხლა უშეცდომოდ(იმედი მაქვს) მუშაობს ყველაფერი.</p>
<p>გარდა შეცდომის შესწორებისა რომელიც მდგომარებოდა ერთი და იგივე ფორმის ელემენტების ქართულ კლავიატურასთან მიბმაში, სკრიპტში ასევე შევიტანე სხვა მცირე ცვლილებები რომლებიც მის მოხმარებას უფრო გააიოლებს. ასევე დაფიქსულია Mac OS X Safari &#8211; ში აღმოჩენილი ბაგი, რომელიც ტექსტურ ველში პირველი სიმბოლოს აკრეფის დროს იყო.</p>
<p><strong><br />
მცირეოდენი საჭირო განმარტებები</strong></p>
<p>ერთი ფორმის, მრავალი ველის კლავიატურასთან მიბმის საჭიროების შემთხვევაში ნაცვლად შემდეგი კონსტრუქციისა:</p>
<pre>
GeoKBD.map('my-form', 'my-field-one');
GeoKBD.map('my-form', 'my-field-two');
</pre>
<p>დინამიური მასივის საშუალებით უკვე შესაძლებელია ასეთი კონსტრუქციის გამოყენება:</p>
<pre>
GeoKBD.map('my-form', ['my-field-one', 'my-field-two']);
</pre>
<p>იმ შემთხვევაში თუ საჭირო ფორმის ყველა ელემენტის კლავიატურაზე მიბმა საკმარისია შემდეგი კონსტრუქცია:</p>
<pre>
GeoKBD.map('my-form');
</pre>
<p><a href="http://geokbd.googlecode.com/svn/trunk/geokbd/geokbd.js"><br />
სკრიპტის გადაწერა შეგიძლიათ პირდაპირ SVN რეპოზიტორიდან</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/geokbd-first-update/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ქართული კლავიატურის სკრიპტი</title>
		<link>http://www.code.ge/posts/georgian-keyboard</link>
		<comments>http://www.code.ge/posts/georgian-keyboard#comments</comments>
		<pubDate>Tue, 23 Oct 2007 13:09:54 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[GeoKBD]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/georgian-keyboard</guid>
		<description><![CDATA[ესე იგი მინდოდა თუ არ მინდოდა ირაკლი ნადარეიშვილმა მიბიძგა და ქართული კლავიატურის სკრიპტი დავწერე&#8230; სკრიპტი ძალიან მარტივია, და მისი მიბმა შეგიძლიათ ნებისმიერ ტექსტურ ველზე, ასევე მას აქვს ქართული კლავიატურის ჩართვისა და გამორთვის მხარდაჭერა. სიმბოლოების ტრანსლირებისათვის გამოვიყენე ირაკლის მიერ წლების წინ შემუშავებული ალგორითმი (ორიგინალი შეგიძლიათ იხილოთ აქ) სკრიპტის მუშა მაგალითი შეგიძლიათ იხილოთ ამ მისამართზე სკრიპტის უახლესი [...]]]></description>
			<content:encoded><![CDATA[<p>ესე იგი მინდოდა თუ არ მინდოდა <a href="http://www.freshblurbs.com">ირაკლი ნადარეიშვილმა</a> მიბიძგა და ქართული კლავიატურის სკრიპტი დავწერე&#8230; </p>
<p>სკრიპტი ძალიან მარტივია, და მისი მიბმა შეგიძლიათ ნებისმიერ ტექსტურ ველზე, ასევე მას აქვს ქართული კლავიატურის ჩართვისა და გამორთვის მხარდაჭერა. სიმბოლოების ტრანსლირებისათვის გამოვიყენე ირაკლის მიერ წლების წინ შემუშავებული ალგორითმი (<a href="http://www.sapikhvno.org/viewtopic.php?t=47&#038;postdays=0&#038;postorder=asc&#038;start=10">ორიგინალი შეგიძლიათ იხილოთ აქ</a>)</p>
<p>სკრიპტის მუშა მაგალითი შეგიძლიათ იხილოთ <a href="http://www.code.ge/samples/geokbd.htm">ამ მისამართზე</a><br />
სკრიპტის უახლესი ვერსიის გადმოწერა შეგიძლიათ <a href="http://geokbd.googlecode.com/svn/trunk/geokbd/geokbd.js">ამ მისამართიდან</a></p>
<p>რა უპირატესობები აქვს ამ სკრიპტს? იგი არის პატარა, კოდი არის ძალიან მარტივი და გასაგები, არ აბინძურებს ვებ აპლიკაციის სკოუპს რადგან იგი მთლიანად არის ენკაპსულირებული თავისსავე სკოუპში რაც არის იმის გარანტია რომ მისი გამოყენება შეგიძლია მარტივად და უსაფრთხოდ თუნდაც სხვა ანალოგიური დანიშნულების სკრიპტებთან ერთად. </p>
<p>ასევე საგულისხმოა ის რომ <strong>String </strong> ობიექტს ემატება ორი მეთოდი ესენია:</p>
<ol>
<li><strong>translateToKA()</strong> &#8211;  მეთოდი რომელსაც შეუძლია ნებისმიერი სტრიქონის პირდაპირ გადაყვანა ქართულ უნიკოდში. რაც ნიშნავს იმას რომ ამ მეთოდის გამოყენება თამამად შეგიძლიათ თქვენს სკრიპტებში.
<p>მეთოდის გამოყენება შეგიძლიათ შემდეგნაირად:</p>
<pre>
var str = "es aris nebismieri teqsti";
alert(str.translateToKA());

//ან პირდაპირ ასე
alert("es aris text literali".translateToKA());
</pre>
</li>
<li><strong>pasteTo([html form element])</strong> &#8211; რომელსაც პარამეტრად გადაეცემა ფორმის ელემენტი. ეს მეთოდი ტექსტის კოპირებას ახდენს ან პირდაპირ თუ ელემენტის მნიშვნელობა ცარიელია, ან იმ ადგილას სადაც ზის კურსორი, ან ჩაანაცვლებს მონიშნულ ტექსტს ახალი ტექსტით.
<p>მეთოდის გამოყენება შეგიძლიათ შემდეგნაირად:</p>
<pre>
var str = "es aris nebismieri teqsti";
str.translateToKA().pasteTo(document.forms['my-form-name']['my-field-name']);
</pre>
</li>
</ol>
<p><strong>კოდი ვრცელდება MIT ლიცენზიით</strong></p>
<pre>
        /*
	 * GeoKBD 0.1 - Georgian keyboard and text convertation library
	 *
	 * Copyright (c) 2007 Ioseb Dzmanashvili (http://www.code.ge)
	 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
	 */
</pre>
<p><span id="more-81"></span></p>
<h2>გამოყენების მაგალითი</h2>
<p>HTML კოდი:</p>
<div class="codecolorer-container html4strict blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;my-form&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;checkbox&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;geo&quot;</span> <span style="color: #000066;">checked</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;checked&quot;</span><span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/textarea.html"><span style="color: #000000; font-weight: bold;">textarea</span></a> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span> <span style="color: #000066;">cols</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;40&quot;</span> <span style="color: #000066;">rows</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/textarea.html"><span style="color: #000000; font-weight: bold;">textarea</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a>&gt;</span><br />
<br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a> <span style="color: #66cc66;">/</span>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;another-form&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">input</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;checkbox&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;geo1&quot;</span> <span style="color: #000066;">checked</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;checked&quot;</span><span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/br.html"><span style="color: #000000; font-weight: bold;">br</span></a> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/textarea.html"><span style="color: #000000; font-weight: bold;">textarea</span></a> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;frm&quot;</span> <span style="color: #000066;">cols</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;40&quot;</span> <span style="color: #000066;">rows</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/textarea.html"><span style="color: #000000; font-weight: bold;">textarea</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/form.html"><span style="color: #000000; font-weight: bold;">form</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>JavaScript კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">GeoKBD.<span style="color: #660066;">map</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-form'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'post'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
GeoKBD.<span style="color: #660066;">map</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'another-form'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'frm'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'geo1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ამ კოდის შესრულების შემდეგ ორივე ფორმაში შესაძლებელი იქნება ქართულად ბეჭდვა, კლავიატურის გადართვის გარეშე.</p>
<p>სკრიპტის მუშაობის პრინციპი მარტივია, GeoKBD ობიექტის map მეთოდს გადავცემთ სამ პარამეტრს:</p>
<ol>
<li>HTML ფორმის სახელი ან თავად HTML ფორმა</li>
<li>იმ ველის სახელი რომელშიც შესაძლებელი უნდა იყოს ქართულად ბეჭდვა ან თუ გსურთ რომ ფორმის ყველა ველში იყოს შესაძლებელი ქართულად ბეჭდვა, მაშინ ამ პარამეტრის გადაცემა არ არის აუცილებელი</li>
<li>კლავიატურის გადამრთველი ველის(checkbox) სახელი (არ არის აუცილებელი პარამეტრი, თუ ამ პარამეტრს არ გადავცმეთ გამოყენებული იქნება სახელი &#8216;geo&#8217;)</li>
</ol>
<p><strong><br />
პროგრამის სრული კოდი:</strong></p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #006600; font-style: italic;">/*<br />
&nbsp; &nbsp;* GeoKBD 0.1 - Georgian keyboard and text convertation library<br />
&nbsp; &nbsp;*<br />
&nbsp; &nbsp;* Copyright (c) 2007 Ioseb Dzmanashvili (http://www.code.ge)<br />
&nbsp; &nbsp;* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)<br />
&nbsp; &nbsp;*/</span><br />
&nbsp; <br />
&nbsp; String.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">pasteTo</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>field<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; field.<span style="color: #000066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">selection</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> selection <span style="color: #339933;">=</span> document.<span style="color: #660066;">selection</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> range <span style="color: #339933;">=</span> selection.<span style="color: #660066;">createRange</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; range.<span style="color: #660066;">colapse</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>range<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; range.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>field.<span style="color: #660066;">selectionStart</span> <span style="color: #339933;">||</span> field.<span style="color: #660066;">selectionEnd</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> scrollTop <span style="color: #339933;">=</span> field.<span style="color: #660066;">scrollTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> start <span style="color: #339933;">=</span> field.<span style="color: #660066;">selectionStart</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> end <span style="color: #339933;">=</span> field.<span style="color: #660066;">selectionEnd</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> value <span style="color: #339933;">=</span> field.<span style="color: #660066;">value</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>0<span style="color: #339933;">,</span> start<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span> <span style="color: #339933;">+</span> field.<span style="color: #660066;">value</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>end<span style="color: #339933;">,</span> field.<span style="color: #660066;">value</span>.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; field.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; field.<span style="color: #660066;">scrollTop</span> <span style="color: #339933;">=</span> scrollTop<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; field.<span style="color: #660066;">selectionStart</span> <span style="color: #339933;">=</span> start <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; field.<span style="color: #660066;">selectionEnd</span> <span style="color: #339933;">=</span> start <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; field.<span style="color: #660066;">value</span> <span style="color: #339933;">+=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <br />
&nbsp; <br />
&nbsp; String.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">translateToKA</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/**<br />
&nbsp; &nbsp; &nbsp;* Original idea by Irakli Nadareishvili<br />
&nbsp; &nbsp; &nbsp;* http://www.sapikhvno.org/viewtopic.php?t=47&amp;postdays=0&amp;postorder=asc&amp;start=10<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> index<span style="color: #339933;">,</span> chr<span style="color: #339933;">,</span> text <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> symbols <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;abgdevzTiklmnopJrstufqRySCcZwWxjh&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; chr <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">substr</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> 1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>index <span style="color: #339933;">=</span> symbols.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>chr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;=</span> 0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; text.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>String.<span style="color: #660066;">fromCharCode</span><span style="color: #009900;">&#40;</span>index <span style="color: #339933;">+</span> 4304<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; text.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>chr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> text.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; <br />
&nbsp; GeoKBD <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; event<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; get<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> e <span style="color: #339933;">||</span> window.<span style="color: #660066;">event</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; getKeyCode<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> e.<span style="color: #660066;">keyCode</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">which</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; targetIs<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> tagName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> t <span style="color: #339933;">=</span> e.<span style="color: #660066;">target</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">srcElement</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> t.<span style="color: #660066;">tagName</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> tagName <span style="color: #339933;">?</span> t <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; map<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>form<span style="color: #339933;">,</span> contentFieldName<span style="color: #339933;">,</span> switcher<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> self <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; form <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> form <span style="color: #339933;">==</span> <span style="color: #3366CC;">'string'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span>form<span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> form<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; switcher <span style="color: #339933;">=</span> switcher <span style="color: #339933;">||</span> <span style="color: #3366CC;">'geo'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; form.<span style="color: #660066;">onkeypress</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; e <span style="color: #339933;">=</span> self.<span style="color: #660066;">event</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">altKey</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">ctrlKey</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> target<span style="color: #339933;">,</span> fieldName <span style="color: #339933;">=</span> contentFieldName<span style="color: #339933;">,</span> _switcher <span style="color: #339933;">=</span> switcher<span style="color: #339933;">,</span> keyCode <span style="color: #339933;">=</span> self.<span style="color: #660066;">event</span>.<span style="color: #660066;">getKeyCode</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>keyCode <span style="color: #339933;">==</span> 96<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>_switcher<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">checked</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>_switcher<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">checked</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#91;</span>_switcher<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">checked</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>target <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>self.<span style="color: #660066;">event</span>.<span style="color: #660066;">targetIs</span><span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> <span style="color: #3366CC;">'textarea'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> self.<span style="color: #660066;">event</span>.<span style="color: #660066;">targetIs</span><span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> <span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>fieldName <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>target.<span style="color: #000066;">name</span> <span style="color: #339933;">!=</span> fieldName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text <span style="color: #339933;">=</span> String.<span style="color: #660066;">fromCharCode</span><span style="color: #009900;">&#40;</span>keyCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; kaText <span style="color: #339933;">=</span> text.<span style="color: #660066;">translateToKA</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>kaText <span style="color: #339933;">!=</span> text<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; kaText.<span style="color: #660066;">pasteTo</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; form <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; window.<span style="color: #660066;">GeoKBD</span> <span style="color: #339933;">=</span> GeoKBD<span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/georgian-keyboard/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>IE incomplete DOM support&#8230;</title>
		<link>http://www.code.ge/posts/ie-incomplete-dom-support</link>
		<comments>http://www.code.ge/posts/ie-incomplete-dom-support#comments</comments>
		<pubDate>Mon, 15 Oct 2007 08:29:17 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/ie-incomplete-dom-support</guid>
		<description><![CDATA[ამჯერად ყურადღებას შევაჩერებ DOM ელემენტის hasAttribute მეთოდზე. ამ მეთოდის სახელი საკმაოდ თვითდოკუმენტირებულია და ადვილი მისახვედრია რისთვისაც გამოიყენება. ზუსტი განმარტება: The hasAttribute() method returns TRUE if the current element node has the attribute specified by name, and FALSE otherwise. მაგრამ IE &#8211; ში DOM ელემენტს არ გააჩნია ეს შედარებით იშვიათად გამოყენებადი მაგრამ ძალიან სასარგებლო მეთოდი. თუმცა [...]]]></description>
			<content:encoded><![CDATA[<p>ამჯერად ყურადღებას შევაჩერებ DOM ელემენტის hasAttribute მეთოდზე. ამ მეთოდის სახელი საკმაოდ თვითდოკუმენტირებულია და ადვილი მისახვედრია რისთვისაც გამოიყენება.</p>
<p>ზუსტი განმარტება:</p>
<blockquote><p>The hasAttribute() method returns TRUE if the current element node has the attribute specified by name, and FALSE otherwise.</p></blockquote>
<p>მაგრამ IE &#8211; ში DOM ელემენტს არ გააჩნია ეს შედარებით იშვიათად გამოყენებადი მაგრამ ძალიან სასარგებლო მეთოდი. თუმცა არსებობს სხვა საშუალება ამ ბრაუზერისათვის რომლის მეშვეობითაც ადვილად ავიცილებთ თავიდან ამ DOM &#8211; ის არასრული მხარდაჭერით გამოწვეულ პრობლემას.<span id="more-78"></span></p>
<p>მაგალითად იმის დასადგენად ელემენტს გააჩნია თუ არა რომელიმე ატრიბუტი, შეგვიძლია დავწეროთ ასეთი კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> el <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'my-element-id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> attributeName <span style="color: #339933;">=</span> <span style="color: #3366CC;">'type'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//სტანდარტებთან თავსებადი ბრაუზერები</span><br />
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">hasAttribute</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> el.<span style="color: #660066;">hasAttribute</span><span style="color: #009900;">&#40;</span>attributeName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #006600; font-style: italic;">//მხოლოდ IE</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> el.<span style="color: #660066;">attributes</span><span style="color: #009900;">&#91;</span>attributeName<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> el.<span style="color: #660066;">attributes</span><span style="color: #009900;">&#91;</span>attributeName<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">specified</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>მაგალითიდან ჩანს რომ IE &#8211; ს შემტხვევაში ვიყენებთ ელემენტის <strong>attributes</strong> თვისებას&#8230; ეს არის მასივის ტიპის თვისება რომელიც შიცავს ელემენტის ატრიბუტებს, და მისი მეშვეობით შეგვიძლია ამოვიღოთ ელემენტის სასურველი ატრიბუტი(და არა ატრიბუტის მნიშვნელობა)&#8230; ასევე ყურადღება მიაქციეთ <strong>.specified</strong> თვისებას, მისი მნიშვნელობა არის ან true თუ ატრიბუტი განსაზღვრულია ან false წინააღდმეგ შემთხვევაში მაგრამ არის ერთი მაგრამ&#8230; ამ კონსტრუქციას <strong>el.attributes[attributeName].specified</strong> ვერ გამოვიყენებთ თუ ატრიბუტი განსაზღვრული არ არის <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ანუ გამოდის რომ specified თვისება უსარგებლოა ისეთ შემთხვევაში თუ ატრიბუტი არ არსებობს და ჯერ საჭიროა ზოგადად ატრიბუტის არსებობა&#8230; ამას ვაღწევთ el.attributes[attributeName] &#8211; ის მეშვეობით, თუ ატრიბუტი არსებობს ხელთ გვაქვს ობიექტი რომელსაც აქვს თვისება specified&#8230; რატომ არ ვიყენებთ მხოლოდ ამ &#8220;el.attributes[attributeName]&#8221; კონსტრუქციას? მიზეზი მარტივია&#8230; მოყვანილი მაგალითის დანიშნულებაა დააბრუნოს ან true ან false და არა ობიექტი&#8230; სწორედ ამის გამო გამოვიყენე ასეთი ჩაწერა:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">el.<span style="color: #660066;">attributes</span><span style="color: #009900;">&#91;</span>attributeName<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> el.<span style="color: #660066;">attributes</span><span style="color: #009900;">&#91;</span>attributeName<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">specified</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>თუმცა ასეთივე წარმატებით შეგვეძლო გამოგვეყენებინა ორი უარყოფის(not) ოპერატორი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">!!</span>el.<span style="color: #660066;">attributes</span><span style="color: #009900;">&#91;</span>attributeName<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>რას აკეთებს ორი &#8220;!!&#8221;? ამ შემთხვევაში მარჯვენა(მეორე) უარყოფის ოპერატორი გადაიყვანს object ტიპის მნიშვნელობას boolean ტიპის მნიშვნელობაში(შესაბამისად თუ გვექნება null იგი გარდაიქმნება true &#8211; დ, ხოლო თუ გვექნება null &#8211; იდან განსხვავებული მნიშნველობა ანუ ამ შემთხვევაში object იგი გარდაიქმნება false &#8211; დ), ხოლო მარცხენა(პირველი) ოპერატორი შეაბრუნებს ამ მნიშვნელობას ან ჭეშმარიტიდან მცდარისკენ ან პირიქით, რაც სრულებით საკმარისია მიზნის მისაღწევად.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ie-incomplete-dom-support/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>javascript+xpath+IE&#8230; სრული ფიასკო :(</title>
		<link>http://www.code.ge/posts/javascriptxpathie-%e1%83%a1%e1%83%a0%e1%83%a3%e1%83%9a%e1%83%98-%e1%83%a4%e1%83%98%e1%83%90%e1%83%a1%e1%83%99%e1%83%9d</link>
		<comments>http://www.code.ge/posts/javascriptxpathie-%e1%83%a1%e1%83%a0%e1%83%a3%e1%83%9a%e1%83%98-%e1%83%a4%e1%83%98%e1%83%90%e1%83%a1%e1%83%99%e1%83%9d#comments</comments>
		<pubDate>Wed, 10 Oct 2007 13:38:44 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/javascriptxpathie-%e1%83%a1%e1%83%a0%e1%83%a3%e1%83%9a%e1%83%98-%e1%83%a4%e1%83%98%e1%83%90%e1%83%a1%e1%83%99%e1%83%9d</guid>
		<description><![CDATA[აი მერე იტყვიან კარგი ბრაუზერია და რატომ აგინებო როგორ არ უნდა ვიგინო? რაღაცაში დამჭირდა xpath &#8211; ის სრული მხარდაჭერა HTML დოკუმენტების დასამუშავებლად&#8230; ვიწვალე დავწერე გავაკეთე ყველაფერი&#8230; მაგრამ რად გინდა? სულსწრაფობა მწარედ და ძვირად დამიჯდა&#8230;. ჩემი დაწერილი კოდი არ მუშაობს სრულ იდიოტთა მიერ შექმნილ IE &#8211; ში მათ შორის &#8220;უძალიან მაგრესია IE7, ტაბებიც კი აქვს&#8221; ბრაუზერშიც [...]]]></description>
			<content:encoded><![CDATA[<p>აი მერე იტყვიან კარგი ბრაუზერია და რატომ აგინებო <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  როგორ არ უნდა ვიგინო? რაღაცაში დამჭირდა xpath &#8211; ის სრული მხარდაჭერა HTML დოკუმენტების დასამუშავებლად&#8230; ვიწვალე დავწერე გავაკეთე ყველაფერი&#8230; მაგრამ რად გინდა? სულსწრაფობა მწარედ და ძვირად დამიჯდა&#8230;. ჩემი დაწერილი კოდი არ მუშაობს სრულ იდიოტთა მიერ შექმნილ IE &#8211; ში <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  მათ შორის &#8220;უძალიან მაგრესია IE7, ტაბებიც კი აქვს&#8221; ბრაუზერშიც <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>აი რაზე უნდა ელაპარაკო ამ წყეული IE &#8211; ს ვენდორს? რით ვერ გამოფხიზლდნენ და რით ვერ გამოიღვიძეს????? </p>
<p>არ ვიცი&#8230; როდესმე რამე ეშველება თუ არა ამ სატანის გამოგონებას&#8230; ალბათ არა <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>მოკლედ ყველა ბრაუზერში მუშაობს ასეთი რამ:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066; font-weight: bold;">item</span><span style="color: #339933;">,</span> els <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> iterator <span style="color: #339933;">=</span> document.<span style="color: #660066;">evaluate</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'//div/p[@class=&quot;some-class-name&quot;]'</span> document<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> 0<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>&nbsp; <br />
<span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span> <span style="color: #339933;">=</span> iterator.<span style="color: #660066;">iterateNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; els.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ალბათ კოდიდან მიხვდებით რაც ხდება&#8230; არ მაქვს დეტალების ახსნის თავი <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>უბედურება ის არის რომ სხვა დანარჩენ ბრაუზერებში სადაც კი ეს კოდი გავტესტე ნეიტივად არის document.evaluate მეთოდი&#8230; გადასცემ xpath გამოსახულებას და დაგიბრუნებს სასურველ ელემენტებს&#8230; აკეთე რაც გინდა და რაც გაგეხარდება&#8230; მაგრამ&#8230; მაგრამ IE &#8211; ს საერთოდ არ შეუძლია HTML &#8211; სთან ამ გზით მუშაობა&#8230; </p>
<p>ვეძებე.. თანაც ბევრი ვეძებე&#8230; და რას მივაგენი? <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  აი ამას -> <a href="http://glazkov.com/blog/html-xpath-project/">http://glazkov.com/blog/html-xpath-project</a></p>
<p>ვინმე გლაზკოვის მიერ დაწერილ იმპლემენტაციას&#8230; რომელიც იწონის ძალიან ბევრს და ძალიან ნელია <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  არადა მიხაროდა მთელი ამოცანა 1 კილობაიტში ჩავტიეთქო <img src='http://www.code.ge/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
<strong><br />
არავინ თქვას რომ ამ ბრაუზერს არსებობის უფლება აქვს!!! </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/javascriptxpathie-%e1%83%a1%e1%83%a0%e1%83%a3%e1%83%9a%e1%83%98-%e1%83%a4%e1%83%98%e1%83%90%e1%83%a1%e1%83%99%e1%83%9d/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ელემენტის პოზიციების დადგენა</title>
		<link>http://www.code.ge/posts/detecting-elements-position</link>
		<comments>http://www.code.ge/posts/detecting-elements-position#comments</comments>
		<pubDate>Fri, 05 Oct 2007 10:12:47 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/detecting-elements-position</guid>
		<description><![CDATA[ამ პოსტს წესით უნდა ერქვას &#8220;Sometimes IE is the BEST&#8221; მაგრამ ცხადია ამას არ ვიზამ გასაგები მიზეზების გამო არააბსოლუტური პოზიციის მქონე ელემენტის პოზიციის(top, left) დადგენა დოკუმენტში საკმაოდ ბანალური საკითხია და პრინციპში ამის შესახებ პოსტის გაკეთების დიდ აზრს ვერასოდეს ვხედავდი&#8230; თუმცა გუშინ jQuery &#8211; ის ახალი რელიზის კოდის კითხვის დროს აღმოვაჩინე ისეთი რამ რასაც მართლა დიდი [...]]]></description>
			<content:encoded><![CDATA[<p>ამ პოსტს წესით უნდა ერქვას <strong>&#8220;Sometimes IE is the BEST&#8221;</strong> მაგრამ ცხადია ამას არ ვიზამ გასაგები მიზეზების გამო <img src='http://www.code.ge/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>არააბსოლუტური პოზიციის მქონე ელემენტის პოზიციის(top, left) დადგენა დოკუმენტში საკმაოდ ბანალური საკითხია და პრინციპში ამის შესახებ პოსტის გაკეთების დიდ აზრს ვერასოდეს ვხედავდი&#8230; თუმცა გუშინ jQuery &#8211; ის ახალი რელიზის კოდის კითხვის დროს აღმოვაჩინე ისეთი რამ რასაც მართლა დიდი ხანია ვეძებდი და რასაც როგორც იქნა მივაგენი&#8230;</p>
<p>თემა რა თქმა უნდა შეეხეა ელემენტის პოზიციის დადგენას და იმ პრობლემებს რომელიც ამ ამოცანის გადაჭრისას გვხდება, თუმცა უნდა ვაღიარო რომ ყველა ბრაუზერში მივიღე 100% &#8211; იანი შედეგი გარდა IE &#8211; სი. უფრო მეტიც ამ შემთხვევაში ქცევა IE6 &#8211; სა და IE7 &#8211; ს შორის განსხვავდება, და გასაგებია რომ ეს სიამოვნებას არ მომანიჭებდა.</p>
<p>მაშ ასე რა გადაწყვეტასთან გვაქვს საქმე და რამ გამახარა ასე ძალიან?<span id="more-76"></span></p>
<h2>პრობლემა</h2>
<p>არააბსოლუტური პოზიციის მქონე ელემენტის პოზიციის დადგენას გააჩნია რამდენიმე ისეთი ნიუანსი რაც ბრაუზერებს შორის განსხვავდება&#8230; ბრაუზერებს შორის სხვაობა მეტნაკლებად აღმოფხვრადია თუმცა აქ კვლავ განსაკუთრებით რთულ პრობლემას ვაწყდებით IE &#8211; სთან.</p>
<p>ელემენტის პოზიციის დასადგენი ტიპიური კოდი გამოიყურება ასე:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> getObjectPosition<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> pos <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>top<span style="color: #339933;">:</span> 0<span style="color: #339933;">,</span> left<span style="color: #339933;">:</span> 0<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetLeft</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; obj <span style="color: #339933;">=</span> obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> pos<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ეს კოდი მუშაობს მარტივ შემთხვევებში.. თუმცა რეალური რთული ინტერფეისი მქონე ვებ აპლიკაციებისათვის აბსოლუტურად გამოუსადეგარია. ეს კოდი ბოლომდე კორექტული მხოლოდ Opera &#8211; შია.</p>
<p>რაში გამოიხატება ეს &#8220;გამოუსადეგრობა&#8221;? <a href="http://www.code.ge/samples/positions.htm">პირველ რიგში იხილეთ ეს მუშა მაგალითი</a>. მაგალითში გამოყენებული კონტეინერები(div ელემენტები), რომლებიც განთავსებულია ერთმანეთში და მათზე მაუსის დაწკაპუნების შემთხვევაში ხდება კონკრეტული ელემენტის მონიშვნა. თუმცა მონიშვნა ხდება სხვა ელემენტის დახმარებით. ეს არის დამალული(საწყის ეტაპზე) div ელემენტი რომელიც ხილული ხდება მხოლოდ მაშინ თუ დოკუმენტში არსებულ რომელიმე div &#8211; ზე დავაწკაპუნებთ. იგი არის ნახევრად გამჭვირვალე და თავზე ეფარება ჩვენს მიერ არჩეულ ელემენტს.</p>
<p>იმისათვის რომ არჩეული ელემენტის გადაფარვა მოხდეს სწორად გვესაჭიროება არჩეული ელემენტის ოთხი პარამეტრი. ესენია:</p>
<ol>
<li>
<strong>top </strong>- ელემენტის პოზიცია ბრაუზერის ზედა მხრიდან;</li>
<li><strong>left </strong>- ელემენტის პოზიცია ბრაუზერის მარცხენა მხრიდან;</li>
<li><strong>width </strong>- ელემენტის ზუსტი სიგანე;</li>
<li><strong>height </strong>- ელემენტის ზუსტი სიმაღლე;</li>
</ol>
<p>ჩამოთვლილი პარამეტრებიდან width და height პარამეტრები ადვილი მოსაპოვებელია ელემენტის <strong>offsetWidth</strong>(სიგანისათვის) და შესაბამისად <strong>offsetHeight</strong>(სიმაღლისათვის) თვისებების მეშვეობით&#8230; თუმცა ელემენტის ზუსტი პოზიციის დადგენა გაცილებით რთული საკითხია რადგან&#8230; რადგან <strong>offsetTop </strong>და <strong>offsetLeft</strong> თვისებებში ინახებ მნიშვნელობები რომელიც სასურველი ელემენტის ზედა საფეხურზე მდგომი (offsetParent) ელემენტის მიმართებაში გამოითვლება&#8230; აქედან არსებობს ერთი გამოსავალი რაც ნაჩვენები იყო ზემოთ მოყვანილ კოდში&#8230; ანუ საჭიროა იტერაცია ქვემოდან ზევით რათა ყველა offsetParent &#8211; ის offsetTop და offsetLeft მონაცემების დაჯამება მოხდეს&#8230; </p>
<p>პირველ ყველაზე მარტივი საკითხი რასაც ვაწყდებით ამ იტერაციისას არის ის რომ თურმე სხვადასხვა ბრაუზერებში ეს საფეხურები(ანუ ელემენტი რომელიც შეესაბამება კონკრეტულ საფეხურს) განსხვავებულია&#8230; თუმცა ეს დიდ პრობლემას არ ქმნის&#8230; პრობლემები გვხდება სხვა შემთხვევებში, კერძოდ კი თუ ელემენტი განთავსებულია ისეთ ელემენტში რომლის სტილის ატრიბუტის overflow მნიშვნელობა არის auto ხოლო, სკროლერი არის დაძრული ადგილიდან პოზიციის გამოთვლაში ვაწყდებით ცდომილებას&#8230; ეს ეხება როგორც მარჯვენა, ასევე მარცხენა სკროლს&#8230; </p>
<p>ამისათვის არსებობს ერთი მარტივი გზა, სასურველი ელემენტიდან დაწყებული(ქვემოდან ზემოთ) სრული იერარქიის იტერაცია და scrollLeft და scrollTop მნიშვნელობების გამოკლება შესაბამისი მნიშვნელობებისათვის.</p>
<p>მოდიფიცირებული კოდი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> getObjectPosition<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> pos <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>top<span style="color: #339933;">:</span> 0<span style="color: #339933;">,</span> left<span style="color: #339933;">:</span> 0<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> el <span style="color: #339933;">=</span> obj<span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetLeft</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; obj <span style="color: #339933;">=</span> obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>obj <span style="color: #339933;">=</span> el.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span> obj <span style="color: #339933;">&amp;&amp;</span> obj <span style="color: #339933;">!=</span> document.<span style="color: #660066;">body</span><span style="color: #339933;">;</span> obj <span style="color: #339933;">=</span> obj.<span style="color: #660066;">parentNode</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">-=</span> obj.<span style="color: #660066;">scrollTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">-=</span> obj.<span style="color: #660066;">scrollLeft</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span> <br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> pos<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ მოდიფიკაციით სკროლერების პრობლემა მოგვარებულია მაგრამ&#8230; ეხლა იწყება ყველაზე საინტერესო <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>ზემოთ ავღნიშნე რომ კოდი რომელიც მოვიყვანე მაგალითად კორექტულად მუშაობს მხოლოდ Opera &#8211; ში&#8230; რატომ? თუ დააკვირდით მუშა მაგალითს, ყველა ელემენტს აქვს განსხვავებული ზომის გვერდები(border). სწორედ ეს გვერდები ქმნის პრობლემას რადგან, Opera &#8211; ს გარდა არცერთი ბრაუზერი არ ითვალისწინებს ამას და ხშირად ვღებულობთ ცდომილებებს&#8230;</p>
<p>ამ პრობლემის თავიდან აცილება შესაძლებელია ელემენტის მარცხენა და ზედა გვერდის გამოთვლის მეშვეობით&#8230; მაგრამ ეს საკითხიც პრობლემატურია რადგან მიმდინარე სტილების მნიშვნელობის გაგება სხვადასხვაა ბრაუზერებს შორის (იხ. <a href="http://www.code.ge/javascript/working-with-element-styles-part-two">შესაბამისი პოსტი</a>) და გარდა იმისა რომ ეს გამოთვლა აბსოლუტურათ ზედმეტია ოპერასთვის, ასევე დამატებითი კოდის წერაა საჭირო&#8230; მითითებული პოსტის გათვალისწინებით კოდი მიიღებს შემდეგ სახეს:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> getObjectPosition<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> pos <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>top<span style="color: #339933;">:</span> 0<span style="color: #339933;">,</span> left<span style="color: #339933;">:</span> 0<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> el <span style="color: #339933;">=</span> obj<span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> isOpera <span style="color: #339933;">=</span> navigator.<span style="color: #660066;">userAgent</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'opera'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetLeft</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>isOpera<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">+=</span> parseInt<span style="color: #009900;">&#40;</span>Util.<span style="color: #660066;">style</span>.<span style="color: #660066;">getStyle</span>.<span style="color: #660066;">getStyle</span><span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'border-top-width'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">+=</span> parseInt<span style="color: #009900;">&#40;</span>Util.<span style="color: #660066;">style</span>.<span style="color: #660066;">getStyle</span>.<span style="color: #660066;">getStyle</span><span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'border-left-width'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; obj <span style="color: #339933;">=</span> obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>obj <span style="color: #339933;">=</span> el.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span> obj <span style="color: #339933;">&amp;&amp;</span> obj <span style="color: #339933;">!=</span> document.<span style="color: #660066;">body</span><span style="color: #339933;">;</span> obj <span style="color: #339933;">=</span> obj.<span style="color: #660066;">parentNode</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">-=</span> obj.<span style="color: #660066;">scrollTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">-=</span> obj.<span style="color: #660066;">scrollLeft</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span> <br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> pos<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>კოდში შეტანილი ცვლილებები გამოიყენება სწორედ ამ არათავსებადობის აღმოსაფხვრელად&#8230; მაგრამ ცუდი არის ის რომ ეს კოდი ვარგისია ყველგან გარდა IE6 &#8211; ისა&#8230; პრობლემა მდგომარეობს იმაში რომ გარდა გვერდების ზომისა IE &#8211; ს ესაჭიროება ასევე ელემენტის პირველი მშობელი ელემენტის შიდა სივრცის გამოთვლა როგორც ზედა მხრისათვის ასევე მარცხენა მხრისათვის&#8230; თან გაითვალისწინეთ რომ ამ ელემენტის position ატრიბუტის მნიშვნელობა არ უნდა იყოს static&#8230; მაგრამ განსხვავებულ შემთხვევებში არც ეს გამოსავალია საჭირო&#8230; ამ დეტალების აღმოსაფხვრელად საჭირო კოდს არ ვწერ შეგნებულად რადაგნ როგორც ზემოთ ავღნიშნე IE &#8211; სთვის მივაგენი იდეალურ გამოსავალს&#8230; </p>
<p>ეს არის ელემენტის მეთოდი <a href="http://msdn2.microsoft.com/en-us/library/ms536433.aspx"><strong>getBoundingClientRect</strong></a>, რომელიც გვიბრუნებს ობიექტს რომელშიც განთავსებულია ჩვენთვის საჭირო ინფორმაცია და დამატებით დამუშავებას აღარ საჭიროებს.</p>
<p>განმარტება MSDN &#8211; იდან:</p>
<blockquote><p>Returns a TextRectangle object. Each rectangle has four integer properties (top, left, right, and bottom) that represent a coordinate of the rectangle, in pixels.</p></blockquote>
<p>რაოდენ გასაოცარიც არ უნდა იყოს ეს მეთოდი მუშაობს უშეცდომოდ&#8230; ერთი პატარა გამონაკლისის გარდა, ეს არის თავად HTML ელემენტის ნაგულისხმევი(default) მნიშვნელობა border ატრიბუტისათვის&#8230; ანუ იგი არის 2 პიქსელის ტოლი.. თუმცა ეს ადვილად მოსაგვარებელი საკითხია და ჩვენი კოდი მიიღებს საბოლოო და უნივერსალურ სახეს:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">getObjectPostion<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> pos <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>top<span style="color: #339933;">:</span> 0<span style="color: #339933;">,</span> left<span style="color: #339933;">:</span> 0<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> el <span style="color: #339933;">=</span> obj<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//IE6/7 solution</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">getBoundingClientRect</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> box <span style="color: #339933;">=</span> obj.<span style="color: #660066;">getBoundingClientRect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">=</span> box.<span style="color: #660066;">top</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">=</span> box.<span style="color: #660066;">left</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//all other browsers</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">+=</span> obj.<span style="color: #660066;">offsetLeft</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">browser</span>.<span style="color: #660066;">isOpera</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">+=</span> parseInt<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getStyle</span><span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'border-top-width'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">+=</span> parseInt<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getStyle</span><span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'border-left-width'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; obj <span style="color: #339933;">=</span> obj.<span style="color: #660066;">offsetParent</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//calculation of left and right scrolls</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>obj <span style="color: #339933;">=</span> el.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span> obj <span style="color: #339933;">&amp;&amp;</span> obj <span style="color: #339933;">!=</span> document.<span style="color: #660066;">body</span><span style="color: #339933;">;</span> obj <span style="color: #339933;">=</span> obj.<span style="color: #660066;">parentNode</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">top</span> <span style="color: #339933;">-=</span> obj.<span style="color: #660066;">scrollTop</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; pos.<span style="color: #660066;">left</span> <span style="color: #339933;">-=</span> obj.<span style="color: #660066;">scrollLeft</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span> <br />
&nbsp; el <span style="color: #339933;">=</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> pos<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>მაშ ასე, პოზიციების დადგენა IE &#8211; სთვის თურმე ყველაზე ელეგანტურად გვარდება განსხვავებით სხვა დანარჩენი ბრაუზერებისგან, კოდის ნაწილი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>obj.<span style="color: #660066;">getBoundingClientRect</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #003366; font-weight: bold;">var</span> box <span style="color: #339933;">=</span> obj.<span style="color: #660066;">getBoundingClientRect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;pos.<span style="color: #660066;">top</span> <span style="color: #339933;">=</span> box.<span style="color: #660066;">top</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;pos.<span style="color: #660066;">left</span> <span style="color: #339933;">=</span> box.<span style="color: #660066;">left</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>გამოიყენება სწორედ IE &#8211; სთვის <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   და რაც ყველაზე სასიხარულოა, იგი არის ძალიან სწრაფი და რაც მთავარია უშეცდომო! </p>
<p><strong>პოზიციის დასადგენად საჭირო კოდი სრულად შეგიძლიათ ამოიღოთ ზემოთ მითითებული მაგალითის სორსიდან.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/detecting-elements-position/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>IE6 BUG: დინამიური iframe</title>
		<link>http://www.code.ge/posts/ie6-dynamic-iframe-bug</link>
		<comments>http://www.code.ge/posts/ie6-dynamic-iframe-bug#comments</comments>
		<pubDate>Fri, 28 Sep 2007 12:13:05 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/ie6-dynamic-iframe-bug</guid>
		<description><![CDATA[ეს თემა გარკვეულწილად უკავშირდება ერთერთ წინა პოსტს დინამიური ფორმებისა და ფორმის ელემენტების შესახებ. მსგავს პრობლემას ასევე ვაწყდებით iframe ელემენტთან მუშაობისას და შესაბამისად ისევ იგივე დილემის წინაშე ვდგებით&#8230; ანუ საჭიროა კოდის გაყოფა რომელიც ერთის მხრივ იმუშავებს IE &#8211; სთვის და მეორეს მხრივ სხვა ყველა დანარჩენი ბრაუზერისათვის. პრობლემა ისევე როგორც სხვა დანარჩენი ელემენტების შემთხვევაში ზოგჯერ საჭიროა iframe [...]]]></description>
			<content:encoded><![CDATA[<p>ეს თემა გარკვეულწილად უკავშირდება ერთერთ <a href="http://www.code.ge/javascript/ie67-bug-html-forms-and-elements">წინა პოსტს</a> დინამიური ფორმებისა და ფორმის ელემენტების შესახებ. </p>
<p>მსგავს პრობლემას ასევე ვაწყდებით iframe ელემენტთან მუშაობისას და შესაბამისად ისევ იგივე დილემის წინაშე ვდგებით&#8230; ანუ საჭიროა კოდის გაყოფა რომელიც ერთის მხრივ იმუშავებს IE &#8211; სთვის და მეორეს მხრივ სხვა ყველა დანარჩენი ბრაუზერისათვის.<span id="more-71"></span></p>
<p><strong><br />
პრობლემა</strong><br />
ისევე როგორც სხვა დანარჩენი ელემენტების შემთხვევაში ზოგჯერ საჭიროა iframe ელემენტის შექმნა დინამიურად. რა შემთხვევაა ეს? პირადად მე ყველაზე ხშირად ამას ვაკეთებ Ajax აპლოადის დროს&#8230; ანუ ყოველ დოკუმენტზე სადაც კი შეიძლება დამჭირდეს ფაილის აპლოადი არ არის აუცილებელი რომ წინასწარ შესაბამისი დამალული iframe ელემენტიც შევქმნა, ამას უნდა აკეთებდეს ფრეიმვორკი. ამის გაკეთება საკმაოდ მარტივია თუმცა IE &#8211; ში ყველაფერი ისე არ არის როგორც ეს უნდა იყოს.</p>
<p>როგორ გამოიყენება ასეთი iframe ელემენტი? გამომდინარე იქედან რომ როდესაც გვინდა ფაილის ატვირთვა სერვერზე ფორმის საბმიტი უნდა მოხდეს ჩვენთვის საჭირო iframe &#8211; ს მეშვეობით, ხოლო ამისათვის საჭიროა რომ form ელემენტის target ატრიბუტს მივანიჭოთ სასურველი iframe ელემენტის სახელი ანუ მისი name ატრიბუტის მნიშვნელობა. თუმცა&#8230;</p>
<p><strong><br />
მარტივი ტესტ კეისი:</strong></p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> iframe <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'iframe'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
iframe.<span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'test-iframe'</span><span style="color: #339933;">;</span><br />
iframe.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'test-iframe-id'</span><span style="color: #339933;">;</span><br />
iframe.<span style="color: #660066;">style</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'250px'</span><span style="color: #339933;">;</span><br />
iframe.<span style="color: #660066;">style</span>.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'250px'</span><span style="color: #339933;">;</span><br />
<br />
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>iframe<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">frames</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-iframe'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//შედეგი ამ შემთხვევაში არის &quot;undefined&quot;</span></div></td></tr></tbody></table></div>
<p>შედეგი ისევე როგორც ფორმების შემთხვევაში არის &#8220;<strong>undefined</strong>&#8220;. ანუ ამ გზით შექმნილი iframe ელემენტი არ მოხვდა document ობიექტის frames მასივში, რაც ასეთ ელემენტს ჩვენთვის უსარგებლოს ხდის.</p>
<p><strong><br />
გამოსავალი</strong></p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> iframe <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;iframe name=&quot;test-iframe&quot;&gt;&lt;/iframe&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
iframe.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'test-iframe-id'</span><span style="color: #339933;">;</span><br />
iframe.<span style="color: #660066;">style</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'250px'</span><span style="color: #339933;">;</span><br />
iframe.<span style="color: #660066;">style</span>.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'250px'</span><span style="color: #339933;">;</span><br />
<br />
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>iframe<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">frames</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-iframe'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//გამობეჭდავს ელემენტის id ატრიბუტის მნიშვნელობას</span></div></td></tr></tbody></table></div>
<p>მსგავსად დინამიური ფორმისა, ამ შემთხვევაშიც createElement მეთოდს გადავცემთ არა ელემენტის სახელს არამედ მის შესაქმნელად საჭირო HTML კოდს. ყურადღება მიაქციეთ name ატრიბუტს, იგი აუცილებლად უნდა მივუთითოთ.</p>
<p>ასეთ შემთხვევაში ყველაფერი რიგზეა და iframe ელემენტზე შესაბამისი წვდომაც გაგვაჩნია და რაც ყველაზე მნიშვნელოვანია ეს გამოსავალი სრულად აგვარებს პრობლემას.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ie6-dynamic-iframe-bug/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE6/7 BUG(s): დინამიური ფორმები და ფორმის ელემენტები</title>
		<link>http://www.code.ge/posts/ie67-bug-html-forms-and-elements</link>
		<comments>http://www.code.ge/posts/ie67-bug-html-forms-and-elements#comments</comments>
		<pubDate>Fri, 28 Sep 2007 10:32:25 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/ie67-bug-html-forms-and-elements</guid>
		<description><![CDATA[უკვე აღარავისათვის აღარ წარმოადგენს სიურპრიზს ის რომ Internet Explorer 6 საშინლად გაუმართავი ბრაუზერია და მას ძალიან ბევრი ხარვეზი გააჩნია. თუმცა ძალიან საწყენია ის რომ ამ ბრაუზერის მეშვიდე ვერსიაშიც ძალიან ბევრი ისეთი ხარვეზი მეორდება რაც ჩემის აზრით უკვე აღმოფხვრილი უნდა ყოფილიყო. პრობლემათაგან ერთერთი ყველაზე არასასიამოვნო და ნიუანსური ჩემის აზრით არის HTML ფორმებთან და ფორმის ელემენტებთან მუშაობა [...]]]></description>
			<content:encoded><![CDATA[<p>უკვე აღარავისათვის აღარ წარმოადგენს სიურპრიზს ის რომ Internet Explorer 6 საშინლად გაუმართავი ბრაუზერია და მას ძალიან ბევრი ხარვეზი გააჩნია. თუმცა ძალიან საწყენია ის რომ ამ ბრაუზერის მეშვიდე ვერსიაშიც ძალიან ბევრი ისეთი ხარვეზი მეორდება რაც ჩემის აზრით უკვე აღმოფხვრილი უნდა ყოფილიყო.</p>
<p>პრობლემათაგან ერთერთი ყველაზე არასასიამოვნო და ნიუანსური ჩემის აზრით არის HTML ფორმებთან და ფორმის ელემენტებთან მუშაობა JavaScript &#8211; ის DOM მეთოდებით.</p>
<p>არასასიამოვნო იმიტომ რომ თითქმის ყველა არსებული ბრაუზერებისაგან განსხვავებით(რომლებიც გამართულად მუშაობენ სპეციფიკაციის მიხედვით) IE &#8211; ს გააჩნია ისეთი პრობლემა რაც თავისთავად კოდის გაყოფას იწვევს, და კვლავ ვღებულობთ: <strong>IE vs სხვა დანარჩენი ბრაუზერები!</strong><span id="more-69"></span></p>
<p><strong>პრობლემა ფორმასთან</strong></p>
<p>ძალიან ხშირად, გარდა ელემენტებთან ჩვეულებრივი(მოპოვება, შეცვლა, ამოგდება დოკუმენტიდან) მუშაობისას ხშირად გვიწევს ელემენტების შექმნაც და შემდგომ უკვე დოკუმენტში ჩამატება. გამონაკლისი თავისთავად არც HTML ფორმაა, თავისთავად ფორმის შექმნა და მისი შემდგომი დამუშავება არ წარმოადგენს პრობლემას.. მაგრამ&#8230; IE &#8211; ში ეს ყველაფერი პრობლემაა&#8230;</p>
<p>მარტივეი ტესტ კეისი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'form'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
form.<span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'test-form'</span><span style="color: #339933;">;</span><br />
form.<span style="color: #660066;">action</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'/test'</span><span style="color: #339933;">;</span><br />
form.<span style="color: #660066;">enctype</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'multipart/form-data'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ფორმის დოკუმენტში დამატება</span><br />
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-form'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>IE &#8211; ში ამ კოდის გაშვების შემდეგ, შეტყობინება გამოგვიტანს&#8230; <strong>&#8220;undefined&#8221;</strong></p>
<p>რაოდენ უცნაურიც არ უნდა იყოს, მიუხედავად იმისა რომ ფორმა შევქმენით და ჩავამატეთ დოკუმენტში იგი არ მოხვდა document ობიექტის forms მასივში&#8230;</p>
<p><strong><br />
გამოსავალი 1</strong></p>
<p>ამ პრობლემის გამოსავალი მარტივია თუმცა უცნაური&#8230; IE &#8211; სთვის დამახასიათებელი <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;form name=&quot;test-form&quot; enctype=&quot;multipart/form-data&quot; action=&quot;/w&quot; method=&quot;post&quot;&gt;&lt;/form&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-form'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//გამობეჭდავს ფორმის method ატრიბუტის მნიშვნელობას</span></div></td></tr></tbody></table></div>
<p>უცნაურია ხომ? <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  createElement &#8211; მეთოდს გადავეცით მთლიანი HTML კოდი ნაცვლად იმისა რომ მიგვეთითებინა უბრალოდ ელემენტის სახელი&#8230; თუმცა ეს გამოსავალი მუშაობს და მთლიანად ხსნის პრობლემას&#8230; თუმცა უნდა აღინიშნოს რომ ეს გზა მხოლოდ IE &#8211; სთვის არის მისაღები და &#8220;მშობლიური&#8221;</p>
<p><strong><br />
გამოსავალი 2</strong></p>
<p>პირველი გამოსავალი თავისთავად გვიბიძგებს ახალი მოსაზრებისკენ&#8230; რომელიც თურმე ასევე კარგად და ეფექტურად მუშაობს, კერძოდ კი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;form name=&quot;test-form&quot; enctype=&quot;multipart/form-data&quot; action=&quot;/w&quot; method=&quot;post&quot;&gt;&lt;/form&gt;'</span><span style="color: #339933;">;</span><br />
document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'form-container'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> form<span style="color: #339933;">;</span><br />
<br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-form'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ამ შემთხვევაში საერთოდ არ გამოვიყენეთ createElement მეთოდი, ნაცვლად ამისა კონკრეტულ &#8220;form-container&#8221; ელემენტში(იგულისხმება რომ ეს ელემენტი უკვე არსებობს დოკუმენტში) მისი innerHTML თვისების მეშვეობით პირდაპირ ჩავსვით ფორმის შესაბამისი HTML კოდი&#8230; შედეგი სავსებით დამაკმაყოფილებელია რადგან იგი მუშაობს&#8230;</p>
<p><strong><br />
პრობლემა ფორმის ელემენტებთან</strong></p>
<p>გამომდინარე წინა პრობლემიდან ცხადია რომ გასაკვირი არ უნდა იყოს თუ ფორმის ელემენტებსაც იგივე პრობლემა ექნებათ&#8230; და ეს ასეც არის. პრობლემა თითქმის ანალოგიურია და გამოსავალიც შესაბამისად წინა შემთხვევის მსგავსია.</p>
<p><strong><br />
მარტივი ტესტ კეისი</strong></p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//ფორმის შექმნა</span><br />
<span style="color: #003366; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;form name=&quot;test-form&quot; enctype=&quot;multipart/form-data&quot; action=&quot;/w&quot; method=&quot;post&quot;&gt;&lt;/form&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ფორმის input ელემენტის შექმნა</span><br />
<span style="color: #003366; font-weight: bold;">var</span> input <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
input.<span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'test-field'</span><span style="color: #339933;">;</span><br />
input.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'test field value'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ელემენტის ფორმაში ჩამატება</span><br />
form.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ახალ ელემენტზე მიმართვა</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-form'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-field'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//შედეგი არის რა თქმა უნდა &quot;undefined&quot;</span></div></td></tr></tbody></table></div>
<p>ამ შემთხვევაში ვქმნით ფორმას, ვქმნით ფორმის ელემენტს, ვამატებთ ახალ ელემენტს ფორმაში და შემდგომ უკვე მივმართავთ ამ ელემენტს&#8230; შედეგი არის კვლავ <strong>&#8220;undefined&#8221;</strong>&#8230;</p>
<p><strong><br />
გამოსავალი 1</strong></p>
<p>გამოსავალი ამ შემთხვევაშიც მარტივია, თუმცა IE &#8211; სთვის განკუთვნილი:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">//ფორმის შექმნა</span><br />
<span style="color: #003366; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;form name=&quot;test-form&quot; enctype=&quot;multipart/form-data&quot; action=&quot;/w&quot; method=&quot;post&quot;&gt;&lt;/form&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ფორმის input ელემენტის შექმნა IE - სთვის მისაღები გზით</span><br />
<span style="color: #003366; font-weight: bold;">var</span> input <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;input name=&quot;test-field&quot;/&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
input.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'test field value'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ელემენტის ფორმაში ჩამატება</span><br />
form.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//ახალ ელემენტზე მიმართვა</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-form'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'test-field'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//გამოიბეჭდება ველის value ატრიბუტის მნიშვნელობა</span></div></td></tr></tbody></table></div>
<p>ამ შემთხვევაში ყველაფერი რიგზეა. ელემენტსი შექმნისასა გამოყენებული იქნა ისეთივე კონსტრუქცია როგორც ეს გავაკეთეთ ფორმის შექმნის დროს&#8230; ანუ createElement მეთოდს გადავეცით პარამეტრად არა მხოლოდ ელემენტის სახელი, არამედ შესაბამისი HTML კოდი. ყურადღება მიაქციეთ რომ კოდში მთავარია მითითებული იყოს name ატრიბუტი.</p>
<p><strong><br />
გამოსავალი 2</strong></p>
<p>ცხადია ფორმის მსგავსად, ველისთვისაც არსებობს მეორე გამოსავალი <a href="http://www.code.ge/javascript/elements-innerhtml-property-details">რომლის შესახებაც შეგიძლიათ წაიკითხოთ შესაბამის პოსტში</a> სადაც ეს პრობლემა უფრო ვრცლად არის განხილული, რადგან ამ შემთხვევაში მხოლოდ innerHTML თვისების გამოყენება ვერ გვიშველის და საჭიროა დამატებითი ქმედებები.</p>
<p><strong><br />
დასკვნა</strong></p>
<p>აღწერილი პრობლემა საკმაოდ არასასიამოვნოა, თუმცა გამოსავალი საკმაოდ მარტივია და ადვილად რეალიზებადი. თავის დროზე ამ პრობლემებზე საკმაოდ ბევრი დრო დავხარჯე, თუმცა იმედია ოდნავ მაინც შეგიმსუბუქებთ საქმეს და ეს პოსტი დაგეხმარებათ IE &#8211; სთან ბრძოლაში.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ie67-bug-html-forms-and-elements/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ელემენტის innerHTML თვისების დეტალები</title>
		<link>http://www.code.ge/posts/elements-innerhtml-property-details</link>
		<comments>http://www.code.ge/posts/elements-innerhtml-property-details#comments</comments>
		<pubDate>Fri, 06 Jul 2007 11:06:46 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/elements-innerhtml-property-details</guid>
		<description><![CDATA[innerHTML თვისება ერთერთი გარდაუვალი დეტალია დღევანდელი RIA პროგრამირებისათვის(მცირეოდენი შესავალი შესაძლებელია წაიკითხოთ შესაბამის პოსტში), იგი არის სწრაფი, ეფექტური და რაც მთავარია მისი მხარდაჭერა ყველა ძირითად ბრაუზერს გააჩნია. მიუხედავად ამისა მას გააჩნია გარკვეული ხარვეზები, განსაკუთრებით კი ეს ხარვეზები თვალშისაცემია IE &#8211; ს შემთხვევაში. რაში გამოიხატება ეს ხარვეზები? პირველ რიგში აღსანიშნავია შემდეგი დეტალები: თუ ელემენტის შემადგენლობას შევცვლით არა [...]]]></description>
			<content:encoded><![CDATA[<p>innerHTML თვისება ერთერთი გარდაუვალი დეტალია დღევანდელი RIA პროგრამირებისათვის(<a href="http://www.code.ge/javascript/using-elements-innerhtml-property">მცირეოდენი შესავალი შესაძლებელია წაიკითხოთ შესაბამის პოსტში</a>), იგი არის სწრაფი, ეფექტური და რაც მთავარია მისი მხარდაჭერა ყველა ძირითად ბრაუზერს გააჩნია. მიუხედავად ამისა მას გააჩნია გარკვეული ხარვეზები, განსაკუთრებით კი ეს ხარვეზები თვალშისაცემია IE &#8211; ს შემთხვევაში.<br />
<span id="more-65"></span></p>
<p>რაში გამოიხატება ეს ხარვეზები? პირველ რიგში აღსანიშნავია შემდეგი დეტალები: </p>
<ol>
<li>თუ ელემენტის შემადგენლობას შევცვლით არა DOM მეთოდების მეშვეობით არამედ innerHTML თვისების მეშვეობით ამ შემთხვევაში ირღვევა თვითონ DOM სტრუქტურა.</li>
<li>
თუ გვაქვს form ელემენტი და მის შემადგენლობას შევცვლით აღნიშნული თვისების მეშვეობით(მაგალითად: <strong>document.forms[0].innerHTML = &#8216;&lt;input type=&#8221;text&#8221; name=&#8221;test&#8221;/&gt;&lt;input type=&#8221;submit&#8221; value=&#8221;Submit&#8221;/&gt;&#8217;;</strong>) ასეთი ფორმის სერვერზე გაგზავნის შემთხვევაში აღმოვაჩენთ რომ ფორმაში ახლად დამატებული არცერთი ელემენტის გაგზავნა არ მოხდება.</li>
<li>innerHTML პრობლემატურია IE &#8211; ში, რადგან: ა) თუ ცხრილს არ აქვს განსაზღვრული<br />
<tbody> ელემენტი შეუძლებელია დინამიურად ახალი სტრიქონების დამატება; ბ) innerHTML მაინც არ მუშაობს;</li>
</ol>
<p>რა გამოსავალი არსებობს ჩამოთვლილი პრობლემებიდან? პასუხი ერთადერთია ვიმუშავოთ DOM მეთოდების მეშვეობით, თუმცა ეს ძალიან რუტინული და არასასიამოვნო პროცესია, გარდა ამისა თავად DOM მეთოდებით მუშაობის დროს ასევე ვაწყდებით გარკვეულ ხარვეზებს IE &#8211; ში. თუმცა თავის დროზე ამ საკითხებზე მუშაობის გამო წარმოქმნილი პრობლემების თავიდან ასარიდებლად გარკვეული გამოსავალს მივაგენი რაც ჩემის აზრით სასარგებლო იქნება სხვებისთვისაც:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* @param String identifier of the element<br />
&nbsp;* @param String html code to be inserted into the element<br />
&nbsp;*/</span><br />
<span style="color: #003366; font-weight: bold;">function</span> insertHTML<span style="color: #009900;">&#40;</span>container<span style="color: #339933;">,</span> html<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>&nbsp; <br />
&nbsp; <br />
&nbsp; <span style="color: #006600; font-style: italic;">//კონტეინერი რომელშიც მოხდება html კოდის ჩასმა</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> container <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>container<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #006600; font-style: italic;">//დროებითი კონტეინერი</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> wrapper &nbsp; <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #006600; font-style: italic;">//წავშალოთ ელემენტის შიგნით არსებული ყველა ელემენტი</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>container.<span style="color: #660066;">firstChild</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; container.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>container.<span style="color: #660066;">firstChild</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #006600; font-style: italic;">/*<br />
&nbsp; &nbsp;თუ კონტეინერი ელემენტი არის TBODY საჭიროა დამატებითი მოქმედებების შესრულება <br />
&nbsp; &nbsp;რადგან IE - ში innerHTML არც TBODY ტეგის შემთხვევაში არ მუშაობს<br />
&nbsp; &nbsp;*/</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>container.<span style="color: #660066;">tagName</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'tbody'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; wrapper.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;table&gt;'</span> <span style="color: #339933;">+</span> html <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/table&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> rows <span style="color: #339933;">=</span> wrapper.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> rows.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; container.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>rows<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; rows <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">/*<br />
&nbsp; &nbsp; &nbsp;სხვა დანარჩენ შემთხვევაში შემდეგი კოდი იმუშავებს უპრობლემოდ<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; wrapper.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> html<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>wrapper.<span style="color: #660066;">firstChild</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; container.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>wrapper.<span style="color: #660066;">firstChild</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #006600; font-style: italic;">//მივანიჭოთ null გამოყენებულ ელემენტებს რათა თავიდან ავიცილოთ მეხსიერების გადავსება</span><br />
&nbsp; container <span style="color: #339933;">=</span> wrapper <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ნაჩვენები insertHTML ფუნქცია ღებულობს ორ პარამეტრს: 1) ელემენტი რომელშიც გვინდა ახალი HTML კოდის ჩამატება; 2) თავად HTML კოდი;</p>
<p>როგორ მუშაობს ეს მეთოდი? თუ კოდს დავაკვირდებით დავინახავთ რომ HTML კოდის ჩასმა არ ხდება უშუალოდ სასურველ ელემენტში, ნაცვლად ამისა ვიყენებთ ახალ დროებით ელემენტს სახელად &#8220;wrapper&#8221;. პირველ რიგში სწორედ wrapper ელემენტში ვათავსებთ ახალ HTML კოდს innerHTML თვისების მეშვეობით ხოლო შემდგომ ამ ელემენტის შიგთავსს DOM მეთოდების მეშვეობით ვამატებთ სასურველ ელემენტში (<strong>while(wrapper.firstChild) {</strong> კონსტრუქცია). თუმცა იმ შემთხვევაში კონტეინერი არის TBODY ტიპის ასეთ შემთხვევაში საჭიროა ოდნავ განსხვავებული ქმედება რათა თავიდან ავირიდოთ გაუგებრობები. ნაცვლად პირდაპირ HTML კოდის ჩასმისა wraper &#8211; ში, მას ვფუთავთ &lt;table&gt; ტეგში, ხოლო შემდგომ უკვე ყოველ TR ელემენტს ვამატებთ სასურველ კონტეინერში.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/elements-innerhtml-property-details/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8220;Ajax upload&#8221; &amp; XML response</title>
		<link>http://www.code.ge/posts/ajax-upload-and-xml-response</link>
		<comments>http://www.code.ge/posts/ajax-upload-and-xml-response#comments</comments>
		<pubDate>Tue, 22 May 2007 13:44:48 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/ajax-upload-and-xml-response</guid>
		<description><![CDATA[&#8220;Ajax upload&#8221; ანუ ფაილის ატვირთვა სერვერზე Ajax მიდგომით როგორც ასეთი მითია და სინამდვილეში არავითარი Ajax upload არ არსებობს გამომდინარე იქედან რომ ფაილის ატვირთვა სერვერზე სინამდვილეში არ ხდება XMLHttpRequest(XHR) ობიექტის გამოყენებით(და ეს შეუძლებელია ამ მომენტისათვის), ნაცვლად ამისა ამ ამოცანის გადასაჭრელად გამოიყენება დამალული iframe ელემენტი რაც ქმნის შესაბამის ილუზიას რომ ფაილის ატვირთვა ხდება ე.წ. &#8220;Ajax&#8221; მეთოდით. დღესდღეობით [...]]]></description>
			<content:encoded><![CDATA[<p><strong>&#8220;Ajax upload&#8221;</strong> ანუ ფაილის ატვირთვა სერვერზე Ajax მიდგომით როგორც ასეთი მითია და სინამდვილეში არავითარი <strong>Ajax upload</strong> არ არსებობს გამომდინარე იქედან რომ ფაილის ატვირთვა სერვერზე სინამდვილეში არ ხდება XMLHttpRequest(XHR) ობიექტის გამოყენებით(და ეს შეუძლებელია ამ მომენტისათვის), ნაცვლად ამისა ამ ამოცანის გადასაჭრელად გამოიყენება დამალული <strong>iframe</strong> ელემენტი რაც ქმნის შესაბამის ილუზიას რომ ფაილის ატვირთვა ხდება ე.წ. <strong>&#8220;Ajax&#8221;</strong> მეთოდით.</p>
<p>დღესდღეობით ეს გამოსავალი ერთადერთია და რაც ყველაზე მნიშვნელოვანია იგი მუშაობს და მუშაობს ძალიან კარგად, თუმცა არსებობს ერთი დეტალი რომელიც საკმაოდ პრობლემატურია. პრობლემა მდგომარეობს სერვერიდან დაბრუნებულ პასუხში(response).<br />
<span id="more-61"></span></p>
<p>Ajax აპლიკაციის შექმნის ერთერთი აუცილებელი პირობაა სწორედ XHR ობიექტის გამოყენება. აღნიშნული ობიექტის მუშაობა არაფრით განსხვავდება ბრაუზერის მუშაობისგან, მისი მოვალეობაა სერვერზე მოთხოვნის გაგზავნა და შესაბამისად პასუხის მიღება. სერვერიდან დაბრუნებული პასუხი შეიძლება იყოს სამ ძირითად ფორმატში. ესენია:</p>
<ol>
<li>
<strong>ჩვეულებრივ ტექსტი(plain text):</strong> ძირითადად გამოიყენება შედარებით მარტივ შემთხვევებში და სწრაფი რეზულტატის მისაღწევად;</li>
<li><strong>სწორად ფორმირებული XML დოკუმენტი:</strong> გამოიყენება სერვერიდან კომპლექსური პასუხების დასაბრუნებლად, პასუხი წარმოადგენს XHR ობიექტს responseXML თვისების მნიშვნელობას და იგი არის გამზადებული  DOM ობიექტი რომელთან მუშაობაც თავისუფლად შესაძლებელია JavaScript &#8211; ის  DOM მეთოდების მეშვეობით;</li>
<li><strong>Java Script Object Notation(JSON) ფორმატი:</strong> ასევე გამოიყენება კომპლექსურ შემთხვევებში და ეს ფორმატი წარმოადგენს გამზადებულ JavaScrip ობიექტს;</li>
</ol>
<p>სამივე ჩამოთვლილ ფორმატს გააჩნია თავისი უპირატესობები და უარყოფითი მხარეები. XML  და JSON ფორმატს შორის არჩევანი ალბათ უფრო გემოვნების საკითხია და უმარავი მომხრე და მოწინააღმდეგე ჰყავს ამ ორივე ფორმატს, მე პირადად XML ფორმატის გამოყენების მომხრე ვარ და მიდმივად ამ ფორმატით ვმუშაობ.</p>
<p>რაში გამოიხატება პრობლემა? როდესაც მოთხოვნა/პასუხი მთლიანად მუშავდება XHR ობიექტის გამოყენებით ყველაფერი ბუნებრივად და კარგად მუშაობს თუმცა როდესაც საჭიროა ისეთი HTML ფორმის გამოყენება რომლის მეშვეობითაც უნდა მოხდეს ფაილების ატვირთვა სერვერზე XHR გამოუყენებელი ხდება და იძულებული ვხდებით გამოვიყენოთ iframe ელემენტი. iframe &#8211; ს გამოყენების შემთხვევაში სერვერიდან პასუხი უნდა დაბრუნდეს HTML ფორმატში ნაცვლად ფორმირებული XML დოკუმენტისა, ეს აუცილებელია რადგან წინააღმდეგ შემთხვევაში ვერ შევძლებთ დაბრუნებული პასუხის კონტროლს(მე პირადად სხვა გზას ვერ მივაგენი). ჩამოტვირთული HTML დოკუმენტის გაკონტროლება კი ძალიან მარტივია, თუმცა აქ სხვა პრობლემას ვაწყდებით, კერძოდ კი HTML დოკუმენტში XML დოკუმენტის ჩაშენება არ შეიძლება(IE &#8211; ს გააჩნია მსგავსი შესაძლებლობა ე.წ. XML islands, მაგრამ სხვა ბრაუზერებში მსგავსი რამ არ მუშაობს). ერთადერთი გამოსავალია რომ სერვერიდან HTML &#8211; სთან ერთად დავაბრუნოთ XML დოკუმენტი მხოლოდ სტრიქონის სახით.</p>
<p><strong><br />
სტრიქონიდან XML დოკუმენტის მიღება</strong></p>
<p>დავუშვათ XHR ობიექტის გამოყენების შემთხვევაში პასუხი  სერვერიდან ბრუნდება მსგავსი XML დოკუმენტის სახით:</p>
<pre>
&lt;response&gt;
    &lt;item&gt;&lt;![CDATA[This Is data]]&gt;&lt;/item&gt;
&lt;/response&gt;
</pre>
<p>ასეთ შემთხვევაში დაბრუნებული პასუხი გამზადებულ DOM ობიექტია და მასთან მუშაობა პირდაპირ შესაძლებელია შესაბამისი მეთოდების გამოყენებით. ხოლო iframe &#8211; ს გამოყენების შემთხვევაში სერვერიდან იგივე XML დოკუმენტის დაბრუნება გვიწევს შემდეგი სახით:</p>
<div class="codecolorer-container html4strict blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/html.html"><span style="color: #000000; font-weight: bold;">html</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/head.html"><span style="color: #000000; font-weight: bold;">head</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/head.html"><span style="color: #000000; font-weight: bold;">head</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/body.html"><span style="color: #000000; font-weight: bold;">body</span></a>&gt;</span>&nbsp; <br />
&nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;response&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #ddbb00;">&amp;lt;</span>response<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>item<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>![CDATA[This Is data]]<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>/item<span style="color: #ddbb00;">&amp;gt;&amp;lt;</span>/response<span style="color: #ddbb00;">&amp;gt;</span><br />
&nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/body.html"><span style="color: #000000; font-weight: bold;">body</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/html.html"><span style="color: #000000; font-weight: bold;">html</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>ეს არის ჩვეულებრივი HTML დოკუმენტი რომელსაც გააჩნია ერთი div ელემენტი იდენტიფიკატორით response. სწორედ მასშია მოთავსებული XML დოკუმენტი, თუმცა განსხვავებით ზემოთ ნაჩვენები XML დოკუმენტისგან მასში არსებული ტეგის გამხსნელი &lt; და დამხური &gt; სიმბოლოები გარდაქმნიალია შესაბამის &amp;lt; და &amp;gt; სიმბოლოებში რათა თავიდან ავიცილოთ გაუგებრობები.</p>
<p>ამ სტრიქონის წაკითხვა და გარდაქმნა შესაბამისად XML დოკუმენტში შესაძლებელია შემდეგი JavaScript &#8211; ის მეშვეობით:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/*<br />
&nbsp;*put this code after &quot;response&quot; div<br />
&nbsp;*/</span><br />
<br />
<span style="color: #006600; font-style: italic;">//dom object</span><br />
<span style="color: #003366; font-weight: bold;">var</span> dom <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//retrive string from &quot;response&quot; element</span><br />
<span style="color: #003366; font-weight: bold;">var</span> content <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'response'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//replace &amp;lt; and &amp;gt; back to &nbsp;&lt;&gt; symbols</span><br />
content <span style="color: #339933;">=</span> content.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/&amp;lt;/gi</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'&lt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
content <span style="color: #339933;">=</span> content.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/&amp;gt;/gi</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//if current browser is IE ( :D )</span><br />
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">ActiveXObject</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; dom <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ActiveXObject<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Microsoft.XMLDOM&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; dom.<span style="color: #660066;">async</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; dom.<span style="color: #660066;">loadXML</span><span style="color: #009900;">&#40;</span>content<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//all other browsers</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> parser <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> DOMParser<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; dom <span style="color: #339933;">=</span> parser.<span style="color: #660066;">parseFromString</span><span style="color: #009900;">&#40;</span>content<span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;text/xml&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//read document element into response variable</span><br />
<span style="color: #003366; font-weight: bold;">var</span> response <span style="color: #339933;">=</span> dom.<span style="color: #660066;">documentElement</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">//retrive first element from document and alert it's tag name</span><br />
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>response.<span style="color: #660066;">firstChild</span>.<span style="color: #660066;">tagName</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>ამ ჯავასკრიპტ კოდის ჩასმა(და დაბრუნება) შესაძლებელია ზემოთ ნაჩვნებ HTML დოკუმენტთან ერთად&#8230; მისი მუშაობის დეტალები მითითებულია კოდის კომენტარებში.</p>
<p>ეს მიდგომა კრიტიკულად მნიშვნელოვანია ისეთ შემთხვევებში როდესაც საჭიროა სერვერიდან მიღებული პასუხის დამუშავება ერთი სტანდარტული გზით, და იგი თავიდან გვაცილებს ყოველი ცალკეული შემთხვევებისათვის ახალი ე.წ. Response Processor &#8211; ების წერის აუცილებლობას.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ajax-upload-and-xml-response/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>მარტივი XPath რეალიზაცია JavaScript &#8211; ში</title>
		<link>http://www.code.ge/posts/simple-xpath-implementation-in-javascript</link>
		<comments>http://www.code.ge/posts/simple-xpath-implementation-in-javascript#comments</comments>
		<pubDate>Mon, 14 May 2007 08:49:33 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JavaScript DOM]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://www.code.ge/javascript/simple-xpath-implementation-in-javascript</guid>
		<description><![CDATA[ვებ დოკუმენტის (ან მისი რომელიმე ნაწილის) კლიენტის მხარეს დამუშავებისას გარდაუვალია დოკუმენტის ელემენტებთან მუშაობა. დღესდღეობით დოკუმენტის ელემენტებთან მუშაობის ორი ყველაზე გავცელებული ე.წ. DOM ფუნქცია არსებობს ერთი ესენია: 1) document ობიექტის getElementById(&#8220;element-id&#8221;) მეთოდი რომელიც აბრუნებს ელემენტს მითითებული უნიკალური იდენტიფიკატორით (ელემენტის id ატრიბუტის მნიშვნელობა); 2) ელემენტის getElementsByTagName(&#8220;tagname&#8221;) მეთოდი რომელიც აბრუნებს ელემენტის ქვემდგომ იერარქიაში არსებულ ყველა &#8220;tagname&#8221; პარამეტრის შესაბამის [...]]]></description>
			<content:encoded><![CDATA[<p>ვებ დოკუმენტის (ან მისი რომელიმე ნაწილის) კლიენტის მხარეს დამუშავებისას გარდაუვალია დოკუმენტის ელემენტებთან მუშაობა. დღესდღეობით დოკუმენტის ელემენტებთან მუშაობის ორი ყველაზე გავცელებული ე.წ. DOM ფუნქცია არსებობს ერთი ესენია: 1) document ობიექტის getElementById(&#8220;element-id&#8221;) მეთოდი რომელიც აბრუნებს ელემენტს მითითებული უნიკალური იდენტიფიკატორით (ელემენტის id ატრიბუტის მნიშვნელობა); 2) ელემენტის getElementsByTagName(&#8220;tagname&#8221;) მეთოდი რომელიც აბრუნებს ელემენტის ქვემდგომ იერარქიაში არსებულ ყველა &#8220;tagname&#8221; პარამეტრის შესაბამის ელემენტს.</p>
<p>აღნიშნული ორი მეთოდი საკმაოდ ეფექტურად მუშაობს მარტივ შემთხვევებში თუმცა არსებობს რამდენიმე უარყოფითი დეტალიც:</p>
<ol>
<li>შეუძლებელია (და არც არის სასურველი. იხ. <a href="http://www.code.ge/css/minimizing-css-selectors">CSS სელექტორების მინიმიზაცია</a>) რომ დოკუმენტში ყველა ელემენტს გააჩნდეს უნიკალური იდენტიფიკატორი;</li>
<li>გამომდინარე პირველი მიზეზიდან ყოველთვის როდესაც კი დაგვჭირდება ელემენტის ქვეშ მყოფი რომელიმე ელემენტის მოპოვება მისი ტეგის დასახელების მიხედვით გვიწევს უამრავი არასაჭირო იტერაციის განხორციელება;</li>
</ol>
<p><span id="more-60"></span></p>
<p>მსგავსი ტიპის ამოცანების უფრო მოქნილი ხერხებით გადასაჭრელად არსებობს სპეციალური ენა სახელად <strong>XPath</strong>. თავისთავად ამ ენის დანიშნულება მდგომარეობს იმაში რომ მარტივად მოვიპოვოთ ინფორმაცია XML დოკუმენტში არსებული რომელიმე ელემენტის შესახებ.</p>
<p>არსებობს თუ არა XPath &#8211; ის მხარდაჭერა თანამედროვე ბრაუზერებში? დიახ არსებობს&#8230; თუმცა თავსებადობა სხვადასხვა რეალიზაციებს შორის საკმაოდ უხარისხოა.</p>
<p>არსებობს თუ არა რაიმე მზა ბიბლიოთეკები რომლებიც თავიდან აგვარიდებს არსებულ არათავსებადობის პრობლემებს? დიახ არსებობს&#8230; მაგრამ რამდენად საჭიროა ყოველი ამოცანისათვის მსგავსი ბიბლიოთეკების გამოყენება? პირადად ჩემის აზრით ამის არანაირი აუცილებლობა არ არსებობს&#8230; ხშირ შემთხვევაში საკმაოდ მარტივი გამოსავალიც საკმარისია მიზნის მისაღწევად.</p>
<p>მაგალითად შემდეგი XML დოკუმენტიდან თუ გვსურს ამოვიღოთ &#8220;Ann Smith&#8221; &#8211; ის შესაბამისი sex ელემენტი, XPath გამოსახულებას ექნება ასეთი სახე: &#8220;/persons/person[1]/name&#8221; (person[1] &#8211; აქ იგულისხმება მეორე person ელემენტი რადგან ელემენტების ინდექსაცია იწყება 0 &#8211; იდან):</p>
<pre>
&lt;persons&gt;
  &lt;person&gt;
     &lt;name&gt;John Doe&lt;/name&gt;
     &lt;sex&gt;M&lt;/sex&gt;
  &lt;/person&gt;
  &lt;person&gt;
     &lt;name&gt;Ann Smith&lt;/name&gt;
     &lt;sex&gt;F&lt;/sex&gt;
  &lt;/person&gt;
&lt;/persons&gt;
</pre>
<p>ამ მარტივი მაგალითიდან კარგად ჩანს თუ რამდენად მარტივია დოკუმენტთან მუშაობა XPath &#8211; ის მეშვეობით და რამდენი არასაჭირო კოდის დაწერა დაგვჭირდებოდა იგივე შედეგის მისაღწევად JavaScript &#8211; ის სტანდარტული DOM მეთოდების გამოყენებით.</p>
<p>როგორ მივაღწიოთ იგივე შედეგს JavaScript &#8211; ით? რადგან ლაპარაკი გვაქვს მარტივ რეალიზაციაზე ჩემს შემთხვევაში საყრდენ წერტილად ავიღე ელემენტის უნიკალური იდენტიფიკატორი,  ასეთი ელემენტი აუცილებლად საჭიროა რადგან უმეტეს შემთხვევაში სწორედ კონკრეტული ელემენტის ქვეელემენტებთან მოგვიწევს მუშაობა.</p>
<p>მაგალითად თუ გვაქვს მსგავსი (X)HTML კოდი:</p>
<div class="codecolorer-container html4strict blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;test-id&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Menu Item One<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Menu Item Two<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Menu Item Three<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Sub Menu Item One<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Sub Menu Item Two<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span>Sub Menu Item Three<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/li.html"><span style="color: #000000; font-weight: bold;">li</span></a>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/ul.html"><span style="color: #000000; font-weight: bold;">ul</span></a>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/div.html"><span style="color: #000000; font-weight: bold;">div</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>და გვსურს რომ ამოვიღოთ ქვემენიუს &#8220;Sub Menu Item Two&#8221; ელემენტი გამოსახულებას ექნება ასეთი სახე: &#8220;#test-id/ul/li[2]/ul/li[1]&#8220;; გამოსახულება თავსითავად მარტივია თუმცა ზოგიერთ დეტალზე ღირს ყურადღების მიქცევა:</p>
<ol>
<li>თუ გვსურს რომ მეთოდმა გადაცემული სტრიქონი მიიღოს XPath გამოსახულებად იგი აუცილებლად უნდა იწყებოდეს # სიმბოლოთო და კონკრეტული ელემენტის უნიკალური იდენტიფიკატორით (მაგ. #test-id);</li>
<li>ქველემენტების მიმართვა ხდება შემდეგნრაირად: /ul (სლეში და ელემენტის ტეგის სახელი) და იგულისხმება პირველივე მითითებული ტიპის ტეგი;</li>
<li>კონკრეტული ქველემენტის ამოღება ინდექსით განისაზღვრება შემდეგნაირად: li[2] (ელემენტის დასახელება და შესაბამისი ინდექსი, ამ შემთხვევაში იგულისხმება მესამე li ელემენტი);</li>
</ol>
<p>თავისთავად ფუნქციის გამოიყურება შემდეგნაირად იგი პარამეტრად ღებულობს სტრიქონს, რომელიც არის ან უბრალოდ ელემენტის უნიკალური იდენტიფიკატორი ან XPath &#8211; ის მსგავსი გამოსახულება:</p>
<div class="codecolorer-container javascript blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> Util <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; dom<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; get<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>expression<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">//check if passed argument is XPath like expression</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>str.<span style="color: #660066;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'#'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; expression <span style="color: #339933;">=</span> expression.<span style="color: #660066;">substr</span><span style="color: #009900;">&#40;</span>1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> tokens &nbsp;<span style="color: #339933;">=</span> expression.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> id &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=</span> tokens.<span style="color: #660066;">shift</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;<