<?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; IE Sucks</title>
	<atom:link href="http://www.code.ge/posts/tag/iesucks/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>Google Chrome Frame</title>
		<link>http://www.code.ge/posts/google-chrome-frame</link>
		<comments>http://www.code.ge/posts/google-chrome-frame#comments</comments>
		<pubDate>Fri, 25 Sep 2009 09:41:03 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[IE Sucks]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=374</guid>
		<description><![CDATA[რამდენიმე დღის წინ Google &#8211; მ გაახმაურა თავისი ახალი პროექტი სახელად Google Chrome Frame. ეს არის პლაგინი InternetExplorer &#8211; ისთვის რომელის ინსტალაციის შემდეგაც საიტები თუ მათ გააჩნიათ შესაბამისი META ტეგი, ჩაიტვირთებიან არა IE &#8211; ს ძრავის არამედ Google Chrome &#8211; ს ძრავის მეშვეობით. ეს ნიშნავს იმას რომ ყოველგვარი არათავსებადობის პრობლემა(რომელსაც 99% შემთხვევებში იწვევს IE) საერთოდ [...]]]></description>
			<content:encoded><![CDATA[<p>რამდენიმე დღის წინ Google &#8211; მ გაახმაურა თავისი ახალი პროექტი სახელად <a href="http://code.google.com/intl/ka-GE/chrome/chromeframe/">Google Chrome Frame</a>. ეს არის პლაგინი InternetExplorer &#8211; ისთვის რომელის ინსტალაციის შემდეგაც საიტები თუ მათ გააჩნიათ შესაბამისი META ტეგი, ჩაიტვირთებიან არა IE &#8211; ს ძრავის არამედ Google Chrome &#8211; ს ძრავის მეშვეობით. ეს ნიშნავს იმას რომ ყოველგვარი არათავსებადობის პრობლემა(რომელსაც 99% შემთხვევებში იწვევს IE) საერთოდ აღარ შეაწუხებს მომხმარებელს. როგორც აღმოჩნდა გუგლის ეს ნაბიჯი განპირობებული იყო მისი ახალი პროდუქტის &#8211; Google Wave გამო რომელიც ხელმისაწვდომი მომავალი კვირიდან გახდება. საინტერესო არის ის, რომ, გუგლმა IE &#8211; ს ყველა ვერსიის მხარდაჭერაზე განაცხადა უარი რადგანც ამ ბრაუზერებს არ აქვთ JavaScript &#8211; ისა და HTML5 &#8211; ის ახალი შესაძლებლობების მხარდაჭერა.</p>
<p><a href="http://www.code.ge/wp-content/uploads/cf-in-ie.png"><img src="http://www.code.ge/wp-content/uploads/cf-in-ie-300x234.png" alt="cf-in-ie" title="cf-in-ie" width="300" height="234" class="aligncenter size-medium wp-image-373" /></a></p>
<p>მაგრამ Wave &#8211; ს გამო შექმნილი პლაგინის გაოყენებაში არანაირად არ ვართ შეზღუდული და იგი შეგვიძლია გამოვიყენოთ ნებისმიერი ვებ საიტისთვის, რისი მაგალითიც არის ჩემი ბლოგი <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  თუ ამ გვერდს გახსნით IE6 &#8211; ის მეშვეობით მაშინათვე დაინახავთ Google Chrome Frame &#8211; ს ინსტალაციის შემოთავაზებას და იმ შემთხვევაში თუ დააინსტალირებთ პლაგინს თქვენს კომპზე არსებული IE6, IE7 და IE8 ავტომატურად იმუშავებს Chrome Frame რეჟიმში <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ტექნიკურად ეს საკითხე გვარდება ძალიან მარტივად. პირველ რიგში საიტის HEAD სექციაში უნდა დავამატოთ შემდეგი META ტეგი:</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 /></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/meta.html"><span style="color: #000000; font-weight: bold;">meta</span></a> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;X-UA-Compatible&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;chrome=1&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></div></td></tr></tbody></table></div>
<p>თუ Google Chrome პლაგინი უკვე დაინსტალირებული აქვს მომხმარებელს ყველა ვერსიის IE იმუშავებს Google Chrome &#8211; ს ძრავით ისე რომ ამის შესახებ მომხმარებელს არაფერი ეცოდინება.<span id="more-374"></span></p>
<p>იმისათვის რომ მომხმარებელს შევთავაზოთ პლაგინის ინსტალაცია, ასევე საჭიროა ვებ გვერდში შემდეგი კოდის ჩასმა(გაუგებრობების თავიდან ასარიდებლად BODY ტეგის დახურვამდე):</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 /></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/script.html"><span style="color: #000000; font-weight: bold;">script</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> </span><br />
<span style="color: #009900;"><span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/script.html"><span style="color: #000000; font-weight: bold;">script</span></a>&gt;</span><br />
&nbsp;<br />
<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;placeholder&quot;</span>&gt;&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 />
<br />
<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/script.html"><span style="color: #000000; font-weight: bold;">script</span></a> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span><br />
&nbsp;CFInstall.check({<br />
&nbsp; &nbsp; node: &quot;placeholder&quot;,<br />
&nbsp; &nbsp; destination: &quot;http://www.waikiki.com&quot;<br />
&nbsp; });<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><a href="http://december.com/html/4/element/script.html"><span style="color: #000000; font-weight: bold;">script</span></a>&gt;</span></div></td></tr></tbody></table></div>
<p>ეს სკრიპტი შეამოწმებს აქვს თუ არა მომხმარებელს დაინსტალირებული ნახსენები პლაგინი, და თუ არა მაშინ შესაბამისი შეტყობინება შესთავაზებს მომხმარებელს მის ინსტალაციას. </p>
<p>შედეგი? შედეგი კი ძალიან საინტერესოა. რა თქმა უნდა ვერ შევიკავე თავი და გავტესტე პლაგინი ჩემს ბლოგზე და შედეგიც სახეზეა:</p>
<p><a href="http://www.code.ge/wp-content/uploads/Picture-6.png"><img src="http://www.code.ge/wp-content/uploads/Picture-6-300x240.png" alt="Picture 6" title="Picture 6" width="300" height="240" class="aligncenter size-medium wp-image-370" /></a><br />
<a href="http://www.code.ge/wp-content/uploads/Picture-7.png"><img src="http://www.code.ge/wp-content/uploads/Picture-7-300x240.png" alt="Picture 7" title="Picture 7" width="300" height="240" class="aligncenter size-medium wp-image-371" /></a><br />
<a href="http://www.code.ge/wp-content/uploads/Picture-8.png"><img src="http://www.code.ge/wp-content/uploads/Picture-8-300x240.png" alt="Picture 8" title="Picture 8" width="300" height="240" class="aligncenter size-medium wp-image-372" /></a><br />
<a href="http://www.code.ge/wp-content/uploads/Picture-9.png"><img src="http://www.code.ge/wp-content/uploads/Picture-9-300x240.png" alt="Picture 9" title="Picture 9" width="300" height="240" class="aligncenter size-medium wp-image-368" /></a></p>
<p>თუ გახსნით ბოლო სურათს, დაინახავთ რომ ბლოგის მარჯვენა სვეტში განთავსებულ პროექტების ბანერებს მომრგვალებული კუთხეები აქვთ, ეს მომრგვალება გაკეთებულია CSS &#8211; ის <strong>border-radius</strong> თვისების მეშვეობით რომლის მსგავსიც არცერთ IE &#8211; ს არ გააჩნია <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </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/google-chrome-frame/feed</wfw:commentRss>
		<slash:comments>10</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>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>IE8 &#8211; ფინალური ვერსია გამოვიდა</title>
		<link>http://www.code.ge/posts/ie8-%e1%83%a4%e1%83%98%e1%83%9c%e1%83%90%e1%83%9a%e1%83%a3%e1%83%a0%e1%83%98-%e1%83%95%e1%83%94%e1%83%a0%e1%83%a1%e1%83%98%e1%83%90-%e1%83%92%e1%83%90%e1%83%9b%e1%83%9d%e1%83%95%e1%83%98%e1%83%93</link>
		<comments>http://www.code.ge/posts/ie8-%e1%83%a4%e1%83%98%e1%83%9c%e1%83%90%e1%83%9a%e1%83%a3%e1%83%a0%e1%83%98-%e1%83%95%e1%83%94%e1%83%a0%e1%83%a1%e1%83%98%e1%83%90-%e1%83%92%e1%83%90%e1%83%9b%e1%83%9d%e1%83%95%e1%83%98%e1%83%93#comments</comments>
		<pubDate>Thu, 19 Mar 2009 18:14:12 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>

		<guid isPermaLink="false">http://www.code.ge/?p=207</guid>
		<description><![CDATA[როგორც იქნა გვეღირსა და გამოვიდა IE8 &#8211; ს ფინალური ვერსია. მიუხედავად იმისა რომ ბრაუზერების ვენდორებმა ძალიან გაგვანებივრეს ბოლო თვეების მანძილზე, ეს ინფორმაცია გაცილებით სასიხარულო და მნიშნველოვანი იყო ჩემთვის. რატომ? იმიტომ რომ დღესდღეობით IE6 და IE7 ორი გამორჩეულად ჩამორჩენილი ბრაუზერია რომლებსაც ბაზრის 67% უკავიათ ჯამში. იმედი მაქვს რომ IE8 რომელიც გაცილებით განვითარებულია მის ორ წინამორბედზე თუნდაც [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.microsoft.com/library/media/1033/windows/images/internet-explorer/default/ie8_logo.gif" alt="IE8" style="float: left; margin: 0 8px 8px 0;"/> როგორც იქნა გვეღირსა და გამოვიდა IE8 &#8211; ს ფინალური ვერსია.</p>
<p>მიუხედავად იმისა რომ ბრაუზერების ვენდორებმა ძალიან გაგვანებივრეს ბოლო თვეების მანძილზე, ეს ინფორმაცია გაცილებით სასიხარულო და მნიშნველოვანი იყო ჩემთვის. რატომ? იმიტომ რომ დღესდღეობით IE6 და IE7 ორი გამორჩეულად ჩამორჩენილი ბრაუზერია რომლებსაც ბაზრის 67% უკავიათ ჯამში. იმედი მაქვს რომ IE8 რომელიც გაცილებით განვითარებულია მის ორ წინამორბედზე თუნდაც IE6 &#8211; ის სიკვდილს შეუწყობს ხელს. საბოლოო მომხმარებლისთვის შესაძლებელია ამას არსებითი მნიშნველობა არ აქვს, მაგრამ ჩემთვის(და არა მარტო) როგორც პროფესიონალისთვის ეს ძალიან ძალიან ძალიან მნიშვნელოვანია <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>მაშ ასე <a href="http://www.microsoft.com/windows/internet-explorer/default.aspx">გადმოწერეთ</a> და გაავრცელეთ რაც შეიძლება ჩქარა აიძულეთ ყველა IE &#8211; ს მომხმარებელს რომ ეს განახლება რაც შეიძლება სწრაფად გააკეთოს, ამითი ყველა დავაჩქარებთ IE6 &#8211; ის საბოლოო გარდაცვალების პროცესს <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/ie8-%e1%83%a4%e1%83%98%e1%83%9c%e1%83%90%e1%83%9a%e1%83%a3%e1%83%a0%e1%83%98-%e1%83%95%e1%83%94%e1%83%a0%e1%83%a1%e1%83%98%e1%83%90-%e1%83%92%e1%83%90%e1%83%9b%e1%83%9d%e1%83%95%e1%83%98%e1%83%93/feed</wfw:commentRss>
		<slash:comments>9</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>IE8 Beta: M$ &#8211; ის ნაბიჯი წინ!</title>
		<link>http://www.code.ge/posts/ie8-beta-m-%e1%83%98%e1%83%a1-%e1%83%9c%e1%83%90%e1%83%91%e1%83%98%e1%83%af%e1%83%98-%e1%83%ac%e1%83%98%e1%83%9c</link>
		<comments>http://www.code.ge/posts/ie8-beta-m-%e1%83%98%e1%83%a1-%e1%83%9c%e1%83%90%e1%83%91%e1%83%98%e1%83%af%e1%83%98-%e1%83%ac%e1%83%98%e1%83%9c#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:29:47 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.code.ge/iesucks/ie8-beta-m-%e1%83%98%e1%83%a1-%e1%83%9c%e1%83%90%e1%83%91%e1%83%98%e1%83%af%e1%83%98-%e1%83%ac%e1%83%98%e1%83%9c</guid>
		<description><![CDATA[გუშინ ჩემთვის ცნობილი გახდა რომ M$ &#8211; მა გამოუშვა IE8 Beta ვერსია, რომლის გადმოწერა შესაძლებელია ამ მისამართიდან. სიმართლე ითქვას ძალიან გამეხარდა, მიუხედავად იმისა რომ დღესდღეობით არსებულ ბრაუზერებს შორის დომინირებენ IE6(სრული საძაგლობა) და IE7(შედარებით ნაკლები საძაგლობა), და მათ აღმოფხვრას წლები დასჭირდება მაინც ძალიან სასიხარულოა M$ &#8211; ის ასეთი პროგრესული ნაბიჯი. მითითებულ ბმულებზე შეგიძლიათ ნახოთ თუ რა [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://www.code.ge/wp-content/uploads/2008/03/images_ie8betalogo.gif' title='images_ie8betalogo.gif'><img src='http://www.code.ge/wp-content/uploads/2008/03/images_ie8betalogo.gif' alt='images_ie8betalogo.gif' border="0"/></a></p>
<p><a href="http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/DevelopersNew.htm">გუშინ ჩემთვის ცნობილი გახდა რომ M$ &#8211; მა გამოუშვა IE8 Beta ვერსია</a>, რომლის გადმოწერა შესაძლებელია <a href="http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/Install.htm">ამ მისამართიდან</a>. </p>
<p>სიმართლე ითქვას ძალიან გამეხარდა, მიუხედავად იმისა რომ დღესდღეობით არსებულ ბრაუზერებს შორის დომინირებენ IE6(სრული საძაგლობა) და IE7(შედარებით ნაკლები საძაგლობა), და მათ აღმოფხვრას წლები დასჭირდება მაინც ძალიან სასიხარულოა M$ &#8211; ის ასეთი პროგრესული ნაბიჯი.</p>
<p>მითითებულ ბმულებზე შეგიძლიათ ნახოთ თუ რა განახლებებია ამ ბრაუზერში, თუმცა გირჩევთ John Resig &#8211; ის <a href="http://ejohn.org/blog/javascript-in-internet-explorer-8/">დეტაულური მიმოხილვის წაკითხვას</a>. <span id="more-108"></span></p>
<p>ამ ვერსიას აქვს ბევრი გაუმჯობესება და ახალი შესაძლებლობები, მათ შორის ძალიან სასიამოვნო და საინტერესო <a href="http://www.w3.org/TR/selectors-api/">W3C &#8211; ს querySelector რეალიზაცია</a>, რომელიც ამასწინად WebKit &#8211; ის ერთერთ ბოლო რელიზში გამოჩნდა პირველად.</p>
<p>ციტატა რესიგის პოსტიდან:</p>
<blockquote><p>W3C: querySelector</p>
<p>A super-fast way of finding elements based upon a CSS selector. The second browser to implement the selectors API has hit the market (behind a WebKit nightly release).</p>
<p>It&#8217;s important to realize that any selectors here are completely reliant upon the browser&#8217;s native selector implementation. IE8 is only shooting for CSS 2.1 support &#8211; which means that you really shouldn&#8217;t be holding your breath for CSS 3 selectors. As I mentioned previously these blackbox APIs are going to be a source of never-ending hair-pulling and struggle going into the future. </p></blockquote>
<p>მიუხედავად იმისა რომ ჯერჯერობით ამ ვერსიას ბევრი ნაკლი აქვს, ეს არის ძალიან პროგრესული რელიზი!</p>
<p>მაგალითად ამ რელიზში არ არის ჩადებული W3C მოდელის ივენთების მენეჯმენტის რეალიზცია(<a href="http://www.code.ge/javascript/ie-vs-w3c-event-handling">რაზეც ჩემს მიერ წინა პოსტში მქონდა საუბარი</a>):</p>
<p>ციტატა რესიგის პოსტიდან:</p>
<blockquote><p>W3C: Events</p>
<p>This is one area that is completely absent from this beta. We are still stuck with IE&#8217;s attachEvent system &#8211; no addEventListener in sight. I don&#8217;t know how serious they are about supporting Acid3 but it includes a test for addEventListener so they may want to consider it extra strongly.</p>
<p>I can partially understand their desire to keep their existing API but I don&#8217;t understand why they have no interest in, also, adding addEventListener, etc. to complement what&#8217;s there. I assume it&#8217;s because they would now have to support concepts like event capturing.</p>
<p>I&#8217;m really disappointed with this. This should&#8217;ve been a top priority fix before implementing new psuedo-XHR systems like XDomainRequest.</p></blockquote>
<p>თუმცა ასეთი ნაკლოვანებების მიუხედავად, თუ M$ &#8211; მა ამ ტემპით განაგრძო თავისი ბრაუზერის დახვეწა, ეჭვგარეშეა რომ იგი აუცილებლად მოიპოვებს მსოფლიოს ერთერთი საუკეთესო ბრაუზერის სტატუსს.</p>
<p>აღსანიშნავია ასევე ე.წ. Developer Tools &#8211; ების პროგრესიც, M$ &#8211; მა ყველა დეველოპერისათვის კარგად ნაცნობი FireBug &#8211; ის ზუსტი კლონიც შემოგვთავაზა <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ეს ინსტრუმენტი ნამდვილად აკლდა IE &#8211; ს რაც კიდევ უფრო მეტად ართულებდა პროგრამირების პროცესს ამ აბსოლუტურად განსხვავებული ბრაუზერისათვის.</p>
<p>P.S.<br />
თუ ვინმე დააინსტალირებთ და გატესტავთ იმედია კომენტარებს მომწერთ აქ <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/ie8-beta-m-%e1%83%98%e1%83%a1-%e1%83%9c%e1%83%90%e1%83%91%e1%83%98%e1%83%af%e1%83%98-%e1%83%ac%e1%83%98%e1%83%9c/feed</wfw:commentRss>
		<slash:comments>8</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>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>IE6/7 bug: img ელემენტის რენდერინგის ბაგი</title>
		<link>http://www.code.ge/posts/ie67-img-rendering-bug</link>
		<comments>http://www.code.ge/posts/ie67-img-rendering-bug#comments</comments>
		<pubDate>Wed, 03 Oct 2007 08:49:22 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[IE Sucks]]></category>

		<guid isPermaLink="false">http://www.code.ge/css/ie67-img-rendering-bug</guid>
		<description><![CDATA[ამ პოსტის დაწერა ფორუმის ამ პოსტმა გადამაწყვეტინა(ანუ პოსტი არის inspired by Rocko ) , რადგან არ მინდა ეს საკითხი მილიონობით ფორუმის პოსტში დაიკარგოს. ეს არის მარტივი თუმცა სასარგებლო გამოსავალი IE &#8211; სთვის დამახასიათებელი პრობლემისგან. თავისთავად პრობლემის არსი ძალიან მარტივია, ეს არის IE &#8211; ს რენდერინგის მორიგი ბაგი რომელიც გხვდება კონკრეტულად img ტეგთან მუშაობის დროს. თუ [...]]]></description>
			<content:encoded><![CDATA[<p>ამ პოსტის დაწერა ფორუმის <a href="http://forum.ge/?showtopic=33772196&#038;view=findpost&#038;p=6810417">ამ პოსტმა</a> გადამაწყვეტინა(ანუ პოსტი არის inspired by <a href="http://www.rocko.ge">Rocko</a> <img src='http://www.code.ge/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ) , რადგან არ მინდა ეს საკითხი მილიონობით ფორუმის პოსტში დაიკარგოს. ეს არის მარტივი თუმცა სასარგებლო გამოსავალი IE &#8211; სთვის დამახასიათებელი პრობლემისგან. </p>
<p>თავისთავად პრობლემის არსი ძალიან მარტივია, ეს არის IE &#8211; ს რენდერინგის მორიგი ბაგი რომელიც გხვდება კონკრეტულად img ტეგთან მუშაობის დროს. თუ img ელემენტს განვათავსებთ div ან td ტეგში მას ქვედა მხარეს უჩნდება პატარა სივრცე, თუ სურათის კონტეინერს აქვს მითითებული ფონის ფერი მაშინ ეს ხარვეზი ბევრად უფრო თვალსაჩინო ხდება.<span id="more-73"></span></p>
<p>მაგალითი:</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 /></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;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;width:200px; background-color:green;&quot;</span>&gt;</span><br />
&nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">img</span></a> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;img/image.gif&quot;</span> <span style="color: #000066;">alt</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">/</span>&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>თუ ამ კოდს ვნახავთ IE &#8211; ში დავინახავთ რომ სურათის ქვეშ არის გარკვეული სივრცე.</p>
<p>სურათი 1:<br />
<a href='http://www.code.ge/wp-content/uploads/2007/10/img-bottom-space.gif' title='img-bottom-space.gif'><img src='http://www.code.ge/wp-content/uploads/2007/10/img-bottom-space.gif' alt='img-bottom-space.gif' /></a></p>
<p>თუმცა გამოსავალი ამ პრობლემიდან არსებობს.</p>
<p>გამოსავალი 1:</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 /></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;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;width:200px; background-color:green;&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">img</span></a> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;img/image.gif&quot;</span> <span style="color: #000066;">alt</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">/</span>&gt;&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>ამ შემთხვევაში პრობლემა იხსნება თუ კოდს დავწერთ ერთ სტრიქონზე&#8230; მაგრამ თავისთავად ცხადია რომ ეს არ არის გამოსავალი&#8230; </p>
<p>ნაცვლად ამისა შეგვიძლია პრობლემა გადავჭრათ img ელემენტის css &#8211; ით დამუშავებით თუ მას მივუთითებთ <strong>display: block;</strong></p>
<p>გამოსავალი 2:</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 /></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;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;width:200px; background-color:green;&quot;</span>&gt;</span><br />
&nbsp;<span style="color: #009900;">&lt;<a href="http://december.com/html/4/element/img.html"><span style="color: #000000; font-weight: bold;">img</span></a> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;img/image.gif&quot;</span> <span style="color: #000066;">alt</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;display: block&quot;</span><span style="color: #66cc66;">/</span>&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>სურათი 2:<br />
<a href='http://www.code.ge/wp-content/uploads/2007/10/img-no-space.gif' title='img-no-space.gif'><img src='http://www.code.ge/wp-content/uploads/2007/10/img-no-space.gif' alt='img-no-space.gif' /></a></p>
<p>რაში მდგომარეობს პრობლემა? პრობლემა არის ის რომ img ელემენტის <strong>ნაგულისხმევი მნიშვნელობა display თვისებისათვის არის inline </strong>რის გამოც IE ამ ელემენტს აღიქვავს როგორც ტექსტს. ხოლო ელემენტს ქვედა მხრიდან სივრცეს უკეთებს იმის გამო რომ ეს სივრცე საჭიროა ისეთი ტიპის სიმბოლოებისათვის როგორიცაა: y, p, g…</p>
<p>გამომდინარე აქედან ელემენტისათვის <strong>display: block;</strong> &#8211; ის მითითების შემთხვევაში IE არ დაამუშავებს მას როგორც ტექსტს და თავისთავად სივრცის პრობლემაც ქრება.</p>
<p>თუმცა ყოველთვის რომ არ ვუთითოთ ელემენტს ეს სტილი, ამის გაკეთება შეგვიძლია ყველა ელემენტისათვის ერთხელ CSS ფაილში:</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 /></div></td><td><div class="css codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">img <span style="color: #00AA00;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span><br />
<span style="color: #00AA00;">&#125;</span></div></td></tr></tbody></table></div>
<p>რაც სამუდამოდ მოაგვარებს ამ პრობლემას.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ie67-img-rendering-bug/feed</wfw:commentRss>
		<slash:comments>3</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>IE Sucks: ახალი კატეგორია ბლოგზე</title>
		<link>http://www.code.ge/posts/ie-sucks-new-category</link>
		<comments>http://www.code.ge/posts/ie-sucks-new-category#comments</comments>
		<pubDate>Fri, 28 Sep 2007 11:40:05 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>

		<guid isPermaLink="false">http://www.code.ge/iesucks/ie-sucks-new-category</guid>
		<description><![CDATA[არა მე არ მძულს IE მე იგი მეზიზღება&#8230; მაგრამ მეზიზღება არა იმიტომ რომ მისი მწარმოებელი არის M$ და მე კი ბილ გეიტსის მტერი ვარ და ასე შემდეგ ამისათვის რამდენიმე მარტივი მიზეზი არსებობს: ჯერ ერთი ეს ბრაუზერი მართლაც რომ SUCKS; ყველაზე მეტ დროს როდესაც ვმუშაობ JavaScript &#8211; თან თუ CSS &#8211; სთან, სწორედ IE &#8211; სთვის [...]]]></description>
			<content:encoded><![CDATA[<p>არა მე არ მძულს IE მე იგი მეზიზღება&#8230; მაგრამ მეზიზღება არა იმიტომ რომ მისი მწარმოებელი არის M$ და მე კი ბილ გეიტსის მტერი ვარ და ასე შემდეგ <img src='http://www.code.ge/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ამისათვის რამდენიმე მარტივი მიზეზი არსებობს:</p>
<ul>
<li>
ჯერ ერთი ეს ბრაუზერი მართლაც რომ <strong>SUCKS</strong>;</li>
<li>ყველაზე მეტ დროს როდესაც ვმუშაობ JavaScript &#8211; თან თუ CSS &#8211; სთან, სწორედ IE &#8211; სთვის ოპტიმიზაციაზე ვხარჯავ;</li>
<li>იმედი მქონდა რომ ახალი ვერსია გამართული იქნებოდა მაგრამ მაინც <strong>SUCKS</strong>;</li>
<li>IE6 &#8211; ს გააჩნია მეხსიერების მენეჯმენტის პრობლემა რაც ჩემი საზრუნავია;</li>
<li>და ბოლოს და ბოლოს ამას ეტიკეტი მოთხოვს <img src='http://www.code.ge/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
</ul>
<p>რაც შეეხება ამ კატეგორიის დანიშნულებას, მასში განვათავსებ მხოლოდ ისეთ პოსტებს რომლებშიც მოხსენიებულია ისეთი პრობლემატური საკითხები რომლებიც პრობლემატურია მხოლოდ IE &#8211; ში(ანუ არის რეალიზაციის BUG) ან გამოგონილია IE &#8211; ს დეველოპერების მიერ და არცერთ სტანდარტში არ ჯდება რაც თავისთავად იწვევს კოდის გაყოფის საჭიროებას.</p>
<p>გარდა ამისა იმედი მაქვს რომ ამ განყოფილებაში განთავსებული პოსტები დაეხმარება შედარებით გამოუცდელ JavaScript/CSS კოდერებს რათა უფრო ადვილად გაუმკლავდნენ IE &#8211; ს და მისთვის დამახასიათებელ პრობლემებს.</p>
<p>P.S.<br />
<strong><br />
IE Sucks!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/ie-sucks-new-category/feed</wfw:commentRss>
		<slash:comments>5</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>დინამიური ივენთ ჰენდლერები</title>
		<link>http://www.code.ge/posts/dynamic-event-handlers</link>
		<comments>http://www.code.ge/posts/dynamic-event-handlers#comments</comments>
		<pubDate>Sun, 18 Mar 2007 19:40:30 +0000</pubDate>
		<dc:creator>იოსები</dc:creator>
				<category><![CDATA[IE Sucks]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.ioseb.com/javascript/dynamic-event-handlers</guid>
		<description><![CDATA[ჩემდა სამარცხვნოთ მინდა ვაღიარო რომ ვერაფერი მოვუფიქრე ამ პოსტის სათაურს და პირდაპირ დავწერე &#8220;ივენთ ჰენდლერები&#8221; თუმცა თუ ალტერნატივას შემომთავაზებთ გადავარქმევ სახელს რაც შეეხება თავად პრობლემას(თუმცა პრობლემა ცალსახად მხოლოდ Internet Explorer &#8211; ში გვხვდება) მის წინაშე დღეს ჩემი მეგობარი აღმოჩნდა(რომელიც არ არის JavaScript დეველოპერი) და მკითხა თუ ვიცოდი რაიმე ამის შესახებ&#8230; საბედნიეროდ თავის დროზე საკმაოდ მაწვალა [...]]]></description>
			<content:encoded><![CDATA[<p>ჩემდა სამარცხვნოთ მინდა ვაღიარო რომ ვერაფერი მოვუფიქრე ამ პოსტის სათაურს და პირდაპირ დავწერე &#8220;<strong>ივენთ ჰენდლერები</strong>&#8221; თუმცა თუ ალტერნატივას შემომთავაზებთ გადავარქმევ სახელს <img src='http://www.code.ge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>რაც შეეხება თავად პრობლემას(თუმცა პრობლემა ცალსახად <strong>მხოლოდ Internet Explorer &#8211; ში</strong> გვხვდება) მის წინაშე დღეს ჩემი მეგობარი აღმოჩნდა(რომელიც არ არის JavaScript დეველოპერი) და მკითხა თუ ვიცოდი რაიმე ამის შესახებ&#8230; საბედნიეროდ თავის დროზე საკმაოდ მაწვალა იგივე საკითხმა და პასუხი მქონდა, იმედია სხვა კოლეგებსაც გამოადგებათ ეს რეცეპტი&#8230;<span id="more-43"></span></p>
<p>დინამიური ევენთ ჰენდლერის დამატება ელემენტისთვის თავისთავად არ წარმოადგენს პრობლემას, ვისაც კი ოდესმე დაუწერია რაიმე სულ პატარა JavaScript კოდი თავისთავად შეხებაც ექნებოდა ელემენტების შემდეგ ატრიბუტებთან: onclick, onmousedown, onchange და ა.შ. თუმცა როდესაც დოკუმენტის რომელიმე ელემენტი ან ელემენტები გენერირდება JavaScript  DOM ფუნქციების გამოყენებით კლიენტის მხარეს, ხოლო ისეთ შემთხვევაში როდესაც საჭიროა რომელიმე ჩამოთვლილი ატრიბუტის გამოყენება, პირველ რიგში რაც შეიძლება მოგვივიდეს თავში აზრად ეს არის ელემენტის setAttribute მეთოდი რომლის მეშვეობითაც ხორციელდება ელემენტის ატრიბუტებისა და მათი მნიშვნელობების განსაზღვრა.</p>
<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 />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">window.<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; <span style="color: #003366; font-weight: bold;">var</span> div <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> &nbsp;<span style="color: #006600; font-style: italic;">//create new div element</span><br />
&nbsp; div.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'This is div element'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//append text node</span><br />
&nbsp; div.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'onclick'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'alert(&quot;test&quot;)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//set event handler</span><br />
&nbsp; document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>div<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//add new div element to document</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>ამ კოდში ვქმინით ახალ div ელემენტს, რომელსაც შიგნით ვამატებთ ახალ ტექსტურ ელემენტს, ვანიჭებთ onclick ატრიბუტის მნიშვნელობით alert(&#8220;test&#8221;) და ვამატებთ ახლად შექმნილ ელემენტს დოკუმენტში. ყველაფერი სწორია, ამ კოდის შესრულების შემდეგ დოკუმენტში ახლად გამოჩენილ div ელემენტზე ისრის დაწკაპუნების შემთხვევაში უნდა დავინახოთ შეტყობინება რომელიც დაწერს &#8220;test&#8221; &#8211; ს&#8230; თუმცა ეს კოდი მუშაობს ყველა ბროუზერში <strong>გარდა Internet Explorer &#8211; ისა</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 /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">window.<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; <span style="color: #003366; font-weight: bold;">var</span> div <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; div.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createTextNode</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'This is div element'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #006600; font-style: italic;">//div.setAttribute('onclick', 'alert(&quot;test&quot;)');</span><br />
&nbsp; 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 />
&nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>div<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>როგორც მაგალითიდან ჩანს ამ პრობლემის გადასაჭრელად უბრალოდ გავაკომენტარეთ პირველ მაგალითში გამოყენებული მეთოდი და მის ნაცვლად გამოვიყენეთ ანონიმური ფუნქცია.</p>
<p><a href="/javascript/javascript-wtf-vol-3-2">onload და onunload მოვლენების</a> და ასევე <a href="/javascript/javascript-wtf-vol-2">ანონიმური ფუნქციების</a> შესახებ უფრო მეტი დეტალებისათვის შეგიძლიათ წაიკითხოთ  შესაბამის პოსტებში.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.code.ge/posts/dynamic-event-handlers/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
