<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://speak.forumkz.ru/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>TimeSpeak</title>
		<link>https://speak.forumkz.ru/</link>
		<description>TimeSpeak</description>
		<language>ru-ru</language>
		<lastBuildDate>Fri, 14 Jun 2019 18:59:20 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>Бытовая техника</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=155#p155</link>
			<description>&lt;p&gt;Да запросто. Есть такой, я и сам в нем постоянно что-то покупаю. В основном расходники - бумагу, картриджи, авторучки. А теперь вот вам ссылочка на этот самый магазин, где есть любая бытовая техника для офиса: &lt;a href=&quot;https://www.b2b-service.kz/bytovaya-tekhnika/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.b2b-service.kz/bytovaya-tekhnika/&lt;/a&gt; Уверен, вы тоже станете его постоянным покупателем.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Лексус)</author>
			<pubDate>Fri, 14 Jun 2019 18:59:20 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=155#p155</guid>
		</item>
		<item>
			<title>Поздравляем TaronTo с ДР</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=153#p153</link>
			<description>&lt;p&gt;Присоединяюсь!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Карамелька)</author>
			<pubDate>Fri, 14 Jun 2019 17:59:26 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=153#p153</guid>
		</item>
		<item>
			<title>Наборы для аппликации</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=152#p152</link>
			<description>&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;А мы купили классный набор для аппликации. Для всей группы детского творчества. Выбор был большой, но мы выбрали набор из фольги. Если интересно, то купили тут: &lt;a href=&quot;https://www.b2b-service.kz/applikatsii/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.b2b-service.kz/applikatsii/&lt;/a&gt; Даже ездить самим не пришлось, всё привезли прямо к дверям центра. Еще и недорого. &lt;/span&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Лексус)</author>
			<pubDate>Sat, 22 Dec 2018 20:36:49 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=152#p152</guid>
		</item>
		<item>
			<title>TrustPort Antivirus 2010 - ТрастПорт Антивирус 2010</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=151#p151</link>
			<description>&lt;p&gt;Сижу уже давно на McAfee и всем доволен, а вот по поводу какой антивирус лучше так это довольно спорный вопрос, порой создается впечатление что они сами делают всякие вирусы чтобы потом доблестно их обезвреживать, как по мне лучше всего не посещать злачные места и все будет хорошо. На McAfee остаюсь потому что лоялен к ресурсам компа, и цена умеренна, брал себе его, когда у них была акция и нужно было сделать небольшое пожертвование в какой-то фонд и давали бесплатно лицензию на один комп на длительный срок, так я тогда через &lt;a href=&quot;https://www.kassa24.kz/charity/blagotvoritelnost/of-miloserdie&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.kassa24.kz/charity/blagotvo &amp;#8230; miloserdie&lt;/a&gt; решил внести за благотворительность милосердие нужную сумму, так как получалось гораздо дешевле чем покупать лицензию и пользуюсь им по сей день.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Pro100Den)</author>
			<pubDate>Fri, 27 Jul 2018 11:14:24 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=151#p151</guid>
		</item>
		<item>
			<title>Папки-конверты с клапаном</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=150#p150</link>
			<description>&lt;p&gt;Ну, за сохранность данных!&lt;br /&gt;А как их сохранить надежнее, чем на бумажном носителе, да еще и в наших красивых папках?&lt;br /&gt;&lt;a href=&quot;https://www.b2b-service.kz/papki-konverty-s-klapanom/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.b2b-service.kz/papki-konverty-s-klapanom/&lt;/a&gt;&lt;br /&gt;Можно взломать сервер, можно подобрать пароль к облачному хранилищу. Но пока папка у вас в руках, вряд ли кто-то узнает о ее содержимом, пока вы сами этого не захотите.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Алена Байбакова)</author>
			<pubDate>Tue, 29 May 2018 21:49:17 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=150#p150</guid>
		</item>
		<item>
			<title>Как взломать Одноклассники? пароль заказать</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=148#p148</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;administrator написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Если Вы желаете сделать это самостоятельно, то вы можете скачать программу для взлома в Одноклассниках.&lt;br /&gt;Желательно отключить антивирус.&lt;br /&gt;Программа ДЛЯ ВЗЛОМА СКАЧАТЬ БЕСПЛАТНО.&lt;/p&gt;
						&lt;p&gt; - Размер: 512.6 кб. Скачано: 499 раз(а). odnoklassniki.zip&lt;/p&gt;
						&lt;p&gt;Или сделать заказ по почте.&lt;br /&gt;=======================================================&lt;br /&gt;Взлом Соц. сети:&lt;br /&gt;- ОДНОКЛАССНИКИ.ру&lt;br /&gt;- Вконтакте.ру&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;Добрый день. Есть заинтересованность в данного рода услугах, но хотел уточнить по поводу условий оплаты, а то не совсем понятно, как этот процесс будет проходить. И можно ли рассчитаться электронным деньгами, а именно перевести на wooppay кошелек через &lt;a href=&quot;https://www.kassa24.kz/games/wooppay&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.kassa24.kz/games/wooppay&lt;/a&gt; , просто мне так было бы удобней, так как деньги в основном там лежат.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Pro100Den)</author>
			<pubDate>Thu, 27 Apr 2017 12:32:22 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=148#p148</guid>
		</item>
		<item>
			<title>Требуется помощь</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=55#p55</link>
			<description>&lt;p&gt;Доброго времени суток!уже дня три рою форумы в поисках помощи ищу человека который смог бы помочь мне без таких слов как бери книгу и зубри ассамблер )))) я бы зубрил но почитал немного про него и это работа не из легких так просто и быстро в нем не разберешься у меня такая проблема есть программа которая допустим работает на 1 едиствином окне когда пытаешься её запустить на любое другое окно программа сразу завершает этот процес так вот мне нужна чтобы как не буть в её коде изменили данные чтобы программа запускалась на любом окне и не завершала этот процес в программе имеется два файла 1 фаил exe формата 2 фаил dll формата &lt;br /&gt;если тут найдется такой человек который мог бы помочь то отпишитесь я изложу проблему в подробностях и скриншотах и выложу сому программу&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Slava)</author>
			<pubDate>Mon, 17 Jan 2011 06:16:07 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=55#p55</guid>
		</item>
		<item>
			<title>скачать лучшие самоучители по HTML</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=54#p54</link>
			<description>&lt;p&gt;Вылаживаю ссылки на 2 самоучителя по HTML&lt;br /&gt;&lt;a href=&quot;http://depositfiles.com/files/kyhy1rfex&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://depositfiles.com/files/kyhy1rfex&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://depositfiles.com/files/l0hwpuw21&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://depositfiles.com/files/l0hwpuw21&lt;/a&gt;&lt;br /&gt;эти самоучители по своей сети дополняют друг друга&lt;br /&gt;И вместе их можно назвать мировым бесселером!!!&lt;br /&gt;Очень рекомендую их изучить если вы и в правду &lt;br /&gt;желаете писать сайты на высоком уровне!!!!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (korzun)</author>
			<pubDate>Fri, 15 Oct 2010 17:25:52 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=54#p54</guid>
		</item>
		<item>
			<title>Скачать книгу (самоучитель) Ассеблер( Assembler )</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=53#p53</link>
			<description>&lt;p&gt;Во истину мировой бесселлер &amp;quot;Самоучитель языка программирования Асемблер&amp;quot; &lt;br /&gt;Подойдет для всех!!! Иначинающих и самых крутых программеров!!!&lt;br /&gt;Качать здесь&amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;a href=&quot;http://depositfiles.com/files/9tfhlwd8s&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://depositfiles.com/files/9tfhlwd8s&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (korzun)</author>
			<pubDate>Fri, 15 Oct 2010 17:24:03 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=53#p53</guid>
		</item>
		<item>
			<title>Собственная антивирусная система на C#</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=50#p50</link>
			<description>&lt;p&gt;BoxedApp SDK.. Да вещь хорошая. Тоже года два уже юзаю.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Антон)</author>
			<pubDate>Tue, 25 May 2010 20:21:24 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=50#p50</guid>
		</item>
		<item>
			<title>Проигрывание флеша напрямую (без временных файлов)</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=49#p49</link>
			<description>&lt;p&gt;Можешь попробовать навороченный флеш-контрол - &lt;a href=&quot;http://f-in-box.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;F-IN-BOX&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Антон)</author>
			<pubDate>Tue, 25 May 2010 20:20:23 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=49#p49</guid>
		</item>
		<item>
			<title>БД</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=48#p48</link>
			<description>&lt;p&gt;можно ли как-нибудь подключить БД к Паскалю, интересно.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Антон)</author>
			<pubDate>Tue, 25 May 2010 20:18:48 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=48#p48</guid>
		</item>
		<item>
			<title>Использование ActiveX контролов и DLLок напрямую из буфера памяти (C#)</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=47#p47</link>
			<description>&lt;p&gt;Да, можешь упаковать все &amp;quot;добро&amp;quot; в один EXE-шник с помощью спец. пакера - &lt;a href=&quot;http://boxedapp.ru/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;BoxedApp Packer&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Антон)</author>
			<pubDate>Tue, 25 May 2010 20:15:38 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=47#p47</guid>
		</item>
		<item>
			<title>exe из swf</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=46#p46</link>
			<description>&lt;p&gt;Знакомый в асе мне недавно посоветовал юзать в моем случае &lt;a href=&quot;http://flajector.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Flajector&lt;/a&gt; и мне понравилось&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Степа)</author>
			<pubDate>Tue, 25 May 2010 20:12:21 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=46#p46</guid>
		</item>
		<item>
			<title>Запарили утечки памяти</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=45#p45</link>
			<description>&lt;p&gt;Я нарыл в нете прогу, что мне нужна: &lt;a href=&quot;http://deleaker.ru/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Deleaker&lt;/a&gt;. Вопрос закрыт. Всем спасибо.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Степа)</author>
			<pubDate>Tue, 25 May 2010 20:10:42 +0400</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=45#p45</guid>
		</item>
		<item>
			<title>Разработка и создание БД</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=38#p38</link>
			<description>&lt;p&gt;Довёл немного до ума, в итоге вышло:&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s2/3e/e4/8d/4a/3ee48d4a7d2214de0c985a758dc24a7c.jpg&quot; alt=&quot;http://pics.kz/s2/3e/e4/8d/4a/3ee48d4a7d2214de0c985a758dc24a7c.jpg&quot; /&gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Рис. 1.&lt;/p&gt;
						&lt;p&gt;Далее буду создавать Формы для добавления пользователем данных о Врачах, Пациентах и Поставленных Диагнозах.&lt;br /&gt;А так же запросы и отчёты...&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FeDeRaL)</author>
			<pubDate>Thu, 24 Dec 2009 09:30:21 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=38#p38</guid>
		</item>
		<item>
			<title>Свойства шрифтов</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=37#p37</link>
			<description>&lt;p&gt;Сегодня я расскажу вам правду о шрифтах. И хотя о шрифтах можно говорить долго и нудно, я этого делать не буду. Во-первых, есть много источников, где можно найти эту информацию. Во-вторых, мой урок не резиновый. А в-третьих, давайте сразу приступим к делу. А я попутно займусь рекламой своего сайта... Вы же можете в примерах выкидывать мои данные и впихивать свои. Обещаю не подавать на вас за это в суд. Напишем следующий код: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 7. Добавляем шрифты&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt; &lt;strong&gt;&amp;#160; &amp;#160;Реклама сайта&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 24em&quot;&gt;&lt;pre&gt; H2{ 
        font-family:Garamond, &amp;quot;Times New Roman&amp;quot;, Bodony, serif;
        font-size:x-large;
        font-style:normal;
        font-weight:bold;
        font-variant:small-caps
       } 
     H4{
        font-family:Arial, Verdana, Helvetica, sans-serif;
        font-size:30px;
        font-style:italic;
        font-weight:600;
        font-variant:normal
       }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Форум программирования и Web-технологий&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;на &amp;quot;http://speak.forum.com.kz/&amp;quot;&lt;/p&gt;
						&lt;p&gt; Честно говоря, это не совсем хорошая запись, в CSS можно спокойно сделать и сокращенную запись, например такую: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 8. &lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; &amp;#160; Реклама сайта&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; H2{font: bold x-large normal small-caps Garamond, &amp;quot;Times New Roman&amp;quot;, Bodony, serif } &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; H4{font: italic 600 30px Arial, Verdana, Helvetica, sans-serif } &lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;Форум программирования и Web-технологий&amp;#160; &amp;#160; &lt;br /&gt;на &amp;quot;http://speak.forum.com.kz/&amp;quot;&lt;/p&gt;
						&lt;p&gt;В обоих случая результат будет одинаков: &lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s2/a9/7b/cc/f0/a97bccf0d23cbd8ee92b9857e44c6fa0.jpg&quot; alt=&quot;http://pics.kz/s2/a9/7b/cc/f0/a97bccf0d23cbd8ee92b9857e44c6fa0.jpg&quot; /&gt;&lt;br /&gt;Рис. 1. Со шрифтами лучше!&lt;/p&gt;
						&lt;p&gt;Как видим, к свойствам шрифта font можно отнести 5 пунктов: &lt;/p&gt;
						&lt;p&gt;font-family, отвечающий за гарнитуру шрифта; &lt;br /&gt;font-size, который определяет размер шрифта; &lt;br /&gt;font-style, который задает стиль шрифта - обычный, наклонный или курсивом; &lt;br /&gt;font-weight, отвечающий на сколько жирненьким получится шрифт; &lt;br /&gt;font-variant, указывающий на вариант начертания буковок - должны ли они быть все маленькими прописными или просто нормальными &lt;/p&gt;
						&lt;p&gt;Вот и рассмотрим подробно каждый этот пунктик. &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Font-family&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Вы даже себе не можете представить, сколько всего шрифтов существует в мире! Тысячи и тысячи! Я вообще не представляю, как можно одно и то же слово написать столькими способами! И я не знаю, хорошо это или плохо. С одной стороны, был бы один шрифт, не ломали бы мы с вами голову над новым уроком, но с другой стороны.. какой простор для фантазии! Сиди и перебирай один шрифт за другим до тех пор, пока глаза не лопнут. Хотя особо и не обольщайтесь... все равно на компьютере вашего пользователя загружено едва ли десяток самых распространенных шрифтов, и ему вообще начхать на все ваши поиски и происки. &lt;/p&gt;
						&lt;p&gt;К нашему с вами счастью все шрифты решили разделить на пять семейств: семейство с засечками serif, семейство без засечек sans-serif, семейстов шрифтов с буквами одинаковой ширины monospace, семейство рукописных шрифтов cursive и, последнее семейство вычурных шрифтов, которые вообще редко у кого есть fantasy &lt;br /&gt;Семейство serif&lt;/p&gt;
						&lt;p&gt;Одни шрифты - с засечками и называются они семейством serif.&lt;/p&gt;
						&lt;p&gt;Из латинских шрифтов к этому семейству относятся такие шрифты, как Times New Roman, Bodoni, Garamond, Minion Web, ITC Stone Serif, MS Georgia, Bitstream Cyberbit.&lt;/p&gt;
						&lt;p&gt;Из кирилицы можно выделить шрифты Adobe Minion Cyrillic, Excelcior Cyrillic Upright, Monotype Albion 70, Bitstream Cyberbit, ER Bukinst. Есть еще и другие - и арабские, и японские и еврейские..., но я сомневаюсь, что все они установлены на ваших компьютерах, дай бог, чтобы треть вышеперечисленных были под рукой... &lt;/p&gt;
						&lt;p&gt;Хотя... чего там выделываться и строить из себя слишком умную... Пользуйтесь шрифтами Times New Roman, Bodoni, Garamond и не ломайте себе и другим головы! Поэтому напишем просто: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 9.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; &amp;#160; Семейство &amp;quot;serif&amp;quot;&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;    P{font-family:serif}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;А можем написать и так: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 10. &lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt; &lt;strong&gt;&amp;#160; &amp;#160;Семейство &amp;quot;serif&amp;quot;&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;   P{font-family:Garamond}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;И результат будет немного другой, но шрифт все равно с засечками!!! &lt;/p&gt;
						&lt;p&gt;Ну, и напишем еще вот так: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 11.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; &amp;#160; Семейство &amp;quot;serif&amp;quot;&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;  P{font-family:Garamond, &amp;quot;Times New Roman&amp;quot;, Bodony, serif}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;И такая вот запись: &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;{font-family:Garamond, &amp;quot;Times New Roman&amp;quot;, Bodony, serif}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;для браузера будет означать - &amp;quot;Эта... как иво... напиши-ка мне все шрифтом Garamond, а если его нету, то хоть Times New Roman аль Bodony, а если и их нету, то хоть што-нибудь, но только с засечками плиииииииииииииииииз!!!&amp;quot; &lt;/p&gt;
						&lt;p&gt;И будьте уверены, браузер внемлет этим воплям и в лепешку разобьется, но найдет вам ваши засечки! &lt;/p&gt;
						&lt;p&gt;Прошу обратить внимание что &amp;quot;Times New Roman&amp;quot; я поставил в кавычки - это не потому что он такой вот особенный, а просто... если название больше одного слова - то кавычки нужны. Правило такое есть. А если слово всего одно, то кавычки необязательны. Но если вас так распирает на кавычки - ставьте. Все равно это никто не заметит. Возни только больше. &lt;/p&gt;
						&lt;p&gt;И еще... само обозначение семейства ставьте в конец строчки! &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Семейство &amp;quot;sans-serif&amp;quot;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Теперь пойдем в другой лагерь и познакомимся с семейством sans-serif. Это ребята простые как правда. Нет в них никаких таких засечек. Кстати, sans - как раз и означает &amp;quot;без&amp;quot;. Без засечек. Про эти шрифты говорят, что они рубленые. К этому семейству относятся такие латинские шрифты как Arial, Verdana, Helvetica, Tahoma, Futura. Вставим же в следующем примере строчку font-family:sans-serif:&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 12.&lt;/strong&gt; &lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; &amp;#160; Семейство &amp;quot;sans-serif&amp;quot;&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;    P{font-family:sans-serif}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;И сразу же увидим результат - шрифт без засечек.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Семейство cursive&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Примером этого семейства может служить шрифт Caflish Script, Zapf-Chancery.&lt;/p&gt;
						&lt;p&gt;Имитирует письмо от руки, его лучше всего использовать для украшения текста или смысловых выделений. Большие же объемы текста, набранные курсивом, сложно чи-тать. Но все равно, убедитесь, что этот шрифт есть у вас в наличии. &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Семейство monospace&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;К этому семейству можно отнести шрифт Courier New, Prestige, Everson Mono. К достоинством этого шрифта можно отнести то, что все буковки по ширине одинаковы. Читать такой текст, конечно, не очень удобно. Но если в тексте важна каждая буковка, скажем, как в моих описаниях кодов, тогда этот шрифт как нельзя более кстати. &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 13. &lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; &amp;#160; Семейство &amp;quot;monospace&amp;quot;&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;P{font-family: &amp;quot;Courier New&amp;quot;, monospace}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Семейство fantasy&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;К этому семейству можно отнести шрифт Alpha Geometrique, Western.&lt;/p&gt;
						&lt;p&gt;Все, что не подошло к предыдущим семействам решили свалить в одно семейство fantasy. Они весьма декоративны, а некоторые из них так и вовсе представляют собой иконки или картинки. Так что особо не переусердствуйте с ними. &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Font-size&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Ну, с этим дело пойдет веселее, и выбор тут тоже довольно богатый! И задать размеры можно несколькими способами! Во-первых, можно с помощью ключевых слов: xx-small; x-small; small; medium; large; x-large и xx-large. Наверняка, вы и сами догадались, что xx-small - самый мелкий шрифт, а xx-large - самый крупный.&lt;/p&gt;
						&lt;p&gt;Но и это не все! Шрифт можно задавать и в пунктах (pt), и в пикселях (px), и в дюймах (in), и в миллиметрах (mm), сантиметрах (cm), пиках (pc) и просто в процентах (%)!&lt;/p&gt;
						&lt;p&gt;Но и это не все! С помощью слов smaller или larger можно уменьшить или увеличить отдельные слова по сравнению с основным, родительским текстом. &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Font-style&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Это свойство еще легче. Оно отвечает за стиль шрифта, и указывает каким ему быть - прямым normal, наклонным oblique или курсивным italic. Если вы думаете, что наклонный и курсивный - это одно и то же, то глубоко заблуждаетесь! Курсив имитирует письмо, написанное &amp;quot;от руки&amp;quot;, а наклонный... это просто слегка завалившийся вправо текст. &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Font-weight&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Это свойство определяет толщину шрифта, или правильней, насыщенность начертания. Тут можно и поэкспериментировать. Можно написать просто: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;&lt;br /&gt;Листинг 14. &lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;&lt;strong&gt; Полужирный шрифт&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;      P{font-weight:bold}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Вы, наверное, удивитесь - ну и зачем было городить огород, когда можно было бы и безо всяких стилей просто написать: Форум программирования и Web-технологий на &lt;a href=&quot;http://speak.forum.com.kz/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://speak.forum.com.kz/&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;И результат был бы такой же, разве что код раз в пять короче... И, знаете, я с вами соглашусь. Но не совсем. Потому как кроме bold можно написать и bolder (толще) и lighter (тоньше) и это не предел!!! Можно указать насыщенность не только словами, но и числами от 100 до 900!. Правда не все числа можно использовать, а только кратные 100. А число 400 равно bold. Так что в вышеприведенном примере я мог запросто написать:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;P {font-weight:400}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;И результат был точно такой же. Поэкспериментируйте, посмотрите, может понравится! &lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Font-variant&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;И, последнее, чем я хочу вас помучать в неравной борьбе со шрифтами - это вообще глупость какая-то. Потому как этому свойству можно подобрать только два варианта. Причем один из них - нормальный, а второй - ненормальный. Ненормальный - это small-caps. Это когда маленькие буквы пишутся как заглавные, но оставаясь при этом маленькими. То есть маленькими прописными. Вот и примерчик: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 15. &lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; &amp;#160; Хоть и маленькие, но прописные!!!&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;P{font-variant:small-caps}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;И вот он - результат! Все буквы стали заглавными, любуйтесь. &lt;/p&gt;
						&lt;p&gt;Наверное, этот урок довольно скучный. Но что делать? Вам его было скучно читать, мне - скучно писать. Писал я его довольно долго... месяца два. Писал, стирал, опять писал... И вроде что тут особо мудрствовать? Просто хотелось, чтоб получилось хорошо. Я изучил чуть ли не всю типографику, прочитал все, чт могла прочитать, купить или достать. &lt;/p&gt;
						&lt;p&gt;В конце концов, решил не запудривать вам мозги и написать все коротко. На сколько это удалось, судить вам. Ну, а на последок, все-таки дам вам несколько советов. Хотя, не столько советов, сколько раздумий. Прислушиваться к ним или нет - ваше дело. В конце концов - решающее слово за вами. Итак... &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Дикие советы&lt;/strong&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Жестких правил, диктующих, какой и когда выбрать шрифт - не существует. Это зависит от вашего опыта и мастерства. Хиппи выбрал бы один шрифт, учитель русского языка - другой, предприниматель - третий, а человек, влюбленный в историю - четвертый. Однако, если вы хотите, чтобы ваш текст читался с вниманием, необходимо, чтобы он легко читался, гармонировал с остальными элементами сайта, ну и был уместен вообще. :)) &lt;br /&gt;Шрифты с засечками читаются легче. Взгляд как бы скользит от одной буквы к другой. &lt;br /&gt;Буквы без засечек лучше читаются в крупных заголовках, а также в очень мелком тексте. &lt;br /&gt;Легче читается текст прямой, светлый, средней плотности. Хуже - курсивный или наклонный, жирный или очень светлый. &lt;br /&gt;Для выделения пользуются наклонным или курсивным шрифтами. &lt;br /&gt;Если ваш сайт - для детей, то лучше использовать покрупнее и пожирнее текст. То же относится и для слабовидящих. Так что учитывайте и свою аудиторию. &lt;br /&gt;Для чтения лучше подходят шрифты от 9 до 12 кегля. &lt;br /&gt;Лучше ограничить число шрифтов до одного. Для удобочитаемости это превыше всего. Хотя, как сказал типограф Э. Гилл &amp;quot;практически удобочитаемо все, к чему привыкли&amp;quot;. &lt;br /&gt;На удобочитаемость влияет и ширина строки, это примерно 50-70 знаков. &lt;br /&gt;Также важны расстояние между словами, между строчками и между абзацами, но об этом мы поговорим в следующем уроке. &lt;br /&gt;Важно также и цвет шрифта, а также фон, на котором он написан. Хотя стоит иметь в виду также и насыщенность цветов. Так что лучше всего экспериментировать и экспериментировать... пока не найдете &amp;quot;то самое&amp;quot;, после чего все ахнут и скажут... &amp;quot;ну какой же красивый шрифт!&amp;quot; &lt;br /&gt;Так что, выбирая шрифт, вы не должны не только учитывать его &amp;quot;красивость&amp;quot;, но и принять во внимание и аудиторию и то, о чем рассказываете, и многое-многое другое... Удачи вам!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FeDeRaL)</author>
			<pubDate>Wed, 23 Dec 2009 17:57:40 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=37#p37</guid>
		</item>
		<item>
			<title>Единицы измерений</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=36#p36</link>
			<description>&lt;p&gt;Помните мультфильм, где удава меряли в попугаях? Исходя философски, можно все и вся мерить в чем угодно и как угодно. Но только не в HTML! Собственно говоря, там вообще нет никаких измерений. Разве что проценты. А вот, не хвастаясь, могу сказать, что в CSS есть разные мерки! Пусть их не так много, пусть там нет пернатых, но зато там есть короли! Прикиньте, мерить все в королях! Не верите? А зря! Я вам докажу это на прямо-таки на пальцах вышеуказанных персон! Хотя это может и враки! Может не в пальцах королей дело, а в трех ячменных зернышках? &lt;/p&gt;
						&lt;p&gt; Если вы решили, что я свихнулся окончательно со своими уроками, то зря. Это я про дюйм говорю! Про дюйм как единицу длины. И вот что любопытно, в одном книжном издании говорится, что &amp;quot;дюйм - это мера длины большого пальца руки короля Генриха VIII&amp;quot;, в другом же издании, утверждается, что все это брехня на постном масле, и что дюйм - не что иное, &amp;quot;как длина трех ячменных зерен, вытянутых из средней части коло-а и приставленных одно к другому своими концами&amp;quot;. И утвердил это совсем не Генрих, а Эдвард II в 1324 году. А в третьем месте черным по белому заявлено, что меры длины были узаконены еще в 1101 году, и не Эдвардом, а Генрихом I! И что главная мера длины - ярд. А дюйм - это одна двенадцатая ярда. А ярд - это ваще &amp;quot;расстояние от носа короля Генриха I до среднего пальца вытянутой руки&amp;quot;. &lt;/p&gt;
						&lt;p&gt; Я так запутался, что решил вообще ничего не писать про дюймы, но потом открыл добрую, старую энциклопедию и прочитал, что &amp;quot;дюйм = 2,54 см&amp;quot;. Коротко и ясно. По ходу дела я тут же схватился за линейку и промерил свой большой палец... И понял, что если бы я встал рядом с Генрихами-Эдвардами, то все короли мне в пупок бы дышали, ей-богу! &lt;/p&gt;
						&lt;p&gt; Ну ладно, кто про что, а мы - про стили. Мы вот возьмем и напишем несколько строк в дюймах. Не зря же пол-урока им посвящено! Итак, открыли быстренько Notepad и написали также быстренько:&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 5. &lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;&amp;#160; Пример с дюймами:&lt;/strong&gt;&lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 6em&quot;&gt;&lt;pre&gt; P {font-size:1in} 
    H2 {font-size:2in; text-align:center}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;Заголовок размером в два дюйма&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;br /&gt; А вот этот текст размером в один дюйм, и как утверждают одни - это и есть размер большого пальца короля Генриха VIII, другие - длина трех зерен из средней части колоска, а третьи - что это одна двенадцатая от расстояния от носа до среднего пальца вытянутой руки короля Генриха I. &lt;/p&gt;
						&lt;p&gt;И вот такая у нас петрушка из королей получилась:&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s2/76/ca/6d/0a/76ca6d0a89053e1794932abce953c429.jpg&quot; alt=&quot;http://pics.kz/s2/76/ca/6d/0a/76ca6d0a89053e1794932abce953c429.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt; На рисунке не очень можно понять эти размеры, поэтому лучше посмотрите что получилось у вас. Пример в дюймах. Великоваты буквы? Но ничего, зато вы, можно сказать, приобщились к истории, а заодно можете сравнить со своими пальчиками и прикинуть куда вам дышат короли. Надеюсь не в затылок! &lt;/p&gt;
						&lt;p&gt; Как видите, дюймы обозначаются im. А теперь попробуйте изменить размер шрифта в настройках браузера! Обратите внимание, текст, указанный в дюймах не изменяется! Каким вы его заложили - таким он и остается! Что значит палец короля... &lt;/p&gt;
						&lt;p&gt; С одной стороны, это конечно хорошо. Нефик всяким юзерам дизайн менять! А с другой стороны... У одних зрение получше и им подавай текст с букашку, у других и с тремя очками дюймы не разглядеть. На всех ведь не угодишь! Поэтому для удобства пользователей существуют и относительные единицы измерений, например, пикселы. Вот мы сейчас в пикселах всю правду и выложим: &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 6. &lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &lt;strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; Пример с пикселами:&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 6em&quot;&gt;&lt;pre&gt;  P {font-size:15px} 
      H2 {font-size:20px; text-align:center}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 20px&quot;&gt;Заголовок размером в 20 пикселов&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&lt;span style=&quot;font-size: 15px&quot;&gt;&amp;#160; А вот этот текст размером в 15 пикселов, и если попро-бовать изменить разрешение экрана, то можно будет читать этот текст и без бинокля. Кому как нравится&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt; Чтобы дальше вас не мучать столь подробным рассказом, я просто скажу, какие единицы измерений могут применяться в CSS. Думаю, сам процесс вам стал ясен. &lt;/p&gt;
						&lt;p&gt; Итак, к абсолютным единицам можно отнести не только эти буржуйские дюймы in, но и миллиметры mm и сантиметры cm. А что касается буржуйских штучек, то если хотите, можно и в пунктах pt, которые равны 1/72 дюйма, и в пиках pc, которые равны 12 пунктам. Вот такая, блин, арифметика. &lt;/p&gt;
						&lt;p&gt; Что же касается относительных величин, то тут, кроме пикселов px, можно использовать и проценты, например в стилях написать следующее: font-size:200%. И есть еще две интересные величины - em и ex. Первая величина - это ширина буквы m текущего шрифта, а вторая - высота буквы x шрифта. &lt;/p&gt;
						&lt;p&gt; Все эти величины касаются не только размеров шрифта, но и других величин, о которых мы будем говорить в следующих уроках. Это может быть и расстояние от границы браузера, и шириной блока, и толщиной линии. Но пока потренируйтесь на кошках. То есть с размерами шрифта. Тоже очень полезное занятие. Развивает глазомер и другие важные функции организма. А я пошёл дальше. Догоняйте!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FeDeRaL)</author>
			<pubDate>Wed, 23 Dec 2009 17:24:56 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=36#p36</guid>
		</item>
		<item>
			<title>Освоение Ajax: Часть 5. Управление DOM</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=35#p35</link>
			<description>&lt;p&gt;Источник: wwwibm.com&lt;br /&gt;Уровень сложности: простой&lt;br /&gt;Брэт Маклафлин, автор и редактор, O&#039;Reilly Media Inc.&lt;br /&gt;11.04.2006&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; В прошлом месяце Брэтт представил Document Object Model, элементы которой работают за кулисами ваших Web-страниц. В этом месяце он рассматривает DOM еще детальнее. Узнайте, как создавать, удалять и изменять части DOM-дерева, и сделайте очередной шаг к динамическому обновлению ваших Web-страниц!&lt;/p&gt;
						&lt;p&gt;Если вы следили за дискуссией в этой серии статей в прошлом месяце, значит, имеете начальное представление о том, что происходит при отображении Web-браузером ваших Web-страниц. Я объяснял, что когда определенные вами для страницы HTML и CSS передаются в Web-браузер, они транслируются из текстовой в объектную модель. Это истинно и для простого кода и для сложного, для кода, расположенного в одном файле и в отдельных файлах. Браузер напрямую работает с объектной моделью, а не с предоставленными вами текстовыми файлами. Используемая браузером модель называется Document Object Model. Она соединяет объекты, представляющие элементы, атрибуты и текст в ваших документах. В эту объектную модель внедрены все стили, значения и даже большинство из пробелов вашего HTML и CSS-кода. Конкретная модель для данной Web-страницы называется DOM-деревом страницы.&lt;/p&gt;
						&lt;p&gt;Понимание того, что представляет собой DOM-дерево, и даже знание того, как оно представляет ваш код HTML и CSS - это только первый шаг на пути к управлению вашими Web-страницами. Вы должны научиться работать с DOM-деревом конкретной Web-страницы. Например, если вы добавите элемент к DOM-дереву, этот элемент немедленно появится в браузере пользователя без перезагрузки страницы. Удалите какой-нибудь текст из DOM-дерева, и этот текст исчезнет с экрана пользователя. Вы можете изменить интерфейс и взаимодействовать с интерфейсом пользователя через DOM, что дает вам огромную мощь и гибкость при программировании. Изучив работу с DOM-деревом, вы сделаете гигантский шаг навстречу овладению развитыми, интерактивными, динамичными Web-сайтами.&lt;/p&gt;
						&lt;p&gt;Обращаю внимание на то, что следующий материал основан на статье &amp;quot;Исследование DOM для Web-ответа&amp;quot;; если вы ее не читали, то, возможно, захотите сделать это перед продолжением работы над данной статьей.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Вопросы произношения акронимов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Вообще говоря, Document Object Model могла бы легко называться Document Node Model. Но в своем большинстве люди, конечно же, не знают, что означает термин node (узел), да и произносить &amp;quot;DNM&amp;quot; не так удобно, как &amp;quot;DOM&amp;quot;, поэтому легко объяснить, почему W3C выбрала именно DOM.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Разные браузеры, разные языки&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Document Object Model - это стандарт W3C (ссылки на W3C приведены в разделе &amp;quot;Ресурсы&amp;quot;). По этой причине все современные Web-браузеры поддерживают DOM, по крайней мере, в некоторой степени. Хотя и существуют некоторые различия между браузерами, если вы использовали базовую DOM-функциональность (и обращали внимание на несколько специальных ситуаций и исключений), ваш DOM-код будет работать в любом браузере одинаково. Написанный вами код для изменения Web-страницы в Opera будет работать с Safari®, Firefox®, Microsoft® Internet Explorer® и Mozilla®.&lt;/p&gt;
						&lt;p&gt;DOM также является не зависящей от языка спецификацией; другими словами, вы можете использовать ее во многих популярных языках программирования. W3C определяет для DOM несколько правил связывания с разными языками. Правила связывания языка - это просто API, определенный для разрешения использования DOM в конкретном языке. Например, вы можете найти однозначно определенные правила связывания DOM для C, Java и javascript. Следовательно, вы можете использовать DOM в любом из этих языков. Правила связывания доступны также и для нескольких других языков, хотя многие из них не определены не W3C, а третьими сторонами.&lt;/p&gt;
						&lt;p&gt;В данной серии статей я сконцентрируюсь на правилах связывания DOM для javascript. Это имеет смысл, поскольку большинство разработок асинхронных приложений основано на написании javascript-кода для работы в Web-браузерах. С javascript и DOM вы можете изменять пользовательский интерфейс динамически, реагируя на пользовательские события и ввод, и, более того, используя для всего этого четко стандартизированный javascript.&lt;/p&gt;
						&lt;p&gt;Несмотря на сказанное выше, я призываю вас попробовать поработать с DOM и в других языках. Например, вы можете использовать правила связывания для Java при работе не только с HTML, но также и с XML (я буду рассматривать это в одной из следующих статей). То есть, знания, которые вы получите здесь, выходят далеко за рамки HTML и применимы не только в javascript-программировании клиентского кода.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Абстрактный узел&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Node является самым главным типом объекта в DOM. Фактически, как вы узнаете из этой статьи, почти каждый второй объект, определенный в DOM, расширяет объект node. Но, прежде чем вы углубитесь в семантику, вы должны понять концепцию, представляемую узлом; изучить актуальные свойства и методы node очень просто.&lt;/p&gt;
						&lt;p&gt;В DOM-дереве почти все, что вы встречаете, является узлом. Каждый элемент является на своем наиболее базовом уровне узлом в DOM-дереве. Каждый атрибут - это узел. Каждый кусочек текста - это узел. Даже команды, специальные символы (например, &amp;amp;copy; - символ авторского права) и объявления DOCTYPE (если у вас они есть в HTML или XHTML) являются узлами. Поэтому, перед обсуждением особенностей конкретных типов вы должны понять, что такое узел.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Узел - это…&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Простейшее определение: узел - это просто одна отдельная вещь в DOM-дереве. Неясность термина &amp;quot;вещь&amp;quot; преднамеренна, поскольку она конкретна настолько, насколько мы ее представляем. Например, возможно не очевидно, что элемент в вашем HTML, допустим img, и часть текста в HTML, допустим &amp;quot;Прокрутите страницу вниз для получения подробной информации&amp;quot;, имеют много общего. Но это из-за того, что вы, вероятно, думаете о функции этих конкретных типов и концентрируетесь на их различиях.&lt;/p&gt;
						&lt;p&gt;Но представьте, что каждый элемент и часть текста в DOM-дереве имеет предка; этот предок является либо потомком другого элемента (например, когда img вложен в элемент p), либо самым верхним элементом DOM-дерева (который является специальным случаем для каждого документа, и с которым вы используете элемент html). Также представьте, что оба элемента и текст имеют тип. Типом элемента, очевидно, является element; типом текста - text. Каждый узел имеет также четко определенную структуру: имеет ли он узел (или узлы) ниже себя, такие как элементы-потомки? Имеет ли он одноуровневые узлы (узлы &amp;quot;next to&amp;quot; элемента или текста)? Какому документу принадлежит каждый узел?&lt;/p&gt;
						&lt;p&gt;Очевидно, что многое из этого звучит довольно абстрактно. Фактически, может даже показаться глупой фраза, что типом элемента является … ммм… элемент. Однако вы должны абстрагироваться для представления значения узла как общего объектного типа.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Общий объектный тип&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Одним из действий, которое вы будете выполнять чаще, чем любое другое в вашем DOM-коде, является навигация по DOM-дереву страницы. Например, вы можете найти форму по ее атрибуту &amp;quot;id&amp;quot; и начать работать с элементами и текстом, вложенными в эту форму. К ним могут относиться текстовые инструкции, метки для полей вода, элементы ввода и, возможно, другие HTML-элемента, такие как img и ссылки (элементы a). Если элементы и текст имеют полностью различные типы, тогда вы должны написать совершенно разные фрагменты кода для перемещения от одного типа к другому.&lt;/p&gt;
						&lt;p&gt;Ситуация меняется, если вы используете общий тип узла. В этом случае вы можете просто перемещаться от узла к узлу и беспокоиться о типе только тогда, когда вы захотите сделать что-нибудь конкретное с элементом или текстом. Когда вы просто перемещаетесь по DOM-дереву, то будете использовать те же операции для перемещения к предку элемента или его потомку, что и с любым другим типом узла. Вы должны работать по-особому с таким типом узла как элемент или текст только тогда, когда требуется что-то конкретное от определенного типа узла, например атрибуты элемента. Представление о каждом объекте в DOM-дереве просто как об узле намного упрощает работу. Думая так, я далее рассмотрю, что именно должна предложить конструкция DOM Node (начиная с ее свойств и методов).&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Свойства узла&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;При работе с узлами DOM-дерева вам могут понадобиться несколько свойств и методов. Давайте рассмотри их первыми. Основными свойствами DOM-узла являются:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * nodeName хранит имя узла (подробнее ниже).&lt;br /&gt;&amp;#160; &amp;#160; * nodeValue хранит &amp;quot;значение&amp;quot; узла (подробнее ниже).&lt;br /&gt;&amp;#160; &amp;#160; * parentNode возвращает предка узла. Помните: каждый элемент, атрибут и текст имеет родительский узел.&lt;br /&gt;&amp;#160; &amp;#160; * childNodes список потомков узла. При работе с HTML этот список полезен только тогда, когда вы имеете дело с элементом; текстовые узлы и узлы-атрибуты не имеют потомков.&lt;br /&gt;&amp;#160; &amp;#160; * firstChild это просто сокращение для первого узла в списке childNodes.&lt;br /&gt;&amp;#160; &amp;#160; * lastChild это еще одно сокращение - для последнего узла в списке childNodes.&lt;br /&gt;&amp;#160; &amp;#160; * previousSibling возвращает узел, находящийся перед текущим узлом. Другими словами, он возвращает узел, предшествующий текущему в списке childNodes его предка (если не понятно - перечитайте это последнее предложение).&lt;br /&gt;&amp;#160; &amp;#160; * nextSibling свойство, аналогичное previousSibling; возвращает следующий узел в спиcке childNodes предка.&lt;br /&gt;&amp;#160; &amp;#160; * attributes полезно только для узлов-элементов; возвращает список атрибутов элемента.&lt;/p&gt;
						&lt;p&gt;Несколько других свойств применяются с более общими XML-документами и почти не применяются при работе с Web-страницами, основанными на HTML.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Необычные свойства&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Большинство из определенных выше свойств не требует дополнительного пояснения, за исключением свойств nodeName и nodeValue. Вместо простого объяснения этих свойств рассмотрим пару странных вопросов. Каким должно быть свойство nodeName для текстового узла? И, аналогично, каким должно быть свойство nodeValue для элемента?&lt;/p&gt;
						&lt;p&gt;Если эти вопросы поставили вас в тупик, значит вы уже понимаете потенциальную запутанность, присущую этим свойствам. nodeName и nodeValue действительно не применимы для всех типов узлов (это также истинно для некоторых других свойств узла). Это демонстрирует ключевую концепцию: любое их этих свойств может возвратить нулевое значение (иногда показываемое в javascript как &amp;quot;undefined&amp;quot;). То есть, например, свойство nodeName для текстового узла равно null (или &amp;quot;undefined&amp;quot; в некоторых браузерах), поскольку текстовые узлы не имеют имени. nodeValue, как и ожидалось, возвращает текст узла.&lt;/p&gt;
						&lt;p&gt;Аналогично, элементы имеют nodeName (имя элемента), но значение свойства nodeValue всегда равно null. Атрибуты имеют значения обоих свойств nodeName и nodeValue. Я поговорю об этих индивидуальных типах подробнее в следующем разделе, но поскольку эти свойства являются частью каждого узла, их стоит упомянуть здесь.&lt;/p&gt;
						&lt;p&gt;Теперь посмотрим на листинг 1, в котором показано несколько свойств узла в действии.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 1. Использование свойств узла в DOM&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;   // Эти две первые строки получают DOM-дерево текущей Web-страницы,  
    //   и затем элемент &amp;lt;html&amp;gt; для этого дерева
    var myDocument = document;
    var htmlElement = myDocument.documentElement;
    // Какое имя элемента &amp;lt;html&amp;gt;? &amp;quot;html&amp;quot;
    alert(&amp;quot;The root element of the page is &amp;quot; + htmlElement.nodeName);
    // Ищем элемент &amp;lt;head&amp;gt;
    var headElement = htmlElement.getElementsByTagName(&amp;quot;head&amp;quot;)[0];
    if (headElement != null) {
      alert(&amp;quot;We found the head element, named &amp;quot; + headElement.nodeName);
      // Отображаем элемент title страницы
      var titleElement = headElement.getElementsByTagName(&amp;quot;title&amp;quot;)[0];
      if (titleElement != null) {
        // text будет первым дочерним узлом элемента &amp;lt;title&amp;gt;
        var titleText = titleElement.firstChild;
        // Мы можем получить текст текстового узла, используя nodeValue
        alert(&amp;quot;The page title is &#039;&amp;quot; + titleText.nodeValue + &amp;quot;&#039;&amp;quot;);
      }
      // После &amp;lt;head&amp;gt; идет &amp;lt;body&amp;gt;
      var bodyElement = headElement.nextSibling;
      while (bodyElement.nodeName.toLowerCase() != &amp;quot;body&amp;quot;) {
        bodyElement = bodyElement.nextSibling;
      }
      // Мы нашли элемент &amp;lt;body&amp;gt;...
// Мы сделаем больше, когда узнаем некоторые методы узлов.
    }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;Методы узла&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Рассмотрим методы, доступные всем узлам (как и в ситуации со свойствами я пропустил несколько методов, которые не применяются в большинстве операций HTML DOM):&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * insertBefore(newChild, referenceNode) вставляет узел newChild перед referenceNode. Помните о том, что вы должны вызывать его в предназначенном предке newChild.&lt;br /&gt;&amp;#160; &amp;#160; * replaceChild(newChild, oldChild) замещает узел oldChild узлом newChild.&lt;br /&gt;&amp;#160; &amp;#160; * removeChild(oldChild) удаляет узел oldChild из узла, в котором выполняется функция.&lt;br /&gt;&amp;#160; &amp;#160; * appendChild(newChild) добавляет узел newChild к узлу, в котором выполняется функция. newChild добавляется в конце потомков целевого узла.&lt;br /&gt;&amp;#160; &amp;#160; * hasChildNodes() возвращает true, если вызываемый узел имеет потомков, и false, если не имеет.&lt;br /&gt;&amp;#160; &amp;#160; * hasAttributes() возвращает true, если вызываемый узел имеет атрибуты, и false, если не имеет.&lt;/p&gt;
						&lt;p&gt;Вы заметите, что, по большей части, все эти методы имеют дело с потомками узла. Это их первичное назначение. Если вы просто пытаетесь собрать значение текстового узла или имя элемента, то, возможно, не часто будете вызывать методы, поскольку можно просто использовать свойства узла. Код, приведенный в листинге 2, создан на основе кода из листинга 1 и использует несколько из перечисленных выше методов.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 2. Использование методов узла в DOM&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;// Эти две первые строки получают DOM-дерево текущей Web-страницы,  
    //   и затем элемент &amp;lt;html&amp;gt; для этого дерева
    var myDocument = document;
    var htmlElement = myDocument.documentElement;
    // Какое имя элемента &amp;lt;html&amp;gt;? &amp;quot;html&amp;quot;
    alert(&amp;quot;The root element of the page is &amp;quot; + htmlElement.nodeName);
    // Ищем элемент &amp;lt;head&amp;gt;
    var headElement = htmlElement.getElementsByTagName(&amp;quot;head&amp;quot;)[0];
    if (headElement != null) {
      alert(&amp;quot;We found the head element, named &amp;quot; + headElement.nodeName);
      // Отображаем элемент title страницы
      var titleElement = headElement.getElementsByTagName(&amp;quot;title&amp;quot;)[0];
      if (titleElement != null) {
        // text будет первым дочерним узлом элемента &amp;lt;title&amp;gt;
        var titleText = titleElement.firstChild;
        // Мы можем получить текст текстового узла, используя nodeValue
        alert(&amp;quot;The page title is &#039;&amp;quot; + titleText.nodeValue + &amp;quot;&#039;&amp;quot;);
      }
      // После &amp;lt;head&amp;gt; идет &amp;lt;body&amp;gt;
      var bodyElement = headElement.nextSibling;
      while (bodyElement.nodeName.toLowerCase() != &amp;quot;body&amp;quot;) {
        bodyElement = bodyElement.nextSibling;
      }
      // Мы нашли элемент &amp;lt;body&amp;gt;...
      // Удалить все элементы &amp;lt;img&amp;gt; верхнего уровня из тела
      if (bodyElement.hasChildNodes()) {
        for (i=0; i&amp;lt;bodyElement.childNodes.length; i++) {
          var currentNode = bodyElement.childNodes[i];
          if (currentNode.nodeName.toLowerCase() == &amp;quot;img&amp;quot;) {
bodyElement.removeChild(currentNode);
          }
        }
      }
    }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Выполните тестирование!&lt;/p&gt;
						&lt;p&gt;До сих пор вы видели только два примера (листинг 1 и 2), но они должны дать вам понятие о том, что можно сделать при запуске управления DOM-деревом. Если вы хотите попробовать поработать с кодом, просто сохраните листинг 3 в HTML-файле и загрузите его в ваш Web-браузер.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 3. HTML-файл с некоторым javascript-кодом, использующим DOM&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;javascript and the DOM&amp;lt;/title&amp;gt;
&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt;
   function test() {
    // Эти две первые строки получают DOM-дерево текущей Web-страницы,
    //   и затем элемент &amp;lt;html&amp;gt; для этого дерева
    var myDocument = document;
    var htmlElement = myDocument.documentElement;
    // Какое имя элемента &amp;lt;html&amp;gt;? &amp;quot;html&amp;quot;
    alert(&amp;quot;The root element of the page is &amp;quot; + htmlElement.nodeName);
    // Ищем элемент &amp;lt;head&amp;gt;
    var headElement = htmlElement.getElementsByTagName(&amp;quot;head&amp;quot;)[0];
    if (headElement != null) {
      alert(&amp;quot;We found the head element, named &amp;quot; + headElement.nodeName);
      // Отображаем элемент title страницы
      var titleElement = headElement.getElementsByTagName(&amp;quot;title&amp;quot;)[0];
      if (titleElement != null) {
        // text будет первым дочерним узлом элемента &amp;lt;title&amp;gt; 
        var titleText = titleElement.firstChild;
        // Мы можем получить текст текстового узла, используя nodeValue
        alert(&amp;quot;The page title is &#039;&amp;quot; + titleText.nodeValue + &amp;quot;&#039;&amp;quot;);
      }
      // После &amp;lt;head&amp;gt; идет &amp;lt;body&amp;gt;
      var bodyElement = headElement.nextSibling;
      while (bodyElement.nodeName.toLowerCase() != &amp;quot;body&amp;quot;) {
        bodyElement = bodyElement.nextSibling;
      }
      // Мы нашли элемент &amp;lt;body&amp;gt;...
      // Удалить все элементы &amp;lt;img&amp;gt; верхнего уровня из тела
      if (bodyElement.hasChildNodes()) {
        for (i=0; i&amp;lt;bodyElement.childNodes.length; i++) {
          var currentNode = bodyElement.childNodes[i];
          if (currentNode.nodeName.toLowerCase() == &amp;quot;img&amp;quot;) {
            bodyElement.removeChild(currentNode);
          }
        }
      }
    }
  }
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;javascript and DOM are a perfect match. 
     You can read more in &amp;lt;i&amp;gt;Head Rush Ajax&amp;lt;/i&amp;gt;.&amp;lt;/p&amp;gt;
&amp;lt;img src=&amp;quot;http://www.headfirstlabs.com/Images/hraj_cover-150.jpg&amp;quot; /&amp;gt;
&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;Test me!&amp;quot; onclick=&amp;quot;test();&amp;quot; /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;После загрузки этой страницы в ваш браузер вы должны увидеть что-то похоже на рисунок 1.&lt;/p&gt;
						&lt;p&gt;Рисунок 1. Пример HTML-страницы с кнопкой для запуска javascript&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s1/98/2d/6e/3b/982d6e3b31367da380c9c1e1d1466203.jpg&quot; alt=&quot;http://pics.kz/s1/98/2d/6e/3b/982d6e3b31367da380c9c1e1d1466203.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Нажмите кнопку Test me! и вы увидите окна предупреждений, показанные на рисунке 2.&lt;/p&gt;
						&lt;p&gt;Рисунок 2. Окна предупреждений, показывающие имя элемента при помощи nodeValue&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s5/3b/fe/cf/55/3bfecf55dca09d271f3f5104f9079708.jpg&quot; alt=&quot;http://pics.kz/s5/3b/fe/cf/55/3bfecf55dca09d271f3f5104f9079708.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Когда код завершает работу, изображения удаляются со страницы в режиме реального времени, как показано на рисунке 3.&lt;/p&gt;
						&lt;p&gt;Рисунок 3. Изображения удаляются со страницы в режиме реального времени при помощи javascript&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s3/0e/89/82/6a/0e89826a803144713e9e4dc9bceb205e.jpg&quot; alt=&quot;http://pics.kz/s3/0e/89/82/6a/0e89826a803144713e9e4dc9bceb205e.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Замечания по дизайну API&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Посмотрите опять на свойства и методы, доступные каждому узлу. Они иллюстрируют ключевой момент DOM для тех, кто комфортно чувствует себя в объектно-ориентированном (OO) программировании: DOM не является таким уж объектно-ориентированным API. Во-первых, во многих ситуациях вы будете использовать свойства объекта напрямую, без вызова метода объекта node. Нет метода getNodeName(), например; вы просто сразу используете свойство nodeName. То есть, объекты node (а также и другие DOM-объекты) выставляют многие из своих данных через свойства, а не функции.&lt;/p&gt;
						&lt;p&gt;Во-вторых, именование объектов и методов в DOM может показаться немного странным, если вы работали с перегруженными объектами и объектно-ориентированными API, в частности, в таких языках как Java или C++. DOM должен работать в C, Java и javascript (перечислим только их), поэтому при проектировании API были сделаны некоторые уступки. Например, вы увидите два различных метода объекта NamedNodeMap, которые выглядят примерно так:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * getNamedItem(String name)&lt;br /&gt;&amp;#160; &amp;#160; * getNamedItemNS(Node node)&lt;/p&gt;
						&lt;p&gt;Для OO-программистов это выглядит довольно странным. Два метода с одинаковым предназначением, но один в качестве параметра принимает String, а другой Node. В большинстве OO API вы использовали бы одно и то же название метода для обеих версий. Виртуальная машина, выполняющая ваш код, распознавала бы, какой метод использовать на основе типа объекта, переданного вами в метод.&lt;/p&gt;
						&lt;p&gt;Проблема состоит в том, что javascript не поддерживает эту технологию, называемую перегрузкой методов. Другими словами, javascript требует наличия одного метода или функции с данным именем. Поэтому, если у вас есть метод getNamedItem(), принимающий строку, вы не можете иметь любой другой метод или функцию с именем getNamedItem(), даже если вторая версия принимает различные типы аргументов (или даже принимает совершенно другой набор аргументов). javascript выдаст ошибку, и ваш код не будет работать так, как по вашему мнению должен работать.&lt;/p&gt;
						&lt;p&gt;По существу, DOM сознательно избегает перегрузки методов и других технологий OO-программирования. Это гарантирует, что API будет работать в нескольких языках, включая те, которые не поддерживают технологии OO-программирования. В результате вы должны просто изучить несколько дополнительных названий методов. Положительная сторона - вы можете изучать DOM в любом языке программирования, например Java, и знать, что эти же названия методов и конструкций кода будут работать в любых других языках, имеющих реализацию DOM, например, javascript.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Пусть побеспокоится программист&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Что же касается дизайна API в общем (допустим, вы внимательно его изучили), то вы можете удивиться: &amp;quot;Зачем нужны свойства типа node, которые не являются общими для всех?&amp;quot; Это хороший вопрос, а ответ лежит больше в области политики и принятия решений, чем каких-либо технических причин. Короче говоря, ответ такой, &amp;quot;Кто его знает! Но это немного раздражает, не так ли?&amp;quot;&lt;/p&gt;
						&lt;p&gt;Свойство nodeName предназначено для того, чтобы каждый тип имел имя; но во многих ситуациях это имя либо не определено, либо является странным, внутренним именем, не имеющим значения для программистов (например, в Java, nodeName текстового узла имеет значение &amp;quot;#text&amp;quot; во многих ситуациях). По существу, вы должны предположить, что обработка ошибок оставлена для вас. Не безопасно просто обращаться к myNode.nodeName и затем использовать это значение; во многих ситуациях значение будет равно null. Поэтому, как часто бывает в программировании, пусть побеспокоится программист.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Общие типы узлов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Теперь, узнав о некоторых возможностях и свойствах DOM-узла (а также о некоторых его странностях), вы готовы узнать о некоторых конкретных типах узлов, с которыми будете работать. В большинстве Web-приложений вы будете работать только с четырьмя типами узлов:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Узел document представляет HTML-документ в целом.&lt;br /&gt;&amp;#160; &amp;#160; * Узлы element представляют HTML-элементы, например a или img.&lt;br /&gt;&amp;#160; &amp;#160; * Узлы attribute представляют атрибуты HTML-элементов, например href (элемента a) или src (элемента img).&lt;br /&gt;&amp;#160; &amp;#160; * Узлы text представляют текст в HTML-документе, например &amp;quot;Нажмите на ссылку ниже для получения полного списка&amp;quot;. Это текст, появляющийся внутри таких элементов как p, a или h2.&lt;/p&gt;
						&lt;p&gt;При работе с HTML вы будете работать с этими типами узлов примерно 95% времени. Поэтому я потрачу оставшуюся часть статьи этого месяца на их детальное рассмотрение. Когда я буду рассматривать XML в будущей статье, то познакомлю вас с некоторыми другими типами узлов.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Узел document&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Первый тип узла - это тип, который вы будете использовать почти в каждом фрагменте своего DOM-кода: узел document. Узел document на самом деле является не элементом HTML (или XML) страницы, а самой страницей. Следовательно, в HTML Web-странице узел document - это DOM-дерево полностью. В javascript вы можете обратиться к узлу document при помощи ключевого слова document:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;// Эти две первые строки получают DOM-дерево текущей Web-страницы,
//   и затем элемент &amp;lt;html&amp;gt; для этого дерева
var myDocument = document;
var htmlElement = myDocument.documentElement;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Ключевое слово document в javascript возвращает DOM-дерево текущей Web-страницы. С этого момента вы можете работать с любыми узлами в дереве.&lt;/p&gt;
						&lt;p&gt;Вы можете также использовать объект document для создания новых узлов, используя следующие методы:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * createElement(elementName) создает элемент с указанным именем.&lt;br /&gt;&amp;#160; &amp;#160; * createTextNode(text) создает новый текстовый узел с указанным текстом.&lt;br /&gt;&amp;#160; &amp;#160; * createAttribute(attributeName) создает новый атрибут с указанным именем.&lt;/p&gt;
						&lt;p&gt;Главное, что необходимо отметить - эти методы создают узлы, но не присоединяют их или не вставляют их в какой-нибудь конкретный документ. Для этого вы должны использовать один из уже рассмотренных методов, например insertBefore() или appendChild(). Следовательно, для создания и добавления нового элемента в документ вы можете использовать следующий код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;var 
pElement = myDocument.createElement(&amp;quot;p&amp;quot;);
var text = myDocument.createTextNode(&amp;quot;Here&#039;s some text in a p element.&amp;quot;);
pElement.appendChild(text);
bodyElement.appendChild(pElement);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;После использования элемента document для получения доступа к DOM-дереву Web-страницы вы готовы начать работу непосредственно с элементами, атрибутами и текстом.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Узлы element&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Хотя вы будете часто работать с узлами element, многие из операций, которые вы должны будете выполнять с элементами, включают методы и свойства, общие для всех узлов, а не только для элементов. Только два набора методов специфичны для элементов:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;1. Методы, относящиеся к работе с атрибутами:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * getAttribute(name) возвращает значение атрибута с именем name.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * removeAttribute(name) удаляет атрибут с именем name.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * setAttribute(name, value) создает атрибут с именем name и устанавливает его значение в value.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * getAttributeNode(name) возвращает узел attribute с именем name (узлы attribute описаны ниже).&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * removeAttributeNode(node) удаляет узел attribute, соответствующий указанному node.&lt;br /&gt;&amp;#160; &amp;#160;2. Методы, относящиеся к поиску вложенных элементов:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * getElementsByTagName(elementName) возвращает список узлов элементов с указанным именем.&lt;/p&gt;
						&lt;p&gt;Это все довольно понятно, но все равно просмотрите некоторые примеры.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Работа с атрибутами&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Работать с атрибутами довольно просто; например, вы можете создать новый элемент img с объектом document и установить некоторые из его атрибутов:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 12em&quot;&gt;&lt;pre&gt;var 
imgElement = document.createElement(&amp;quot;img&amp;quot;);
imgElement.setAttribute(&amp;quot;src&amp;quot;, &amp;quot;http://www.headfirstlabs.com/Images/hraj_cover-150.jpg&amp;quot;);
imgElement.setAttribute(&amp;quot;width&amp;quot;, &amp;quot;130&amp;quot;);
imgElement.setAttribute(&amp;quot;height&amp;quot;, &amp;quot;150&amp;quot;);
bodyElement.appendChild(imgElement);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Теперь это должно выглядеть однообразной работой. Фактически, вы должны начать понимать, что если знаете концепцию узла и доступные методы, работа с DOM в ваших Web-страницах и javascript-коде становится простой. В приведенном выше коде javascript создает новый элемент img, устанавливает некоторые атрибуты и добавляет его в тело HTML-страницы.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Поиск вложенных элементов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Легко также найти вложенные элементы. Например, вот код, который я использовал для поиска и удаления всех элементов img в HTML-странице из листинга 3:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 16.5em&quot;&gt;&lt;pre&gt; // Удалить все элементы &amp;lt;img&amp;gt; верхнего уровня из тела
      if (bodyElement.hasChildNodes()) {
        for (i=0; i&amp;lt;bodyElement.childNodes.length; i++) {
          var currentNode = bodyElement.childNodes[i];
          if (currentNode.nodeName.toLowerCase() == &amp;quot;img&amp;quot;) {
            bodyElement.removeChild(currentNode);
          }
        }
      }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Вы можете достичь аналогичного эффекта, используя getElementsByTagName():&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 12em&quot;&gt;&lt;pre&gt;// Удалить все элементы &amp;lt;img&amp;gt; верхнего уровня из тела
      var imgElements = bodyElement.getElementsByTagName(&amp;quot;img&amp;quot;);
      for (i=0; i&amp;lt;imgElements.length; i++) {
        var imgElement = imgElements.item[i];
        bodyElement.removeChild(imgElement);
      }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;Узлы attribute&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;DOM представляет атрибуты как узлы, и вы всегда можете получить атрибуты элемента, используя свойство attributes элемента, как показано ниже:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 24em&quot;&gt;&lt;pre&gt;// Удалить все элементы &amp;lt;img&amp;gt; верхнего уровня из тела
      var imgElements = bodyElement.getElementsByTagName(&amp;quot;img&amp;quot;);
      for (i=0; i&amp;lt;imgElements.length; i++) {
        var imgElement = imgElements.item[i];
        // Вывести некоторую информацию об этом элементе
        var msg = &amp;quot;Found an img element!&amp;quot;;
        var atts = imgElement.attributes;
        for (j=0; j&amp;lt;atts.length; j++) {
          var att = atts.item(j);
          msg = msg + &amp;quot;\n  &amp;quot; + att.nodeName + &amp;quot;: &#039;&amp;quot; + att.nodeValue + &amp;quot;&#039;&amp;quot;;
        }
        alert(msg);
        bodyElement.removeChild(imgElement);
      }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Странная ситуация с атрибутами&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Атрибуты - это немного особый случай в DOM. С одной стороны, атрибуты на самом деле не являются потомками элементов, подобно другим элементам или тексту; другими словами, они не появляются &amp;quot;под&amp;quot; элементом. В то же время они имеют очевидную взаимосвязь с элементом; элемент &amp;quot;владеет&amp;quot; своими атрибутами. DOM использует узлы для представления атрибутов и делает их доступными элементу через специальный список. То есть, атрибуты являются частью DOM-дерева, но они часто не появляются в дереве. Достаточно сказать, что взаимосвязь атрибутов с остальной структурой DOM-дерева немного туманна.&lt;/p&gt;
						&lt;p&gt;Стоит отметить, что свойство attributes на самом деле принадлежит типу node, а не только типу element. Немного странно и не влияет на ваше кодирование, но это надо знать.&lt;/p&gt;
						&lt;p&gt;Хотя определенно можно работать с узлами attribute, часто проще использовать доступные для класса элемента методы для работы с атрибутами. Перечислим эти методы:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * getAttribute(name) возвращает значение атрибута с именем name.&lt;br /&gt;&amp;#160; &amp;#160; * removeAttribute(name) удаляет атрибут с именем name.&lt;br /&gt;&amp;#160; &amp;#160; * setAttribute(name, value) создает атрибут с именем name и устанавливает его значение в value.&lt;/p&gt;
						&lt;p&gt;Эти три метода не требуют от вас работы непосредственно с узлами attribute. Вместо них вы можете просто устанавливать и удалять атрибуты и их значения при помощи простых строковых свойств.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Узлы text&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Последний тип узла, о котором стоит позаботиться (по крайней мере, в HTML DOM-деревьях), - это узел text. Почти все свойства, которые вы обычно будете использовать с узлами text, доступны на объекте node. Фактически, вы будете обычно использовать свойство nodeValue для получения текста из узла text так, как показано ниже:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 13.5em&quot;&gt;&lt;pre&gt;var 
pElements = bodyElement.getElementsByTagName(&amp;quot;p&amp;quot;);
for (i=0; i&amp;lt;pElements.length; i++) {
  var pElement = pElements.item(i);
  var text = pElement.firstChild.nodeValue;
  alert(text);
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Несколько других методов специфичны для узлов text. Они относятся к добавлению или разбиению данных в узле:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * appendData(text) добавляет предоставленный вами текст в конец существующего в узле text текста.&lt;br /&gt;&amp;#160; &amp;#160; * insertData(position, text) позволяет вам вставлять данные в середину узла text. Он вставляет предоставленный вами текст в указанную позицию.&lt;br /&gt;&amp;#160; &amp;#160; * replaceData(position, length, text) удаляет указанное количество символов, начинающихся с указанной позиции, и помещает предоставленный вами текст на место удаленного.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Какой тип узла?&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Все, что вы видели до сих пор, предполагает, что вы уже знаете, с каким типом узла работаете, хотя это не всегда так. Например, если вы перемещаетесь по DOM-дереву и работаете с общими типами node, то не знаете, переместились ли на элемент или на текст. Вы можете получить всех потомков элемента p и не быть уверенным, работаете ли с текстом, с элементом b, или, возможно, с элементом img. В этих случаях вы должны будете определить тип узла перед тем, как сможете его использовать.&lt;/p&gt;
						&lt;p&gt;К счастью, определить это довольно просто. Тип DOM-узла определяет несколько констант:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;1. Node.ELEMENT_NODE - константа для типа узла element.&lt;br /&gt;&amp;#160; &amp;#160;2. Node.ATTRIBUTE_NODE - константа для типа узла attribute.&lt;br /&gt;&amp;#160; &amp;#160;3. Node.TEXT_NODE - константа для типа узла text.&lt;br /&gt;&amp;#160; &amp;#160;4. Node.DOCUMENT_NODE - константа для типа узла document.&lt;/p&gt;
						&lt;p&gt;Существует несколько других типов узлов, но при работе с HTML вы редко будете использовать какие-либо типы, кроме этих. Также я умышленно не привожу значений каждой из этих констант, хотя они определены в спецификации DOM; вы никогда не будете иметь дело со значениями непосредственно, поскольку именно для этого и нужны константы!&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Свойство nodeType&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Вы можете также использовать свойство nodeType (которое определяется для DOM-узла и поэтому доступно для всех узлов) для сравнения узла с перечисленными выше константами, как показано ниже:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 18em&quot;&gt;&lt;pre&gt;var
 someNode = document.documentElement.firstChild;
if (someNode.nodeType == Node.ELEMENT_NODE) {
  alert(&amp;quot;We&#039;ve found an element node named &amp;quot; + someNode.nodeName);
} else if (someNode.nodeType == Node.TEXT_NODE) {
  alert(&amp;quot;It&#039;s a text node; the text is &amp;quot; + someNode.nodeValue);
} else if (someNode.nodeType == Node.ATTRIBUTE_NODE) {
  alert(&amp;quot;It&#039;s an attribute named &amp;quot; + someNode.nodeName 
                        + &amp;quot; with a value of &#039;&amp;quot; + someNode.nodeValue + &amp;quot;&#039;&amp;quot;);
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Это довольно простой пример, но его главный смысл - получение типа узла является простой операцией. Более сложно определить, что делать с узлом после того, как станет известен его тип; но, имея твердые знания того, что предлагают типы node, text, attribute и elements, вы готовы взять DOM-программирование в свои руки.&lt;/p&gt;
						&lt;p&gt;Хорошо, почти.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Искажение в работе&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Похоже, что свойство nodeType является пропуском для работы с узлами - оно позволяет вам определить тип узла, с которым вы работаете, и написать код для работы с этим узлом. Проблема заключается в том, что определенные выше константы Node не работают правильно в Internet Explorer. То есть, если вы используете Node.ELEMENT_NODE, Node.TEXT_NODE или любую другую константу в вашем коде, Internet Explorer возвратит ошибку, аналогичную изображенной на рисунке 4.&lt;/p&gt;
						&lt;p&gt;Рисунок 4. Internet Explorer выдает ошибку&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s3/92/06/ca/2e/9206ca2ea8bd8cf267a18a9d680863b0.jpg&quot; alt=&quot;http://pics.kz/s3/92/06/ca/2e/9206ca2ea8bd8cf267a18a9d680863b0.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Internet Explorer всегда будет выдавать эту ошибку при использовании констант Node в вашем javascript. Поскольку большинство людей в мире все еще использует Internet Explorer, вы поступили бы правильно, избегая использования в вашем коде таких конструкций как Node.ELEMENT_NODE или Node.TEXT_NODE. Даже если в Internet Explorer 7.0 (в следующей версии Internet Explorer), предположительно, эта проблема будет исправлена, пройдет не мало лет, пока Internet Explorer 6.x выйдет из активного употребления. Потому избегайте использования Node; важно, чтобы ваш DOM-код (и ваши Ajax-приложения) работали на всех главных браузерах.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;В заключение&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Вы готовы к славе?&lt;/p&gt;
						&lt;p&gt;Если вы действительно готовы к изучению и, в конечном счете, овладению DOM, то будете находиться на вершине профессионального уровня в Web-программировании. Большинство Web-программистов знает, как использовать javascript для написания перебора изображений или сбора данных из формы, а некоторые даже чувствуют себя комфортно, передавая запросы и получая ответы от сервера (это определенно должны быть вы после прочтения первых нескольких статей данной серии). Но реальное изменение структуры Web-страницы &amp;quot;на лету&amp;quot; - это не для слабонервных или неопытных.&lt;/p&gt;
						&lt;p&gt;Вы узнали совсем не много в последних нескольких статьях этой серии. Теперь вы не должны бездельничать и ждать следующей статьи, надеясь, что я расскажу обо всех остроумных применениях DOM-дерева. Исследование того, как можно создать необычные эффекты или искусные интерфейсы при помощи DOM, - это сейчас ваше домашнее задание. Вспомните о том, что вы изучили в последних двух статьях, и начните экспериментировать. Подумайте, сможете ли вы создать Web-сайт, который выглядит как настольная прикладная программа, где объекты перемещаются по экрану в ответ на действие пользователя.&lt;/p&gt;
						&lt;p&gt;Еще лучше, проведите границы вокруг каждого объекта на экране, так чтобы вы смогли видеть, где находятся объекты в DOM-дереве, и начните перемещать их. Создайте узлы и добавьте их к существующим спискам потомков; удалите узлы, имеющие большое количество вложенных узлов; измените CSS-стиль узла и посмотрите, повлияли ли эти изменения на дочерние узлы. Возможности безграничны, и каждый раз, попытавшись сделать что-то новое, вы узнаете что-то новое. Удачи в экспериментах с вашими Web-страницами.&lt;/p&gt;
						&lt;p&gt;Далее, в готовящейся финальной части этой DOM-трилогии, я покажу вам, как внедрить некоторые замечательные и интересные применения DOM в ваше программирование. Я перестану говорить концептуально и объяснять API, а покажу некоторый код. А пока найдите какие-либо умные идеи и посмотрите, сможете ли вы их воплотить самостоятельно.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (TaronTo)</author>
			<pubDate>Wed, 23 Dec 2009 17:13:14 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=35#p35</guid>
		</item>
		<item>
			<title>Использование DOM для создания Web-приложений с быстрой реакцией</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=34#p34</link>
			<description>&lt;p&gt;Источник: wwwibm.com&lt;br /&gt;Уровень сложности: простой&lt;br /&gt;Брэт Маклафлин, автор и редактор, O&#039;Reilly Media Inc.&lt;br /&gt;14.03.2006&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; Водораздел между программистами (работающими с серверными приложениями) и Web-программистами (тратящими свое время на HTML, CSS и javascript) существует уже давно. Однако Document Object Model (DOM) ликвидировала пропасть и сделала работу с XML на сервере и с HTML на клиентском компьютере возможной и эффективной. В этой статье Брэт МакЛафлин знакомит с Document Object Model, объясняет ее использование в Web-страницах и начинает исследовать ее использование с javascript.&lt;/p&gt;
						&lt;p&gt;Как и многие Web-программисты вы, возможно, работали с HTML. С HTML программисты начинают работу над Web-страницей; HTML часто является последней вещью, которую они делают по завершении работы с приложением или сайтом, вылизывая до последнего бита размещение, цвет или стиль. И, таким же обычным, как и использование HTML, является неправильное представление о том, что на самом деле происходит с HTML, когда он поступает в браузер для визуализации на экране. Перед тем как я углублюсь в то, что, по вашему мнению, может происходить (и почему это, вероятно, не правильно), я хочу прояснить информацию о процессах, вовлеченных в проектирование и обслуживание Web-страниц:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;1. Некто (обычно, вы!) создает HTML в текстовом редакторе или IDE.&lt;br /&gt;&amp;#160; &amp;#160;2. Затем вы загружаете HTML на Web-сервер, например, Apache HTTPD, и делаете его общедоступным по Интернет или интранет.&lt;br /&gt;&amp;#160; &amp;#160;3. Пользователь запрашивает вашу Web-страницу в браузере, например Firefox или Safari.&lt;br /&gt;&amp;#160; &amp;#160;4. Браузер пользователя выполняет запрос HTML на ваш Web-сервер.&lt;br /&gt;&amp;#160; &amp;#160;5. Браузер визуализирует страницу, полученную от сервера, в графическом и текстовом виде; пользователи просматривают и активируют Web-страницу.&lt;/p&gt;
						&lt;p&gt;Хотя все это общеизвестно, вещи быстро становятся интересными. Фактически, огромное количество &amp;quot;вещей&amp;quot;, происходящих между шагами 4 и 5, и является предметом рассмотрения данной статьи. Термин &amp;quot;вещь&amp;quot; действительно применим, поскольку большинство программистов никогда не задумываются о том, что действительно происходит с их размеченным документом, когда браузер пользователя запрашивает его для отображения:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Читает ли браузер просто текст в HTML и отображает его?&lt;br /&gt;&amp;#160; &amp;#160; * Как насчет CSS, особенно если CSS находится во внешнем файле?&lt;br /&gt;&amp;#160; &amp;#160; * И как насчет javascript - опять же, часто, во внешнем файле?&lt;br /&gt;&amp;#160; &amp;#160; * Как браузер обрабатывает эти элементы и как отображает обработчики событий, функции и стили на эту текстовую разметку?&lt;/p&gt;
						&lt;p&gt;Оказывается, ответом на все эти вопросы является Document Object Model. Поэтому давайте без излишней суеты углубимся в DOM.&lt;/p&gt;
						&lt;p&gt;Web-программисты и разметка&lt;/p&gt;
						&lt;p&gt;Для большинства программистов их работа заканчивается там, где начинается Web-браузер. Другими словами, закинув файл в каталог на вашем Web-сервере, вы обычно делаете пометку &amp;quot;сделано&amp;quot; и (с надеждой) никогда о нем больше не вспоминаете! Это отличная цель, когда нужно написать ясные, хорошо-организованные страницы; нет ничего плохого в ожидании того, что ваша разметка отображается должным образом во всех браузерах, с различными версиями CSS и javascript.&lt;/p&gt;
						&lt;p&gt;Проблема заключается в том, что такой подход ограничивает понимание программистом того, что на самом деле происходит в браузере. Более важно то, что он ограничивает вашу способность обновлять, изменять и реструктуризировать Web-страницу динамически, используя javascript на стороне клиента. Избавимся от этого ограничения и даже повысим интерактивность ваших Web-сайтов.&lt;/p&gt;
						&lt;p&gt;Что делает программист&lt;/p&gt;
						&lt;p&gt;Как типичный Web-программист, вы, возможно, запускаете ваш текстовый редактор и IDE и начинаете вводить HTML, CSS или даже javascript. Легко думать обо всех этих тегах, селекторах и атрибутах только как о небольших задачах, которые вы решаете для того, чтобы сайт выглядел должным образом. Но вы должны расширить ваши представления за эти рамки - представьте, что вы организуете ваше содержимое. Не беспокойтесь, я обещаю, что не превращу это в лекцию о красоте разметки или о том, что вы должны понять истинный потенциал вашей Web-страницы или что-либо еще метафизическое. Что вы действительно должны понимать точно - это какова ваша роль в Web-разработке.&lt;/p&gt;
						&lt;p&gt;Когда дело касается внешнего вида страницы, вы, в лучшем случае, можете только давать советы. Если вы предоставляете таблицу стилей CSS, пользователь может переопределить ваши варианты стиля. Когда вы предоставляете размер шрифта, браузер пользователя может изменить эти размеры для людей с проблемами зрения или масштабировать их для крупных мониторов (с одинаково крупными разрешениями). Даже выбранные вами цвета и гарнитуры шрифтов зависят от монитора пользователя и от установленных на его системе шрифтов. Конечно, здорово сделать из страницы шедевр, но на все это вы имеете не самое большое влияние.&lt;/p&gt;
						&lt;p&gt;Единственное, что находится под вашим абсолютным контролем - структура Web-страницы. Ваша разметка является неизменяемой, и пользователи не могут испортить ее; их браузеры могут только извлечь ее с вашего Web-сервера и отобразить (хотя и в стиле, больше соответствующем вкусу пользователя, а не вашему). Но организация этой страницы (находится ли слово в данном параграфе, или в другом теге div) полностью зависит от вас. Когда дело касается действительного изменения вашей страницы (что и делают большинство Ajax-приложений), вы работаете со структурой страницы. Хотя интересно изменить цвет фрагмента текста, намного более впечатляющим является добавление текста или целой секции на существующую страницу. Не важно, как пользователь меняет стиль этой секции - вы работаете с организацией самой страницы.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Что делает разметка&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Как только вы осознаете, что ваша разметка, на самом деле, только структура страницы, то сможете взглянуть на нее по-другому. Вместо того, чтобы считать, что тег h1 делает текст большим, жирным и черным, думайте о нем, как о заголовке. Как его видит пользователь (использует ли он ваш CSS, свой собственный или комбинацию обоих) - это второстепенный вопрос. То есть, представляйте разметку как средство обеспечения данного уровня структуры; p указывает, что текст находится в параграфе, img отмечает изображение, div разделяет страницу на секции и т.д.&lt;/p&gt;
						&lt;p&gt;Вы должны также четко понимать, что стиль и поведение (обработчики событий и javascript) применяются к этой структуре после ее создания. Разметка должна уже существовать перед тем, как с ней можно работать и накладывать стиль. То есть, так же как вы можете хранить CSS в отдельном файле от вашего HTML, структура вашей разметки отделена от ее стиля, форматирования и поведения. Хотя вы определенно можете менять стиль элемента или фрагмент текста из javascript, более интересным является действительное изменение структуры, на которой основана ваша разметка.&lt;/p&gt;
						&lt;p&gt;Как только вы будете помнить, что ваша разметка обеспечивает только структуру или &amp;quot;скелет&amp;quot; для вашей страницы, вы будете &amp;quot;на коне&amp;quot;. И более того, вы увидите, как браузер берет эту текстовую структуру и превращает ее во что-то намного более интересное - набор объектов, каждый из которых может изменяться, добавляться или удаляться.&lt;/p&gt;
						&lt;p&gt;Некоторые дополнительные мысли о разметке&lt;/p&gt;
						&lt;p&gt;Редактирование обычного текста: Правильно или нет?&lt;br /&gt;Обычные текстовые файлы идеальны для хранения разметки, но это не так для редактирования этой разметки. Вполне приемлемо использовать такие IDE как Macromedia DreamWeaver (или немного более навязчивую Microsoft® FrontPage®) для работы с разметкой Web-страницы. Эти интегрированные среды часто предлагают сокращенные команды и вспомогательную информацию при создании Web-страниц, особенно при использовании CSS и javascript, находящихся во внешних файлах относительно файла разметки страницы. Многие чудаки до сих пор предпочитают старый добрый Notepad или vi (признаюсь, я один из них), и это тоже отличный вариант. В любом случае конечный результат - это текстовый файл с разметкой.&lt;/p&gt;
						&lt;p&gt;Текст по сети: Хорошая вещь&lt;br /&gt;Как уже упоминалось, текст - это отличный носитель информации для документов, например, HTML или CSS, передаваемых по сети сотни и тысячи раз. Когда я говорю, что браузеру не просто представлять текст, это означает именно преобразование текста в визуальную и графическую страницу, которая отображается пользователю. Не имеет значения, как браузер на самом деле извлек страницу из Web-сервера; в данном случае текст все еще является лучшим вариантом.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Преимущества текстовой разметки&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Перед обсуждением Web-браузера стоит рассмотреть вопрос, почему обычный текст является абсолютно лучшим выбором для хранения вашего HTML-кода (дополнительная информация приведена в разделе &amp;quot;Некоторые дополнительные мысли о разметке&amp;quot;). Не вдаваясь глубоко в рассмотрение всех за и против, просто вспомните, что ваш HTML-код передается по сети в Web-браузер каждый раз при просмотре страницы (для простоты не будем учитывать кеширование и т.д.). Просто не существует более эффективного способа, чем передавать текст. Двоичные объекты, графическое представление страницы, реорганизованная разметка … все это труднее передать по сети, чем обычные текстовые файлы.&lt;/p&gt;
						&lt;p&gt;Добавим сюда и особенности браузера. Современные браузеры позволяют пользователям менять размер текста, масштабировать изображения, загружать CSS или javascript для страницы (в большинстве случаев) и многое другое - это все препятствует передаче в браузер какого-либо графического представления страницы. Вместо этого браузер нуждается в сыром HTML-коде, для того чтобы он сам смог применить какую-либо обработку к странице, а не полагаться на сервер при выполнении этой задачи. Таким же образом, отделение CSS от javascript и отделение их от HTML-разметки требует формата, который легко было бы, да-да, разделять. Текстовые файлы опять же являются отличным способом сделать именно это.&lt;/p&gt;
						&lt;p&gt;И последнее, но не менее важное: вспомните обещание новых стандартов HTML 4.01 и XHTML 1.0 и 1.1 отделить содержимое (данные вашей страницы) от представления и стиля (обычно выделенные в CSS). Для программистов отделение их HTML-кода от CSS и последующее указание браузеру извлечь некоторое представление страницы, описывающее методы повторного объединения всего, нивелируют многие преимущества этих стандартов. Хранение этих отдельных частей раздельно по всему пути до браузера обеспечивает браузерам наибольшую гибкость в получении HTML от сервера.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Подробнее о Web-браузерах&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Для некоторых из вас, все, что вы до сих пор прочитали, может быть забавным обзором вашей роли в процессе Web-разработки. Но когда дело доходит до вопроса, что же делает Web-браузер, многие из самых сообразительных Web-дизайнеров и разработчиков часто не представляют себе, что же на самом деле происходит &amp;quot;под капотом&amp;quot;. Я рассмотрю это в данном разделе. И не беспокойтесь, код вскоре появится. Потерпите еще немного, поскольку четкое понимание процессов, происходящих в браузере, очень важно для корректной работы вашего кода.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Недостатки текстовой разметки&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Хотя текстовая разметка имеет огромные преимущества для дизайнера или создателя страницы, она имеет довольно значительные недостатки для браузера. В частности, браузерам не просто непосредственно представить текстовую разметку пользователю визуально (дополнительная информация приведена в разделе &amp;quot;Некоторые дополнительные мысли о разметке&amp;quot;). Учитывайте следующие частые задачи браузера:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Применить CSS-стили (часто из нескольких таблиц стилей во внешних файлах) к разметке, основываясь на типе элемента, его классе, ID и его позиции в HTML-документе.&lt;br /&gt;&amp;#160; &amp;#160; * Применить стили и форматирование на основе javascript-кода (тоже часто во внешних файлах) для различных частей HTML-документа.&lt;br /&gt;&amp;#160; &amp;#160; * Изменить значение полей формы, основываясь на javascript-коде.&lt;br /&gt;&amp;#160; &amp;#160; * Поддержать визуальные эффекты (например, перебор изображений и перестановка изображений), основываясь на javascript-коде.&lt;/p&gt;
						&lt;p&gt;Сложность заключается не в кодировании этих задач; довольно просто выполнить каждую из них. Сложность в браузере, выполняющем эти задачи. Если разметка сохраняется в тексте и, например, вы хотите выровнять текст по центру (text-align: center) элемента p в классе center-text, как это сделать?&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Добавить встроенное стилевое оформление текста?&lt;br /&gt;&amp;#160; &amp;#160; * Применить стилевое оформление к HTML-тексту в браузере и просто следить, какое содержимое отцентрировано, а какое нет?&lt;br /&gt;&amp;#160; &amp;#160; * Предоставить не оформленный HTML и затем применить формат после отображения?&lt;/p&gt;
						&lt;p&gt;Эти трудные вопросы являются причиной, почему так мало людей занимается в настоящее время программированием браузеров (тем, кто делает это, нужно сказать искреннее &amp;quot;Спасибо!&amp;quot;).&lt;/p&gt;
						&lt;p&gt;Очевидно, обычный текст - это не очень хороший способ хранения HTML для браузера, даже если текст и является хорошим решением для первоначального получения разметки страницы. Добавьте к этому способность javascript менять структуру страницы, и дело действительно станет мудреным. Должен ли браузер записать измененную структуру на диск? Как он может следить за текущим состоянием документа?&lt;/p&gt;
						&lt;p&gt;Очевидно, текст не является ответом. Его трудно модифицировать, трудно применять стили и поведение, и, в конечном итоге, он служит слабым отражением динамической природы современных Web-страниц.&lt;/p&gt;
						&lt;p&gt;Переходим к деревьям&lt;/p&gt;
						&lt;p&gt;Решением этой проблемы (по крайней мере, решением, выбранным в современных Web-браузерах) является использование древовидной структуры для представления HTML. Взгляните на листинг 1, где приведена довольно простая и скучная HTML-страница, представленная в виде текстовой разметки.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 1. Простая HTML-страница в текстовой разметке&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Trees, trees, everywhere&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Trees, trees, everywhere&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Welcome to a &amp;lt;em&amp;gt;really&amp;lt;/em&amp;gt; boring page.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; Come again soon.&lt;br /&gt;&amp;lt;img src=&amp;quot;come-again.gif&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
						&lt;p&gt;Браузер принимает ее и преобразовывает в древовидную структуру, изображенную на рисунке 1.&lt;/p&gt;
						&lt;p&gt;Рисунок 1. Листинг 1 в виде дерева&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s1/56/aa/47/e8/56aa47e806e1453b312ba26c89432abb.gif&quot; alt=&quot;http://pics.kz/s1/56/aa/47/e8/56aa47e806e1453b312ba26c89432abb.gif&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Я сделал несколько очень небольших упрощений для целей данной статьи. Эксперты в DOM или XML знают, что пробелы могут иметь влияние на представление текста в документе и на разбиение древовидной структуры в Web-браузере. Учет этого дает мало, а только запутывает дело, поэтому если вы знаете о влиянии пробелов - отлично; если нет, продолжайте чтение и не беспокойтесь об этом. Когда это станет важно, вы всегда найдете все необходимое.&lt;/p&gt;
						&lt;p&gt;В отличие от действительной структуры дерева, первой вещью, которую вы можете заметить, является то, что все в дереве начинается с самого внешнего, всеохватывающего элемента HTML, которым является html. Согласно метафоре дерева, он называется корнем. Поэтому, даже хотя он находится внизу дерева, всегда начинайте поиск и анализ деревьев с него. Если вам удобнее, можете перевернуть все с ног на голову, хотя это немножко не вписывается в метафору дерева.&lt;/p&gt;
						&lt;p&gt;Из корня отходят линии, показывающие взаимоотношения между различными частями разметки. Элементы head и body являются потомками корневого элемента html; title - это потомок head, а текст &amp;quot;Trees, trees, everywhere&amp;quot; - потомок title. Подобным же образом организовано и все дерево.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Несколько дополнительных терминов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Продолжая метафору дерева, говорят, что head и body являются ветвями html. Они являются ветвями потому, что в свою очередь имеют собственных потомков. Если вы пройдете до концов дерева, то, скорее всего, попадете в текстовые элементы, например &amp;quot;Trees, trees, everywhere&amp;quot; и &amp;quot;really&amp;quot;. Они часто называются листьями, поскольку не имеют собственных потомков. Вам не нужно запоминать все эти понятия; часто легче просто представить древовидную структуру, когда вы пытаетесь понять, что означает конкретный термин.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Значение объектов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Теперь, когда у вас на вооружении есть некоторая основная терминология, время сконцентрироваться на этих маленьких прямоугольничках с названиями элемента и текстом внутри (рисунок 1). Каждый прямоугольник является объектом; здесь браузер решает некоторые из описанных проблем с текстом. Используя объекты для представления каждого участка HTML-документа, становится очень просто менять структуру, применять стили, разрешать javascript получать доступ к документу и многое другое.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Типы и свойства объектов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Каждый возможный тип разметки получает свой собственный тип объекта. Например, элементы в вашем HTML-коде представлены типом объекта Element. Текст представлен типом Text, атрибуты - типами Attribute и так далее.&lt;/p&gt;
						&lt;p&gt;Итак, Web-браузер не только использует объектную модель для представления вашего документа (устраняя необходимость иметь дело со статическим текстом), но может немедленно рассказать о чем-нибудь по его типу объекта. HTML-документ синтаксически анализируется и превращается в набор объектов, как вы видели на рисунке 1, и такие элементы, как угловые скобки и escape-последовательности (например, использование &amp;lt; для &amp;lt; и &amp;gt; для &amp;gt;) больше не становятся проблемой. Это делает работу браузера, по крайней мере, после анализа полученной HTML-страницы, намного легче. Операция определения того, элемент это или атрибут, и последующего определения того, что делать с этим типом объектов, является простой.&lt;/p&gt;
						&lt;p&gt;Используя объекты, Web-браузер может изменить свойства этих объектов. Например, каждый объект имеет родителя и список потомков. Поэтому добавление нового дочернего элемента или текста представляет собой простое добавление нового потомка в список потомков элемента. Эти объекты также имеют свойство style, поэтому динамическое изменение стиля элемента или участка текста становится тривиальной задачей. Например, вы можете изменить высоту элемента div, используя следующий javascript-код:&lt;/p&gt;
						&lt;p&gt;someDiv.style.height = &amp;quot;300px&amp;quot;;&lt;/p&gt;
						&lt;p&gt;Другими словами, Web-браузер может очень просто изменить внешний вид и структуру дерева, используя подобные свойства объекта. Сравните это с теми сложными типами действий, которые браузер должен был делать, если бы страница внутренне представлялась в виде текста (каждое изменение свойства или структуры потребовало бы от браузера перезаписи статического файла, его повторного синтаксического анализа и повторного отображения на экране). Все это становится возможным с объектами.&lt;/p&gt;
						&lt;p&gt;Теперь потратьте время на открытие какого-либо вашего HTML-документа и на схематическое представление его в виде дерева. Хотя это может показаться необычной просьбой (особенно в статье, содержащей очень малый объем кода), вы должны познакомиться со структурой этих деревьев, если хотите уметь управлять ими.&lt;/p&gt;
						&lt;p&gt;Во время работы вы, возможно, обнаружите некоторые странности. Например, представьте следующие ситуации:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Что происходит с атрибутами?&lt;br /&gt;&amp;#160; &amp;#160; * Как насчет текста, который разбит такими элементами как em и b?&lt;br /&gt;&amp;#160; &amp;#160; * И как насчет HTML, который не структурирован корректно (например, отсутствует закрывающий тег p)?&lt;/p&gt;
						&lt;p&gt;Познакомившись с такого рода проблемами, вы намного лучше поймете следующие несколько разделов.&lt;/p&gt;
						&lt;p&gt;Строгость иногда полезна&lt;/p&gt;
						&lt;p&gt;Если вы пробовали выполнить только что упомянутое мной упражнение, то, возможно, обнаружили некоторые потенциальные проблемы при просмотре вашей разметки в виде дерева (если вы упражнение не делали, просто поверьте мне на слово!). Фактически, вы обнаружите некоторые из них в листинге 1 и на рисунке 1, начиная со способа разбиения элемента p. Если бы вы спросили обычного Web-разработчика, каково текстовое содержимое элемента p, самым распространенным ответом был бы &amp;quot;Welcome to a really boring Web page&amp;quot;. Если вы сравните это с рисунком 1, то увидите, что этот ответ хотя и логичен, но не совсем корректен.&lt;/p&gt;
						&lt;p&gt;Оказывается, что элемент p имеет три различных дочерних элемента, и ни один из них не содержит текст &amp;quot;Welcome to a really boring Web page&amp;quot; полностью. Вы найдете части этого текста, например, &amp;quot;Welcome to a &amp;quot; и &amp;quot; boring Web page&amp;quot;, но не все вместе. Для того чтобы это понять, вспомните о том, что все в вашей разметке должно быть превращено в объект некоторого типа.&lt;/p&gt;
						&lt;p&gt;Более того, порядок имеет значение! Вы можете представить себе, как реагировали бы пользователи Web-браузера, если бы он показывал корректную разметку, но в отличном от указанного вами в HTML-коде порядке? Параграфы наложились бы друг на друга между заголовками, хотя вы не так организовывали ваш документ? Очевидно, что браузер должен сохранять порядок элементов и текста.&lt;/p&gt;
						&lt;p&gt;В данном случае элемент p имеет три различные части:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Текст, расположенный до элемента em&lt;br /&gt;&amp;#160; &amp;#160; * Сам элемент em&lt;br /&gt;&amp;#160; &amp;#160; * Текст, расположенный после элемента em&lt;/p&gt;
						&lt;p&gt;Если вы перемешаете порядок, то можете выделить не ту часть текста. Для сохранения всего в нужном состоянии элемент p содержит дочерние объекты в том порядке, в котором они появляются в HTML (листинг 1). Более того, выделенный текст &amp;quot;really&amp;quot; не является дочерним элементом p; он - потомок em, который является потомком p.&lt;/p&gt;
						&lt;p&gt;Для вас очень важно понимать эту концепцию. Даже если текст &amp;quot;really&amp;quot; будет отображаться вместе с остальным текстом элемента p, он все равно является прямым потомком элемента em. Он имеет отличное от остального текста p форматирование и может быть перемещен независимо от остального текста.&lt;/p&gt;
						&lt;p&gt;Чтобы помочь закрепить все это в вашей голове, попробуйте нарисовать схему HTML из листингов 2 и 3, проверяя сохранение текста с его корректным предком (не смотря на то, как этот текст может в конечном итоге отображаться на экране).&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 2. Разметка с немного хитрой вложенностью элементов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;This is a little tricky&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Pay &amp;lt;u&amp;gt;close&amp;lt;/u&amp;gt; attention, OK?&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;This p really isn&#039;t &amp;lt;em&amp;gt;necessary&amp;lt;/em&amp;gt;, but it makes the &lt;br /&gt;&amp;lt;span id=&amp;quot;bold-text&amp;quot;&amp;gt;structure &amp;lt;i&amp;gt;and&amp;lt;/i&amp;gt; the organization&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; of the page easier to keep up with.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 3. Еще более хитрая вложенность элементов&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Trickier nesting, still&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;main-body&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;contents&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt; &lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Steps&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Process&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Figure out the &amp;lt;em&amp;gt;root element&amp;lt;/em&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Deal with the &amp;lt;span id=&amp;quot;code&amp;quot;&amp;gt;head&amp;lt;/span&amp;gt; first,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;as it&#039;s usually easy.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Work through the &amp;lt;span id=&amp;quot;code&amp;quot;&amp;gt;body&amp;lt;/span&amp;gt;.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;Just &amp;lt;em&amp;gt;take your time&amp;lt;/em&amp;gt;.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;closing&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; This link is &amp;lt;em&amp;gt;not&amp;lt;/em&amp;gt; active, but if it were, the answers&lt;br /&gt;&amp;#160; &amp;#160; to this &amp;lt;a href=&amp;quot;answers.html&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;exercise.gif&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt; would&lt;br /&gt;&amp;#160; &amp;#160; be there. But &amp;lt;em&amp;gt;do the exercise anyway!&amp;lt;/em&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
						&lt;p&gt;Вы найдете ответы на эти упражнения в GIF-файлах tricky-solution.gif (рисунок 2) и trickier-solution.gif (рисунок 3) в конце этой статьи. Не заглядывайте в них, пока не потратите время на самостоятельную работу. Это поможет понять, как строгие правила применяются к структуре дерева, и действительно поможет вам на пути к освоению HTML и его древовидной структуры.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Как насчет атрибутов?&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Сталкивались ли вы с какими-либо проблемами, когда определяли, что делать с атрибутами? Как я уже говорил, атрибуты имеют свой собственный тип объекта, но атрибут на самом деле не является потомком элемента, в котором появляется - вложенные элементы и текст не находятся на таком же &amp;quot;уровне&amp;quot; атрибута, и вы увидите, что ответы на упражнения из листингов 2 и 3 не показывают атрибуты.&lt;/p&gt;
						&lt;p&gt;Атрибуты действительно хранятся в объектной модели, которую использует браузер, но они имеют немного другое положение. Каждый элемент содержит список доступных ему атрибутов отдельно от списка дочерних объектов. То есть, элемент div может иметь список, содержащий один атрибут с именем &amp;quot;id&amp;quot; и другой с именем &amp;quot;class&amp;quot;.&lt;/p&gt;
						&lt;p&gt;Помните, что атрибуты элемента должны иметь уникальные имена; другими словами, элемент не может иметь два атрибута &amp;quot;id&amp;quot; или два атрибута &amp;quot;class&amp;quot;. Это позволяет хранить список и обращаться к нему очень просто. Как вы увидите в следующей статье, вы можете просто вызвать метод, например, getAttribute(&amp;quot;id&amp;quot;), для получения значения атрибута по его имени. Вы можете также добавлять атрибуты и устанавливать (или сбрасывать) значение существующих атрибутов при помощи вызовов сходных методов.&lt;/p&gt;
						&lt;p&gt;Также стоит подчеркнуть, что уникальность имен атрибутов делает этот список отличным от списка дочерних объектов. Элемент p мог бы иметь несколько элементов em, то есть, список дочерних объектов может содержать дублированные элементы. Хотя список потомков и список атрибутов работают аналогично, один может иметь дубликаты (потомок объекта), а второй - нет (атрибуты элемента). Наконец, только элементы могут иметь атрибуты, то есть, текстовые объекты не имеют списков, присоединяемых к ним для хранения атрибутов.&lt;/p&gt;
						&lt;p&gt;Небрежный HTML&lt;/p&gt;
						&lt;p&gt;Прежде чем идти дальше, стоит потратить некоторое время еще на одну тему, связанную с преобразованием браузером разметок в древовидное представление, - как браузер справляется с разметкой, не являющейся грамматически правильной. Грамматически правильный - это термин, используемый в основном в XML. Он означает два основных правила:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Каждый открывающий тег должен иметь соответствующий закрывающий тег. То есть, каждому &amp;lt;p&amp;gt; в документе соответствует &amp;lt;/p&amp;gt;, каждому &amp;lt;div&amp;gt; - &amp;lt;/div&amp;gt; и т.д. .&lt;br /&gt;&amp;#160; &amp;#160; * Самый внутренний открывающий тег соответствует самому внутреннему закрывающему тегу и т.д. То есть, запись &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;жирный и наклонный &amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; будет не правильной, поскольку самый внутренний открывающий тег &amp;lt;i&amp;gt; ошибочно соответствует самому внутреннему закрывающему тегу &amp;lt;b&amp;gt;. Чтобы сделать этот фрагмент грамматически правильным, нужно поменять порядок либо открывающих тегов, либо закрывающих (если вы поменяете и то, и другое, проблема останется).&lt;/p&gt;
						&lt;p&gt;Внимательно изучите два эти правила. Они не только упрощают структуру документа, но и устраняют двусмысленность. Нужно сначала сделать шрифт жирным, или наклонным? Или наоборот? Если этот порядок и двусмысленность кажется не очень важным, помните о том, что CSS позволяет правилам переопределять другие правила, то есть, если, например, шрифт текста внутри элементов b был отличным от шрифта внутри элементов i, то порядок применения форматирования становится очень важным. Следовательно, грамматическая правильность HTML-страницы начинает играть важную роль.&lt;/p&gt;
						&lt;p&gt;В тех случаях, когда браузер получает документ, не являющийся грамматически правильным, он просто делает лучшее, на что способен. Получаемая древовидная структура является в лучшем случае аппроксимацией того, что намеревался передать автор оригинальной страницы, и в худшем - что-то совершенно другое. Если вы когда-то загружали вашу страницу в браузер и видели что-то абсолютно неожиданное, то значит вы видели результат безуспешных попыток браузера догадаться о структуре вашего документа. Естественно, исправить это довольно просто: проверьте, является ли ваш документ грамматически правильным! Если вы сомневаетесь в чем-то при написании таких стандартизированных HTML-страниц, обратитесь за помощью в раздел &amp;quot;Ресурсы&amp;quot;.&lt;/p&gt;
						&lt;p&gt;Введение в DOM&lt;/p&gt;
						&lt;p&gt;До сих пор вы слышали, что браузеры превращают Web-страницу в объектное представление, и возможно даже догадывались, что таким представлением является DOM-дерево. DOM обозначает Document Object Model и является спецификацией, доступной на World Wide Web Consortium (W3C) (вы можете проверить несколько связанных с DOM ссылок в разделе &amp;quot;Ресурсы&amp;quot;).&lt;/p&gt;
						&lt;p&gt;Хотя более важно, что DOM определяет типы и свойства объектов - это позволяет браузерам представлять разметку (в следующей статье этой серии будут рассмотрены особенности использования DOM из вашего javascript и Ajax-кода).&lt;/p&gt;
						&lt;p&gt;Объект document&lt;/p&gt;
						&lt;p&gt;Первое, и самое главное, вам необходимо получить доступ к самой объектной модели. Это удивительно просто; для использования встроенной переменной document в любом месте javascript-кода, выполняющегося на вашей Web-странице, вы можете написать следующее:&lt;/p&gt;
						&lt;p&gt;var domTree = document;&lt;/p&gt;
						&lt;p&gt;Конечно, этот код совершенно бесполезен сам по себе, но он демонстрирует то, что каждый браузер делает объект document доступным для javascript-кода, и этот объект представляет полное дерево разметки (рисунок 1).&lt;/p&gt;
						&lt;p&gt;Все есть узел&lt;/p&gt;
						&lt;p&gt;Несомненно, объект document важен, но это только начало. Перед тем, как продолжить, вы должны изучить еще одно понятие - узел (node). Вы уже знаете, что каждый кусочек разметки представляется в виде объекта, но это не просто любой объект - это конкретный объект, DOM-узел. Более специфические типы (например, text, elements и attributes) расширяют этот базовый тип node. То есть, у вас есть текстовые узлы, узлы элементов и узлы атрибутов.&lt;/p&gt;
						&lt;p&gt;Если вы много программировали в javascript, то, возможно, уже использовали DOM-код. Если вы до сих пор следовали этой Ajax-серии статей, то определенно использовали DOM-код некоторое время. Например, строка var number = document.getElementById(&amp;quot;phone&amp;quot;).value; использует DOM для поиска конкретного элемента и для извлечения значения этого элемента (в данном случае поле формы). То есть, даже если вы этого не понимали, то все равно использовали DOM каждый раз, когда вводили document в ваш javascript-код.&lt;/p&gt;
						&lt;p&gt;Уточним изученные вами понятия. DOM-дерево - это дерево объектов, точнее, дерево объектов node. В Ajax-приложениях (или в любом другом javascript-коде) вы можете работать с этими узлами для создания таких эффектов, как удаление элемента и его содержимого, цветовое выделение определенного фрагмента текста или добавление нового элемента изображения. Поскольку все это происходит на стороне клиента (в коде, работающем в вашем Web-браузере), эти эффекты выполняются немедленно, без обмена информацией с сервером. В конечном итоге, получаем приложение, являющееся более чувствительным, поскольку изменения Web-страницы происходят без длительных пауз, возникающих при передаче запроса на сервер и интерпретации ответа.&lt;/p&gt;
						&lt;p&gt;В большинстве языков программирования вы должны изучить реальные имена объектов для каждого типа узла, изучить доступные свойства и узнать о типах и их преобразовании; но ничего этого не надо в javascript. Вы можете просто создать переменную и назначить ей желаемый объект (как вы уже видели):&lt;/p&gt;
						&lt;p&gt;var domTree = document;&lt;br /&gt;var phoneNumberElement = document.getElementById(&amp;quot;phone&amp;quot;);&lt;br /&gt;var phoneNumber = phoneNumberElement.value;&lt;/p&gt;
						&lt;p&gt;Здесь нет типов; javascript управляет созданием переменных и назначением им корректных типов при необходимости. В результате использовать DOM в javascript становится довольно тривиальной задачей (в следующей статье будет рассматриваться DOM по отношению к XML и немного более сложные ситуации).&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;В заключение&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Сейчас я собираюсь вас немного заинтриговать. Очевидно, что эта статья не была полностью исчерпывающим обзором DOM; фактически эта статья лишь немного больше, чем введение в DOM. DOM больше рассказанного мной сегодня!&lt;/p&gt;
						&lt;p&gt;Следующая статья данной серии развивает эти идеи и детальнее рассматривает использование DOM в javascript для обновления Web-страниц, динамического изменения HTML и создания более интерактивных приложений для ваших пользователей. Я вернусь к DOM опять в следующих статьях при рассмотрении использования XML в ваших Ajax-запросах. Поэтому осваивайте DOM; это главная часть Ajax-приложений.&lt;/p&gt;
						&lt;p&gt;Было бы довольно просто заняться сейчас DOM более интенсивно, подробно рассматривая перемещение в DOM-дереве, получение значений элементов и текста, итерацию по списку узлов и т.д., но это, возможно, оставило бы у вас ощущение, что DOM имеет отношение к коду, а это не так.&lt;/p&gt;
						&lt;p&gt;Перед следующей статьей попробуйте подумать о структурах дерева и поработайте с некоторыми вашими собственными HTML-страницами, посмотрите, как Web-браузер преобразует эти HTML в древовидное представление разметки. Также продумайте структуру DOM-дерева и проработайте специальные случаи, рассмотренные в этой статье: атрибуты, текст, имеющий смесь элементов, элементы, не имеющие текстового содержимого (например, элемент img).&lt;/p&gt;
						&lt;p&gt;Если вы четко усвоите эти концепции и затем изучите синтаксис javascript и DOM (в следующей статье), это значительно облегчит создание интерактивных Web-приложений с быстрой реакцией.&lt;/p&gt;
						&lt;p&gt;И не забывайте, здесь приведены ответы для листингов 2 и 3 - они тоже включены в код примеров!&lt;/p&gt;
						&lt;p&gt;Рисунок 2. Ответ для листинга 2&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s1/9a/2e/13/cb/9a2e13cbebeb6369a6f35f09c79cdfa8.gif&quot; alt=&quot;http://pics.kz/s1/9a/2e/13/cb/9a2e13cbebeb6369a6f35f09c79cdfa8.gif&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Рисунок 3. Ответ для листинга 3&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s5/df/d7/76/9c/dfd7769c454f4a6b4a3a566a714b0b72.gif&quot; alt=&quot;http://pics.kz/s5/df/d7/76/9c/dfd7769c454f4a6b4a3a566a714b0b72.gif&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (TaronTo)</author>
			<pubDate>Wed, 23 Dec 2009 17:01:49 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=34#p34</guid>
		</item>
		<item>
			<title>Освоение Ajax: Часть 3. Усовершенствованные запросы и ответы в Ajax</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=33#p33</link>
			<description>&lt;p&gt;Уровень сложности: простой&lt;br /&gt;Бретт Маклафлин (Brett McLaughlin), &lt;br /&gt;Автор/Редактор, O&#039;Reilly and Associates&lt;br /&gt;14.02.2006&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; Для многих Web-разработчиков выполнение простых запросов и получение простых ответов – это все, что когда-нибудь может им понадобиться, но для разработчиков, которые хотят освоить Ajax, необходимо полное понимание кодов состояния HTTP, состояний готовности и объекта XMLHttpRequest. В этой статье Брэт Маклафлин расскажет о различных кодах состояния и продемонстрирует, как браузеры их воспринимают. Он расскажет также о малоиспользуемых HTTP-запросах, которые вы можете применять с Ajax.&lt;/p&gt;
						&lt;p&gt;В последней статье этой серии я предоставил введение в объект XMLHttpRequest, центральный элемент Ajax-приложения, который управляет запросами к серверному приложению или сценарию, а также работает с возвращенными данными из этого серверного компонента. Каждое Ajax-приложение использует объект XMLHttpRequest, поэтому вы должны быть очень близко знакомы с ним, для того чтобы заставить ваши Ajax-приложения выполняться и выполняться хорошо.&lt;/p&gt;
						&lt;p&gt;В этой статье я выйду за границы представленных в предыдущей статье основ и сконцентрируюсь более детально на трех ключевых частях этого объекта:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Состояние готовности HTTP&lt;br /&gt;&amp;#160; &amp;#160; * Код состояния HTTP&lt;br /&gt;&amp;#160; &amp;#160; * Типы запросов, которые вы можете сделать&lt;/p&gt;
						&lt;p&gt;Каждый из них является, как правило, частью структуры запроса; в результате о них известно мало подробностей. Однако вы должны свободно разбираться в состояниях готовности, кодах состояния и запросах, если хотите не просто поиграть в Ajax-программирование, а сделать больше. Когда в вашем приложении что-то идет не так (все всегда идет не так), знание кодов состояния, способов передачи HEAD-запроса или того, что означает код состояния 400, может вылиться в разницу между пятью минутами отладки и пятью часами разочарования и замешательства.&lt;/p&gt;
						&lt;p&gt;XMLHttpRequest или XMLHttp&lt;/p&gt;
						&lt;p&gt;Microsoft™ и Internet Explorer использует объект XMLHttp вместо объекта XMLHttpRequest, используемого в браузерах Mozilla, Opera, Safari и большинстве остальных браузеров. Ради простоты я буду ссылаться на оба этих объекта просто как XMLHttpRequest. Это соответствует общепринятой практике в Web и также совпадает с намерениями Microsoft использовать XMLHttpRequest в качестве имени объекта запроса в Internet Explorer 7.0 (более подробно об этом – во второй части).&lt;/p&gt;
						&lt;p&gt;Сначала рассмотрим состояния готовности HTTP.&lt;/p&gt;
						&lt;p&gt;Подробно о состояниях готовности HTTP&lt;/p&gt;
						&lt;p&gt;Вы должны помнить из предыдущей статьи, что объект XMLHttpRequest имеет свойство readyState. Это свойство удостоверяет, что сервер завершил запрос, и обычно функция обратного вызова использует данные от сервера для обновления Web-формы или страницы. В листинге 1 приведен простой пример этого (также в последней статье этой серии – смотрите раздел Ресурсы).&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 1. Работа с ответом сервера в функции обратного вызова&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt; function updatePage() {&lt;br /&gt;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.status == 200) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var response = request.responseText.split(&amp;quot;|&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;order&amp;quot;).value = response[0];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;address&amp;quot;).innerHTML =&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;response[1].replace(/\n/g, &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;} else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;status is &amp;quot; + request.status);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;br /&gt; }&lt;/p&gt;
						&lt;p&gt;Это определенно наиболее общее (и наиболее простое) использование состояний готовности. Как вы, возможно, догадались по числу &amp;quot;4&amp;quot;, существует и несколько других состояний готовности (список приведен в последней статье этого цикла статей – см. раздел Ресурсы):&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 0: Запрос не инициализирован (перед вызовом open()).&lt;br /&gt;&amp;#160; &amp;#160; * 1: Запрос инициализирован, но не был передан (перед вызовом send()).&lt;br /&gt;&amp;#160; &amp;#160; * 2: Запрос был передан и обрабатывается (на данном этапе вы можете обычно получить заголовки содержимого из ответа).&lt;br /&gt;&amp;#160; &amp;#160; * 3: Запрос обрабатывается; часто в ответе доступны некоторые частичные данные, но сервер не закончил свой ответ.&lt;br /&gt;&amp;#160; &amp;#160; * 4: Ответ завершен; вы можете получить ответ сервера и использовать его.&lt;/p&gt;
						&lt;p&gt;Если вы хотите выйти за рамки основ Ajax-программирования, то должны знать не только эти состояния, но и когда они возникают, а также как вы можете использовать их. Первое и самое главное – вы должны изучить, на каком этапе запроса возникает каждое состояние. К сожалению, это не такая уж интуитивная вещь, и имеются специальные случаи.&lt;/p&gt;
						&lt;p&gt;Скрытые значения состояний готовности&lt;/p&gt;
						&lt;p&gt;Первое состояние готовности, обозначаемое значением свойства readyState равным 0 (readyState == 0), представляет неинициализированный запрос. Как только вы вызовете метод open() вашего объекта запроса, это свойство устанавливается в 1. Поскольку вы почти всегда вызываете open() сразу после инициализации вашего запроса, редко можно увидеть readyState == 0. Более того, неинициализированное состояние готовности достаточно бесполезно в реальных приложениях.&lt;/p&gt;
						&lt;p&gt;Тем не менее, в интересах полноты изложения взгляните на листинг 2, в котором показано, как получить состояние готовности, когда оно установлено в 0.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 2. Получение состояния готовности 0&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function getSalesData() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;// Создать объект request&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;createRequest();&amp;#160; &amp;#160; &lt;br /&gt;alert(&amp;quot;Ready state is: &amp;quot; + request.readyState);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;// Настроить&amp;#160; (инициализировать) запрос&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var url = &amp;quot;/boards/servlet/UpdateBoardSales&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.onreadystatechange = updatePage;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.send(null);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;В этом простом примере getSalesData() – это функция, которую вызывает ваша Web-страница для запуска запроса (как при нажатии кнопки). Обратите внимание, что вы должны проверить состояние готовности перед вызовом open(). На рисунке 1 sпоказан результат выполнения этого приложения.&lt;/p&gt;
						&lt;p&gt;Рисунок 1. Состояние готовности 0&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s1/4e/7f/8b/c4/4e7f8bc4edc9d36cf4c041b3e37a2500.jpg&quot; alt=&quot;http://pics.kz/s1/4e/7f/8b/c4/4e7f8bc4edc9d36cf4c041b3e37a2500.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Когда 0 равен 4&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;В том случае, когда несколько javascript-функций используют один и тот же объект запроса, проверка на равенство 0 состояния готовности (для гарантии того, что объект еще не используется) может вызвать проблемы. Поскольку readyState == 4 указывает на завершенность запроса, вы часто сможете найти неиспользуемые объекты, имеющие состояние готовности все еще равное 4 – данные от сервера были использованы, но ничего после этого не произошло для сброса состояния готовности. Существует функция, сбрасывающая состояние готовности объекта запроса, - это функция abort(), но она предназначена не для этого. Если вам нужны несколько функций, возможно, лучшим вариантом будет создание и использование объекта запроса для каждой функции, а не общее использование одного объекта.&lt;/p&gt;
						&lt;p&gt;Очевидно, это не очень хорошо; существует очень мало случаев, когда вы должны проверять, что open() не была вызвана. Единственным использованием этого состояния готовности в &amp;quot;почти реальном&amp;quot; Ajax-программировании будет ситуация, когда вы выполняете несколько запросов, используя один и то же объект XMLHttpRequest из нескольких функций. В этой ситуации (довольно необычной) вы, возможно, захотите убедиться, что объект запроса находится в неинициализированном состоянии (readyState == 0) перед выполнением новых запросов. Это, в сущности, гарантирует, что другая функция не использует объект в это же время.&lt;/p&gt;
						&lt;p&gt;Обзор состояния готовности выполняющегося запроса&lt;/p&gt;
						&lt;p&gt;От состояния готовности 0 ваш объект запроса должен проходить через каждое другое состояние в обычном запросе и ответе, и, в конце концов, закончить на состоянии 4. Вот почему вы видите строку кода if (request.readyState == 4) в большинстве функций обратного вызова; она гарантирует, что сервер закончил свою работу с запросом и можно без опасений обновить Web-страницу или выполнить действие, основанное на полученных от сервера данных.&lt;/p&gt;
						&lt;p&gt;Увидеть этот процесс во время его протекания является тривиальной задачей. Вместо выполняющегося только при состоянии готовности равном 4 кода в вашей функции обратного вызова просто выводите состояние готовности каждый раз при вызове функции. Пример приведен в листинге 3.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 3. Проверка состояния готовности&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;// Отобразить текущее состояние готовности&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;updatePage() called with ready state of &amp;quot; + request.readyState);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Вы должны создать функцию для вызова из вашей Web-страницы и передать в ней запрос серверному компоненту (просто такая же функция, как и приведенная в листинге 2, а также в примерах первой и второй статей данного цикла статей). Убедитесь в том, что при настройке вашего запроса вы установили функцию обратного вызова в updatePage(); для этого установите свойство onreadystatechange вашего объекта запроса в updatePage().&lt;/p&gt;
						&lt;p&gt;Этот код является отличной иллюстрацией того, что на самом деле означает onreadystatechange – каждый раз при изменении состояния готовности запроса вызывается updatePage(), и вы видите предупреждение. На рисунке 2 показан пример вызова этой функции, в данном случае с состоянием готовности 1.&lt;/p&gt;
						&lt;p&gt;Рисунок 2. Состояние готовности 1&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s4/bb/08/d9/d7/bb08d9d7165916ef6842ab41a11f13be.jpg&quot; alt=&quot;http://pics.kz/s4/bb/08/d9/d7/bb08d9d7165916ef6842ab41a11f13be.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Попробуйте этот код самостоятельно. Поместите его на вашу Web-страницу и активизируйте ваш обработчик событий (нажмите кнопку, выйдите из поля или используйте любой метод, который вы установили для инициирования запроса). Ваша функция обратного вызова выполнится несколько раз (каждый раз при изменении состояния готовности запроса), и вы увидите предупреждение для каждого состояния. Это наилучший способ следовать за запросом через каждое его состояние.&lt;/p&gt;
						&lt;p&gt;Несовместимость браузеров&lt;/p&gt;
						&lt;p&gt;Получив общее понятие об этом процессе, попробуйте обратиться к вашей Web-странице из нескольких различных браузеров. Вы должны заметить некоторую несовместимость в том, как обрабатываются эти состояния готовности. Например, в Firefox 1.5 вы увидите следующие состояния готовности:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 1&lt;br /&gt;&amp;#160; &amp;#160; * 2&lt;br /&gt;&amp;#160; &amp;#160; * 3&lt;br /&gt;&amp;#160; &amp;#160; * 4&lt;/p&gt;
						&lt;p&gt;Это не должно быть сюрпризом, поскольку здесь представлено каждое состояние запроса. Однако если вы обратитесь к этому же приложению в Safari, вы должны увидеть (или скорее, не увидеть) кое-что интересное. Вот состояния в Safari 2.0.1:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 2&lt;br /&gt;&amp;#160; &amp;#160; * 3&lt;br /&gt;&amp;#160; &amp;#160; * 4&lt;/p&gt;
						&lt;p&gt;Safari на самом деле пропускает первое состояние, и нет здравого объяснения, почему; просто Safari работает таким образом. Это также выявляет важный момент: в то время как использование значения состояния запроса равное 4 перед использованием данных от сервера является неплохой идеей, написание кода, зависящего от каждого промежуточного состояния готовности, несомненно, путь к получению различных результатов в различных браузерах.&lt;/p&gt;
						&lt;p&gt;Например, при использовании Opera 8.5, отображение состояний готовности становится даже еще хуже:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 3&lt;br /&gt;&amp;#160; &amp;#160; * 4&lt;/p&gt;
						&lt;p&gt;И последнее, но важное - Internet Explorer отображает следующие состояния:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 1&lt;br /&gt;&amp;#160; &amp;#160; * 2&lt;br /&gt;&amp;#160; &amp;#160; * 3&lt;br /&gt;&amp;#160; &amp;#160; * 4&lt;/p&gt;
						&lt;p&gt;Если с запросом имеются проблемы, это самое первое место, где следует их искать. Добавьте вывод предупреждения, чтобы увидеть состояние готовности запроса и убедиться в том, что все работает нормально. Еще лучше - протестируйте и в Internet Explorer, и в Firefox – вы получите все четыре состояния готовности и сможете проверить каждый этап запроса.&lt;/p&gt;
						&lt;p&gt;Теперь посмотрим со стороны ответа.&lt;/p&gt;
						&lt;p&gt;Данные ответа под микроскопом&lt;/p&gt;
						&lt;p&gt;Разобравшись с различными состояниями готовности, происходящими во время запроса, вы готовы исследовать другую важную часть объекта XMLHttpRequest – свойство responseText. Вспомните из последней статьи, что это свойство используется для получения данных от сервера. Как только сервер завершит обработку запроса, он размещает все данные, необходимые для ответа на запрос, в свойство responseText запроса. После этого ваша функция обратного вызова может использовать эти данные, как показано в листингах 1 и 4.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 4. Использование ответа от сервера&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var newTotal = request.responseText;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var totalSoldEl = document.getElementById(&amp;quot;total-sold&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var netProfitEl = document.getElementById(&amp;quot;net-profit&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;replaceText(totalSoldEl, newTotal);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;/* Определить новую чистую прибыль */&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var boardCostEl = document.getElementById(&amp;quot;board-cost&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var boardCost = getText(boardCostEl);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var manCostEl = document.getElementById(&amp;quot;man-cost&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var manCost = getText(manCostEl);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var profitPerBoard = boardCost - manCost;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var netProfit = profitPerBoard * newTotal;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;/* Обновить чистую прибыль на форме продаж */&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;netProfit = Math.round(netProfit * 100) / 100;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;replaceText(netProfitEl, netProfit);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Листинг 1 довольно прост. Листинг 4 немного более сложен, но в начале оба проверяют состояние готовности и затем извлекают значение (или значения) из свойства responseText.&lt;/p&gt;
						&lt;p&gt;Просмотр текстового ответа во время запроса&lt;/p&gt;
						&lt;p&gt;Аналогично состоянию готовности значение свойства responseText изменяется на всем протяжении жизненного цикла запроса. Чтобы увидеть это в действии, используйте код, аналогичный приведенному в листинге 5, для тестирования текстового ответа, также как и состояния готовности.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 5. Тестирование свойства responseText&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;// Отобразить текущее состояние готовности&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;updatePage() called with ready state of &amp;quot; + request.readyState +&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&amp;quot; and a response text of &#039;&amp;quot; + request.responseText + &amp;quot;&#039;&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Теперь откройте ваше Web-приложение в браузере и активируйте запрос. Для получения наибольшей информации из этого кода используйте либо Firefox, либо Internet Explorer, поскольку оба обрабатывают все возможные состояния готовности во время запроса. Например, когда состояние готовности равно 2, свойство responseText не определено (см. рисунок 3); вы должны увидеть ошибку, если открылась консоль javascript.&lt;/p&gt;
						&lt;p&gt;Рисунок 3. Текстовый ответ при состоянии готовности 2&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s5/91/8f/6d/30/918f6d308a83cff7f802a2eb3ae75689.jpg&quot; alt=&quot;http://pics.kz/s5/91/8f/6d/30/918f6d308a83cff7f802a2eb3ae75689.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;А при состоянии готовности 3 сервер поместил значение в свойство responseText, по крайней мере, в этом примере (см. рисунок 4).&lt;/p&gt;
						&lt;p&gt;Рисунок 4. Текстовый ответ при состоянии готовности 3&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s5/55/58/eb/f6/5558ebf6edcd1eb7c9d504356c0feee1.jpg&quot; alt=&quot;http://pics.kz/s5/55/58/eb/f6/5558ebf6edcd1eb7c9d504356c0feee1.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Вы увидите, что ваши ответы при состоянии готовности 3 отличаются от сценария к сценарию, от сервера к серверу и от браузера к браузеру. Но все же этот подход продолжает оставаться чрезвычайно полезным при отладке вашего приложения.&lt;/p&gt;
						&lt;p&gt;Получение надежных данных&lt;/p&gt;
						&lt;p&gt;Во всей документации и спецификациях утверждается, что только при состоянии готовности 4 данные можно использовать безопасно. Поверьте мне, вы редко найдете случаи, когда данные не могут быть получены из свойства responseText при состоянии готовности равном 3. Однако полагаться на это в вашем приложении – плохая идея. Если вы напишете код, зависящий от завершенности данных при состоянии готовности 3, почти гарантируется, что наступит момент, когда данные будт не полны.&lt;/p&gt;
						&lt;p&gt;Лучшей идеей является предоставление некоторого рода обратной связи с пользователем – когда состояние готовности равно 3, отобразить, что ответ на подходе. В то время, как использование такой функции как alert(), очевидно, плохая идея, использование Ajax и блокирование пользователя диалоговым окном понять довольно трудно – вы могли бы обновить поле на вашей форме или странице при изменении состояния готовности. Например, попробуйте установить длину индикатора хода процесса в 25% при равенстве состояния готовности 1, 50% при 2, 75% при 3 и 100% (завершено) при 4.&lt;/p&gt;
						&lt;p&gt;Естественно, такой подход понятнее, но зависит от используемого браузера. В Opera вы никогда не получите первых двух состояний готовности, а Safari пропустит 1. По этой причине я оставляю этот пример как упражнение и не включаю в эту статью.&lt;/p&gt;
						&lt;p&gt;Время взглянуть на коды состояния.&lt;/p&gt;
						&lt;p&gt;Пристальный взгляд на коды состояния HTTP&lt;/p&gt;
						&lt;p&gt;Имея в багаже знаний ваш опыт Ajax-программирования состояния готовности и ответа сервера, вы готовы добавить еще один уровень усовершенствования Ajax-приложений – работу с кодами состояния HTTP. Эти коды не являются чем-то новым для Ajax. Они существуют в Web со времен его появления. Вы, вероятно, уже видели некоторые из них в вашем браузере&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 401: Unauthorized (Не авторизован)&lt;br /&gt;&amp;#160; &amp;#160; * 403: Forbidden (Запрещен)&lt;br /&gt;&amp;#160; &amp;#160; * 404: Not Found (Не найден)&lt;/p&gt;
						&lt;p&gt;Можно найти еще (ссылка на полный список приведена в разделе Ресурсы). Для добавления еще одного уровня управляемости и оперативности (и особенно более надежной обработки ошибок) к вашим Ajax-приложениям необходимо проверять коды состояния в запросе и ответе соответственно.&lt;/p&gt;
						&lt;p&gt;200: Все OK&lt;/p&gt;
						&lt;p&gt;Во многих Ajax-приложениях вы увидите функцию обратного вызова, проверяющую состояние готовности и продолжающую работу с данными ответа сервера, как в листинге 6.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 6. Функция обратного вызова, игнорирующая код состояния&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;var response = request.responseText.split(&amp;quot;|&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;order&amp;quot;).value = response[0];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;address&amp;quot;).innerHTML =&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;response[1].replace(/\n/g, &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Это недальновидный и подверженный ошибкам подход к Ajax-программированию. Если сценарий требует аутентификации, а ваш запрос не предоставляет корректных данных, сервер возвратит код ошибки 403 или 401. Однако состояние готовности будет установлено в 4, поскольку сервер ответил на запрос (даже если ответ на ваш запрос не такой, какой вы хотели или ожидали). В результате пользователь не получит правильных данных и может даже получить неприятную ошибку, когда ваш javascript-код попытается использовать несуществующие серверные данные.&lt;/p&gt;
						&lt;p&gt;Гарантировать то, что сервер не только завершил обработку запроса, но и возвратил код состояния &amp;quot;Все в порядке&amp;quot;, требует минимальных усилий. Этот код равен &amp;quot;200&amp;quot; и возвращается в свойстве status объекта XMLHttpRequest. Итак, добавьте дополнительную строку в вашу функцию обратного вызова, как показано в листинге 7.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 7. Проверка кода состояния&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;if (request.status == 200) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;var response = request.responseText.split(&amp;quot;|&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;order&amp;quot;).value = response[0];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;address&amp;quot;).innerHTML =&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;response[1].replace(/\n/g, &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;status is &amp;quot; + request.status);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;С этими небольшим числом дополнительных строк кода вы можете быть уверены, что если что-то пойдет не так, ваши пользователи получат (под вопросом) полезное сообщение об ошибке вместо страницы с искаженными данными без всяких объяснений.&lt;/p&gt;
						&lt;p&gt;Переадресация и перенаправление&lt;/p&gt;
						&lt;p&gt;Перед детальным рассмотрением ошибок имеет смысл поговорить о том, о чем вы, возможно, не должны беспокоиться при использовании Ajax – переадресации. В кодах состояния HTTP есть семейство кодов состояния 300, включающих:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 301: Moved permanently (Перемещен постоянно)&lt;br /&gt;&amp;#160; &amp;#160; * 302: Found (Найден) - запрос переадресован на другой URL/URI&lt;br /&gt;&amp;#160; &amp;#160; * 305: Use Proxy (Использовать прокси) - запрос должен использовать прокси для доступа к затребованному ресурсу&lt;/p&gt;
						&lt;p&gt;Ajax-программисты, возможно, не беспокоятся о переадресации по двум причинам:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Прежде всего, Ajax-приложения почти всегда пишутся для конкретного серверного сценария, сервлета или приложения. Исчезновение или перемещение в другое место этого компонента без вашего, Ajax-программиста, ведома встречается довольно редко. Поэтому почти всегда вы знаете, что ресурс переместился (потому что вы его переместили, или он уже был перемещен), меняете URL в вашем запросе и никогда не сталкиваетесь с такого рода проблемами.&lt;br /&gt;&amp;#160; &amp;#160; * И еще одна, даже более важная, причина: Ajax-приложения и запросы выполняются в &amp;quot;песочнице&amp;quot; безопасности. Это значит, что доменом, обслуживающим Web-страницу, с которой выполняются Ajax-запросы, является домен, который должен на них отвечать. Поэтому Web-страница, обслуживаемая ebay.com, не может выполнить Ajax-запрос сценарию, выполняющемуся на amazon.com; Ajax-приложения ibm.com не могут выполнять запросы сервлетам, работающим на netbeans.org.&lt;/p&gt;
						&lt;p&gt;В результате ваши запросы не могут быть переадресованы на другой сервер без генерирования ошибки защиты. В этих случаях вы вовсе не получите код состояния. Вы просто получите ошибку javascript в консоли отладки. Поэтому, думая о многообразии кодов состояния, вы можете почти совершенно игнорировать коды переадресации.&lt;br /&gt;alt 	&lt;br /&gt;Крайние ситуации и тяжелые ситуации&lt;/p&gt;
						&lt;p&gt;На данный момент программисты-новички могут удивиться, из-за чего здесь весь этот шум. Совершенно ясно, что менее 5 процентов Ajax-запросов требуют работы с состояниями готовности 2 и 3 и с кодами состояния аналогичными 403 (на самом деле возможно ближе к 1 проценту или меньше). Эти случаи важны и называются крайними случаями – редкими ситуациями, которые возникают при совпадении очень необычных условий. Оставаясь редкими, крайние случаи могут быть причиной до 80 процентов наибольших пользовательских разочарований!&lt;/p&gt;
						&lt;p&gt;Обычные пользователи забывают 100 случаев, когда приложение работало правильно, но ясно помнят один, когда оно работало не правильно. Если вы можете обработать крайние случаи (и тяжелые случаи) незаметно, ваши пользователи будут довольны и вернутся на ваш сайт.&lt;/p&gt;
						&lt;p&gt;Ошибки&lt;/p&gt;
						&lt;p&gt;Как только вы позаботились о коде состояния 200 и поняли, что можете в значительной степени проигнорировать 300-е семейство кодов состояния, единственной группой кодов, о которой надо подумать – это 400-е семейство, указывающее на ошибки различного типа. Повторно взгляните на листинг 7 и обратите внимание, что хотя ошибки и обрабатываются, пользователю выдается очень общее сообщение об ошибке. И хотя это шаг в правильном направлении, это сообщение все еще остается бесполезным с точки зрения информирования пользователя или программиста, работающего с приложением, о том, что произошло.&lt;/p&gt;
						&lt;p&gt;Прежде всего, добавьте поддержку отсутствующих страниц. Они действительно не должны часто появляться в реальных системах, но это нередко случается при тестировании перемещенного сценария или при вводе программистом неверного URL. Если вы можете изящно обрабатывать ошибки 404, то намного лучше поможете поставленным в тупик пользователям и программистам. Например, если сценарий был удален с сервера, а вы используете приведенный в листинге 7 код, вы должны увидеть ничего не объясняющее сообщение об ошибке, показанное на рисунке 5.&lt;/p&gt;
						&lt;p&gt;Рисунок 5. Общая обработка ошибок&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s2/bf/0f/a1/76/bf0fa1761cf2e19b73ab8c955c8920d7.jpg&quot; alt=&quot;http://pics.kz/s2/bf/0f/a1/76/bf0fa1761cf2e19b73ab8c955c8920d7.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Пользователь не может узнать, в чем заключается проблема: в аутентификации, отсутствующем сценарии (как в данном случае), ошибке пользователя, или ошибке в исходном коде. Небольшие дополнения к коду могут сделать это сообщение об ошибке намного более точным. Посмотрите на листинг 8, который обрабатывает отсутствие сценария и ошибки аутентификации.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 8. Проверка кода состояния&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;if (request.status == 200) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;var response = request.responseText.split(&amp;quot;|&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;order&amp;quot;).value = response[0];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;address&amp;quot;).innerHTML =&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;response[1].replace(/\n/g, &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} else if (request.status == 404) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert (&amp;quot;Requested URL is not found.&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} else if (request.status == 403) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Access denied.&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;status is &amp;quot; + request.status);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Это все довольно просто, но действительно предоставляется дополнительная информация. На рисунке 6 показана эта же ошибка, что и на рисунке 5, но в данном случае код обработки ошибок выдает пользователю или программисту лучшую картину того, что случилось.&lt;/p&gt;
						&lt;p&gt;Рисунок 6. Индивидуальная обработка ошибок&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s3/79/62/04/0b/7962040bdfca945a80b9412c7ef0d198.jpg&quot; alt=&quot;http://pics.kz/s3/79/62/04/0b/7962040bdfca945a80b9412c7ef0d198.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;В ваших собственных приложениях вы можете предусмотреть очистку имени пользователя и пароля при неудачной аутентификации и добавить сообщение об ошибке на экран. Аналогичный подход можно применить при более изящной обработке отсутствующих сценариев или других ошибок 400-го семейства (таких как 405 для неподдерживаемого метода запроса, например, HEAD-запроса, или 407 при требовании прокси-аутентификации). Какой бы вы вариант не выбрали, он начинается с обработки кода состояния, полученного от сервера.&lt;/p&gt;
						&lt;p&gt;Дополнительные типы запроса&lt;/p&gt;
						&lt;p&gt;Если вы действительно хотите управлять объектом XMLHttpRequest, рассмотрим еще одну, последнюю тему. Добавьте HEAD-запросы в ваш репертуар. В первых двух статьях я рассказал, как выполнять GET-запросы; в следующей статье вы научитесь всему, что связано с передачей данных на сервер при помощи POST-запроса. В духе усовершенствованной обработки ошибок и сбора информации вы должны научиться выполнять HEAD-запросы.&lt;/p&gt;
						&lt;p&gt;Выполнение запроса&lt;/p&gt;
						&lt;p&gt;В действительности выполнение HEAD-запроса является довольно тривиальной задачей; вы просто вызываете метод open() с &amp;quot;HEAD&amp;quot; вместо &amp;quot;GET&amp;quot; или &amp;quot;POST&amp;quot; в качестве первого параметра, как показано в листинге 9.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 9. Выполнение HEAD-запроса с Ajax&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function getSalesData() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;createRequest();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var url = &amp;quot;/boards/servlet/UpdateBoardSales&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.open(&amp;quot;HEAD&amp;quot;, url, true);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.onreadystatechange = updatePage;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.send(null);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;При выполнении подобного HEAD-запроса сервер не возвращает реальный ответ, как для GET или POST-запросов. Вместо этого сервер должен только возвратить заголовки ресурса, в которые включается последнее время модификации содержимого запроса, месторасположение запрашиваемого ресурса и довольно много другой интересной информации. Вы можете использовать эту информацию о ресурсе еще до того, как сервер должен будет обработать и возвратить этот ресурс.&lt;/p&gt;
						&lt;p&gt;Самой простой вещью, которую вы можете сделать с подобным запросом, является выдача всех заголовков ответа. Это даст вам представление о том, что доступно вам через HEAD-запросы. В листинге 10 приведена простая функция обратного вызова, которая отображает все заголовки ответа из HEAD-запроса.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 10. Вывод всех заголовков ответа их HEAD-запроса&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(request.getAllResponseHeaders());&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Проверка URL&lt;/p&gt;
						&lt;p&gt;Вы увидели, как проверить ошибку 404 при отсутствии URL. Если это превращается в общую проблему (возможно, определенный сценарий или сервлет в данный момент времени находитcя в режиме offline) – вы, вероятно, захотите проверить URL перед выполнением полного GET или POST-запроса. Для этого выполните HEAD-запрос и проверьте 404-ю ошибку в вашей функции обратного вызова; в листинге 11 приведен пример такой функции.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 11. Проверка существования URL&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;if (request.status == 200) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;URL exists&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} else if (request.status == 404) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;URL does not exist.&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Status is: &amp;quot; + request.status);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;По правде говоря, это имеет небольшое значение. Сервер должен ответить на запрос и обработать его для заполнения значения длины содержимого заголовка ответа, поэтому вы не экономите время обработки. Кроме того, выполнение запроса и определение существования URL при помощи HEAD-запроса занимает столько же времени, сколько и выполнение GET или POST-запроса и последующая обработка ошибок (как показано в листинге 7. Хотя иногда может быть полезно знать точно, что доступно; вы никогда не знаете, когда вас пробьет на творчество и вам понадобится HEAD-запрос!&lt;/p&gt;
						&lt;p&gt;Полезные HEAD-запросы&lt;/p&gt;
						&lt;p&gt;Одной из ситуаций, когда HEAD-запрос может оказаться полезным, является необходимость узнать длину содержимого, или даже его тип. Это позволяет определить, будет ли возвращен процессу большой объем данных, или сервер будет пытаться возвратить двоичные файлы вместо HTML, текстовых данных или XML (которые намного проще обработать в javascript, чем двоичные данные).&lt;/p&gt;
						&lt;p&gt;В таких случаях вы просто используете соответствующее имя заголовка и передаете его в метод getResponseHeader() объекта XMLHttpRequest. То есть, для получения длины ответа вызовите request.getResponseHeader(&amp;quot;Content-Length&amp;quot;);. Для получения типа содержимого используйте request.getResponseHeader(&amp;quot;Content-Type&amp;quot;);.&lt;/p&gt;
						&lt;p&gt;Во многих приложениях выполнение HEAD-запросов не добавляет функциональности и может даже замедлить запрос (путем передачи HEAD-запроса для получения информации об ответе и последующий GET или POST-запрос для реального получения данных). Однако если вы не уверены в сценарии или серверном компоненте, HEAD-запрос может помочь вам получить некоторые основные данные без работы с данными ответа или без снижения пропускной способности для передачи этого ответа.&lt;/p&gt;
						&lt;p&gt;В заключение&lt;/p&gt;
						&lt;p&gt;Для многих Ajax и Web-программистов материал, представленный в этой статье, может показаться довольно сложным. Какое значение имеет выполнение HEAD-запроса? Когда действительно нужно обрабатывать коды состояния для переадресации в вашем javascript? Это хорошие вопросы: для простых приложений ответ состоит в том, что эти продвинутые технические приемы вряд ли имеют большую ценность.&lt;/p&gt;
						&lt;p&gt;Однако Web больше не является местом, где допускаются простые приложения; пользователи становятся все более опытными, клиенты ожидают устойчивости и развитой системы отчета об ошибках, менеджеров увольняют из-за того, что приложение не работает более 1% времени.&lt;/p&gt;
						&lt;p&gt;Это ваша работа, в конце концов, выйти за рамки простого приложения, и это потребует более глубокого знания XMLHttpRequest.&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Если вы можете принять во внимание различные состояния готовности (и понимаете как они отличаются в разных браузерах), то будете способны выполнять быструю отладку приложения. Вы даже можете подняться в глазах пользователей и клиентов, если творчески добавите функциональность приложения на основе состояния готовности и отчета о состоянии запроса.&lt;br /&gt;&amp;#160; &amp;#160; * Если вы обрабатываете коды состояния, то можете в своем приложении работать с ошибками сценария, неожиданными ответами и крайними случаями. В результате ваше приложение будет работать постоянно, а не только в ситуациях, когда все идет точно по плану.&lt;br /&gt;&amp;#160; &amp;#160; * Добавьте сюда способность выполнять HEAD-запросы, проверку существования URL, определение времени модификации файла и вы сможете гарантировать, что пользователи получат корректные страницы, получат самую последнюю информацию и (самое важное) получат устойчивое и гибкое приложение.&lt;/p&gt;
						&lt;p&gt;Цель этой статьи не в том, чтобы сделать ваши приложения броскими, помочь вам выделить текст затухающей желтой подсветкой или придать им поведение настольных приложений. Хотя в этом и заключается мощь Ajax (эти темы мы рассмотрим в последующих статьях), это в какой то степени просто украшательства. Если вы можете использовать Ajax для создания монолитной основы, в которой ваше приложение надежно обрабатывает ошибки и проблемы, пользователи будут возвращаться на ваш сайт. Добавьте к этому визуальные трюки, которые я рассмотрю в последующих статьях, и ваши пользователи будут заинтригованы, взволнованы и счастливы. Серьезно, не пропустите следующую статью!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (TaronTo)</author>
			<pubDate>Wed, 23 Dec 2009 16:49:28 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=33#p33</guid>
		</item>
		<item>
			<title>Освоение Ajax: Часть 2. Выполнение асинхронных запросов с javascript</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=32#p32</link>
			<description>&lt;p&gt;Источник: wwwibm.com&lt;br /&gt;Уровень сложности: средний&lt;br /&gt;Брэт Маклафлин, автор и редактор, O&#039;Reilly Media Inc.&lt;br /&gt;17.01.2006&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; Большинство Web-приложений используют модель запрос/ответ, в которой получают от сервера HTML-страницу полностью. В результате получаем работу по типу &amp;quot;вперед и назад&amp;quot;, обычно состоящую из нажатия кнопки, ожидания сервера, нажатия другой кнопки и опять ожидания сервера. При помощи Ajax и объекта XMLHttpRequest вы можете использовать модель запрос/ответ, которая никогда не оставляет пользователей в ожидании ответа сервера. В данной статье Брэт Маклафлин расскажет о создании экземпляров XMLHttpRequest кросс-браузерным способом, построении и передаче запросов и реакции сервера.&lt;/p&gt;
						&lt;p&gt;В первой статье этой серии (ссылка приведена в разделе Ресурсы) вы познакомились с Ajax-приложениями и некоторыми основными концепциями, присущими Ajax-приложениям. В центре всего присутствует много технологий, о которых вы, вероятно, уже знаете: javascript, HTML, XHTML, немного динамического HTML и даже DOM (Document Object Model). В данной статье я спущусь с высоты 10000 футов и остановлюсь на конкретных деталях Ajax.&lt;/p&gt;
						&lt;p&gt;Вы начнете с самого фундаментального и базового из всех Ajax-объектов и программных подходов - объекта XMLHttpRequest. Он, фактически, является единственной общей нитью для всех Ajax-приложений, и (как можно ожидать) вы захотите тщательно изучить его для повышения вашей квалификации программиста до максимально возможных пределов. На самом деле когда-нибудь обнаружится, что для правильного использования XMLHttpRequest вы явно не хотите использовать XMLHttpRequest. Так зачем же все это, черт возьми?&lt;/p&gt;
						&lt;p&gt;Web 2.0 с первого взгляда&lt;/p&gt;
						&lt;p&gt;Прежде всего, я сделаю последний маленький обзор перед погружением в исходный код, чтобы убедиться, что вы совершенно ясно представляете эту идею с Web 2.0. Когда вы слышите термин Web 2.0, то должны прежде всего спросить: &amp;quot;А что такое Web 1.0?&amp;quot; Хотя вы вряд ли слышали про Web 1.0, этот термин означает ссылку на традиционный Web, в котором используется совершенно четкая модель запроса и ответа. Например, откройте сайт Amazon.com и нажмите кнопку или введите строку поиска. Этот запрос содержит значительно больше, чем просто список книг; это фактически другая полная HTML-страница. В результате вы, вероятно, увидите некоторое мигание и мерцание во время перерисовки Web-браузером этой новой HTML-страницы. На самом деле, можно ясно увидеть запрос и ответ, разграниченные каждой новой страницей, которая будет отображена.&lt;/p&gt;
						&lt;p&gt;Web 2.0 обходится без этой очень заметной процедуры &amp;quot;вперед и назад&amp;quot; (в значительной степени). В качестве примера посетите сайт Google Maps или Flickr (ссылки на оба этих Web 2.0 сайта, работающих на Ajax, приведены в разделе Ресурсы). На Google Maps, например, вы можете повернуть карту, приблизить или удалить ее с очень небольшой перерисовкой. Естественно, запросы и ответы выполняются и здесь, но это происходит в фоновом режиме. С точки зрения пользователя, впечатление очень хорошее; есть такое чувство, что работаешь с настольным приложением. Это новое чувство (и парадигма) и имеются в виду, когда идет речь о Web 2.0.&lt;/p&gt;
						&lt;p&gt;Единственное, о чем вы должны позаботиться, – как сделать возможными эти новые взаимодействия. Очевидно, вы все равно должны выполнять запросы и получать ответы, но эта перерисовка HTML для каждой операции запрос/ответ и дает ощущение медленного, тяжеловесного Web-интерфейса. Поэтому понятно, что необходим новый подход, позволяющий выполнять запросы и получать ответы, которые содержат только необходимые данные вместо целой HTML-страницы. Единственный момент, когда вы хотите получить полностью новую HTML-страницу, - это… ммм... когда вы хотите, чтобы пользователь увидел новую страницу.&lt;/p&gt;
						&lt;p&gt;Но большинство взаимодействий добавляют детали: меняют текстовое поле или перекрывают данные на существующих страницах. Во всех этих случаях подход Ajax и Web 2.0 делают возможным передачу и прием данных без обновления HTML-страницы полностью. И для каждого Web-серфера эта способность вашего приложения даст ощущение быстроты, большей чувствительности и будет приводить его к вам снова и снова.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Знакомство с XMLHttpRequest&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Для того чтобы весь этот блеск и чудо произошли на самом деле, вы должны тесно познакомиться с объектом javascript, называемым XMLHttpRequest. Этот маленький объект – ключ к Web 2.0, Ajax и, в большой степени, ко всему прочему, что вы узнаете в этом разделе в течение последующих нескольких месяцев. Чтобы сделать действительно быстрый обзор, остановимся всего лишь на нескольких методах и свойствах, которые вы будете использовать в этом объекте:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * open(): Устанавливает новый запрос к серверу;&lt;br /&gt;&amp;#160; &amp;#160; * send(): Передает запрос серверу;&lt;br /&gt;&amp;#160; &amp;#160; * abort(): Прекращает текущий запрос;&lt;br /&gt;&amp;#160; &amp;#160; * readyState: Хранит текущее состояние готовности HTML;&lt;br /&gt;&amp;#160; &amp;#160; * responseText: Текст, который сервер передал назад как ответ на запрос.&lt;/p&gt;
						&lt;p&gt;Не беспокойтесь, если вы не все понимаете из этого (или вообще ничего по этой теме) – вы изучите каждый метод и свойство в следующих нескольких статьях. Что вы должны вынести из этого – четкое представление о том, что делать с XMLHttpRequest. Обратите внимание, что каждый из этих методов и свойств относится к передаче запроса и работает с ответом. На самом деле, если вы видели все методы и свойства XMLHttpRequest, все они будут иметь отношение к этой очень простой модели запрос/ответ. Из этого понятно, что вы не будете изучать новый изумительный GUI-объект или определенного рода сверхсекретный подход к созданию взаимодействия с пользователем; вы будете работать с простыми запросами и простыми ответами. Это, возможно, звучит не очень захватывающе, но осторожное использование этого единственного объекта может полностью изменить ваши приложения.&lt;/p&gt;
						&lt;p&gt;Простота нового&lt;/p&gt;
						&lt;p&gt;Во-первых, вы должны создать новую переменную и присвоить ей экземпляр объекта XMLHttpRequest. Это довольно просто в javascript; вы используете ключевое слово new с именем объекта, как показано в листинге 1.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 1. Создание нового объекта XMLHttpRequest&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var request = new XMLHttpRequest();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Это совсем не тяжело, не правда ли? Помните, что javascript не требует типизации своей переменной, поэтому вам не нужно ничего из того, что вы видите в листинге 2 (возможно, так бы вы создавали этот объект на Java).&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 2. Псевдо-код Java для создания XMLHttpRequest&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;XMLHttpRequest request = new XMLHttpRequest();&lt;/p&gt;
						&lt;p&gt;Итак, вы создаете переменную в javascript при помощи var, даете ей имя (например, &amp;quot;request&amp;quot;), и присваиваете ей новый экземпляр XMLHttpRequest. На данном этапе вы готовы использовать объект в ваших функциях.&lt;/p&gt;
						&lt;p&gt;Обработка ошибок&lt;/p&gt;
						&lt;p&gt;В реальной жизни вещи могут портиться, и этот код не обеспечивает никакой обработки ошибок. Несколько лучший способ – создать этот объект и дать ему грациозно потерпеть неудачу, если что-либо пойдет не так. Например, многие старые браузеры (верите или нет, люди все еще используют старые версии Netscape Navigator) не поддерживают XMLHttpRequest, и вам нужно предупредить таких пользователей, что что-то не получилось. В листинге 3 показано, как можно создать этот объект так, что если что-то поломается, он покажет предупреждение на javascript.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 3. Создание XMLHttpRequest с некоторыми способностями обработки ошибок&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var request = false;&lt;br /&gt;try {&lt;br /&gt;&amp;#160; request = new XMLHttpRequest();&lt;br /&gt;} catch (failed) {&lt;br /&gt;&amp;#160; request = false;&lt;br /&gt;}&lt;br /&gt;if (!request)&lt;br /&gt;&amp;#160; alert(&amp;quot;Error initializing XMLHttpRequest!&amp;quot;);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Убедитесь, что вы понимаете каждый из следующих шагов:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;1. Создайте новую переменную с именем request и присвойте ей значение false. Вы будете использовать false как условие, означающее, что объект XMLHttpRequest еще не был создан.&lt;br /&gt;&amp;#160; &amp;#160;2. Добавьте блок try/catch:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;1. Попробуйте создать объект XMLHttpRequest.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;2. Если это не удалось (catch (failed)), удостоверьтесь, что request все еще равен false.&lt;br /&gt;&amp;#160; &amp;#160;3. Проверьте и узнайте, равно ли false значение request (если все прошло нормально, этого не случится).&lt;br /&gt;&amp;#160; &amp;#160;4. Если была проблема (и request равна false), используйте предупреждение javascript для сообщения пользователю о возникновении проблемы.&lt;/p&gt;
						&lt;p&gt;Это довольно просто; у большинства javascript- и Web-разработчиков больше времени уходит на чтение и написание, чем на понимание. Теперь у вас есть защищенный от ошибок код, создающий объект XMLHttpRequest и даже предупреждающий вас о том, что что-то прошло не так.&lt;/p&gt;
						&lt;p&gt;Работа с Microsoft&lt;/p&gt;
						&lt;p&gt;Это все выглядит довольно хорошо... по крайней мере, пока вы не попробуете этот код в Internet Explorer. Если вы это сделаете, то получите что-то, выглядящее так же ужасно, как на рисунке 1.&lt;/p&gt;
						&lt;p&gt;Рисунок 1. Internet Explorer отображает ошибку&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s5/6e/64/f0/e0/6e64f0e02c3860970b555d4bcbbf6bea.jpg&quot; alt=&quot;http://pics.kz/s5/6e/64/f0/e0/6e64f0e02c3860970b555d4bcbbf6bea.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Microsoft играет по правилам?&lt;br /&gt;Много было написано об Ajax и увеличивающемся интересе Microsoft к присутствию в этой области. Действительно ожидается, что новейшая версия Internet Explorer (версия 7.0, намеченная к выходу в 2006) будет поддерживать XMLHttpRequest напрямую, позволяя вам использовать ключевое слово new вместо всего кода создания Msxml2.XMLHTTP. Но не слишком обольщайтесь; вам все равно необходимо поддерживать старые браузеры, поэтому кросс-браузерный код уйдет со сцены еще не скоро.&lt;/p&gt;
						&lt;p&gt;Понятно, что что-то не работает; Internet Explorer – это тяжелый устаревший браузер, но около 70% пользователей его используют. Другими словами, вы не сделаете много в Web-мире, если не будете поддерживать Microsoft и Internet Explorer! Поэтому нужен другой метод работы с браузерами Microsoft.&lt;/p&gt;
						&lt;p&gt;Оказывается, что Microsoft поддерживает Ajax, но называет свою версию XMLHttpRequest по-другому. Вернее он называет этот объект несколькими разными именами. Если вы используете более новую версию Internet Explorer, то должны использовать объект Msxml2.XMLHTTP; некоторые старые версии Internet Explorer используют Microsoft.XMLHTTP. Вы должны поддерживать оба типа объектов (без потери уже имеющейся поддержки браузеров не от Microsoft). В листинге 4 приведен уже знакомый код с добавленной поддержкой Microsoft.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 4. Добавление поддержки для браузеров Microsoft&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var request = false;&lt;br /&gt;try {&lt;br /&gt;&amp;#160; request = new XMLHttpRequest();&lt;br /&gt;} catch (trymicrosoft) {&lt;br /&gt;&amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; request = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; } catch (othermicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; request = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; } catch (failed) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; request = false;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; }&lt;br /&gt;}&lt;br /&gt;if (!request)&lt;br /&gt;&amp;#160; alert(&amp;quot;Error initializing XMLHttpRequest!&amp;quot;);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Легко затеряться в фигурных скобках, поэтому рассмотрим поэтапно все действия:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;1. Создайте новую переменную с именем request и присвойте ей значение false. Вы будете использовать false как условие, означающее, что объект XMLHttpRequest еще не был создан.&lt;br /&gt;&amp;#160; &amp;#160;2. Добавьте блок try/catch:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;1. Попробуйте создать объект XMLHttpRequest.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;2. Если это не удалось (catch (trymicrosoft)):&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;1. Попробуйте создать совместимый с Microsoft объект, используя более новые версии Microsoft (Msxml2.XMLHTTP).&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;2. Если это не удалось (catch (othermicrosoft)), попробуйте создать совместимый с Microsoft объект, используя старые версии Microsoft (Microsoft.XMLHTTP).&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;3. Если это не удалось (catch (failed)), удостоверьтесь, что request все еще равен false.&lt;br /&gt;&amp;#160; &amp;#160;3. Проверьте и узнайте, равно ли еще false значение request (если все прошло нормально, этого не случится).&lt;br /&gt;&amp;#160; &amp;#160;4. Если была проблема (и request равна false), используйте предупреждение javascript для сообщения пользователю о возникновении проблемы.&lt;/p&gt;
						&lt;p&gt;Выполните эти изменения в своем коде и попробуйте снова выполнить его в Internet Explorer; Вы должны увидеть созданную вами форму (без сообщения об ошибке). В моем случае результат выглядел так, как показано на рисунке 2.&lt;/p&gt;
						&lt;p&gt;Рисунок 2. Internet Explorer работает нормально&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s2/17/af/5b/99/17af5b996586676977b15fdfa976f5f6.jpg&quot; alt=&quot;http://pics.kz/s2/17/af/5b/99/17af5b996586676977b15fdfa976f5f6.jpg&quot; /&gt;&lt;br /&gt;Статика против динамики&lt;/p&gt;
						&lt;p&gt;Взгляните снова на листинги 1, 3 и 4 и обратите внимание, что весь этот код непосредственно вложен внутри тегов сценария. Когда javascript закодирован подобным образом и не размещен внутри тела метода или функции, он называется статическим javascript. Это означает, что код выполняется в какой-то момент времени до того, как страница отобразится пользователю (из спецификации не ясно с точностью 100%, когда этот код выполняется, и браузеры поступают по-разному; но все же есть гарантия, что код выполняется до того, как пользователи смогут взаимодействовать с вашей страницей). Обычно большинство Ajax-программистов именно так и создают объект XMLHttpRequest.&lt;/p&gt;
						&lt;p&gt;Как было сказано, вы определенно можете поместить этот код в метод в соответствии с листингом 5.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 5. Перемещение кода создания XMLHttpRequest в метод&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var request;&lt;br /&gt;function createRequest() {&lt;br /&gt;&amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; request = new XMLHttpRequest();&lt;br /&gt;&amp;#160; } catch (trymicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; request = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; } catch (othermicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; request = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; } catch (failed) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; request = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; }&lt;br /&gt;&amp;#160; if (!request)&lt;br /&gt;&amp;#160; &amp;#160; alert(&amp;quot;Error initializing XMLHttpRequest!&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Поступив так, вы должны вызвать этот метод до начала любой работы с Ajax. То есть, вы должны иметь что-то похожее на листинг 6.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 6. Использование метода для создания XMLHttpRequest&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var request;&lt;br /&gt;function createRequest() {&lt;br /&gt;&amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; request = new XMLHttpRequest();&lt;br /&gt;&amp;#160; } catch (trymicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; request = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; } catch (othermicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; request = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; } catch (failed) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; request = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; }&lt;br /&gt;&amp;#160; if (!request)&lt;br /&gt;&amp;#160; &amp;#160; alert(&amp;quot;Error initializing XMLHttpRequest!&amp;quot;);&lt;br /&gt;}&lt;br /&gt;function getCustomerInfo() {&lt;br /&gt;&amp;#160; createRequest();&lt;br /&gt;&amp;#160; // Сделать что-то с переменной request &lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Единственное замечание по поводу этого кода (и причина того, почему многие Ajax-программисты не используют такой подход) – он задерживает вывод сообщения об ошибке. Представьте, что у вас имеется сложная форма с 10 или 15 полями, рамками выбора вариантов и т.п., и вы активизируете какой-либо Ajax-код при вводе пользователем текста в поле 14 (внизу формы). Активизируется getCustomerInfo(), который пытается создать объект XMLHttpRequest, и (для данного примера) терпит неудачу. Пользователю выводится предупреждение, сообщающее о том (во многих словах), что он не может использовать это приложение. Но пользователь уже потратил время для заполнения формы! Это довольно неприятно, и эта неприятность не входит в число тех вещей, из-за которых пользователь захотел бы вернуться на ваш сайт.&lt;/p&gt;
						&lt;p&gt;В случае использования статического javascript, пользователь получит сообщение об ошибке, как только зайдет на вашу страницу. Это так же неприятно? Возможно. Можно взбесить пользователя тем, что ваше Web-приложение не работает в его браузере. Однако это определенно лучше, чем выдать эту же ошибку после 10 минут ввода пользователем информации. Только по этой причине я советую вам устанавливать ваш код статически и заранее предупреждать пользователей о возможных проблемах.&lt;/p&gt;
						&lt;p&gt;Передача запросов с XMLHttpRequest&lt;/p&gt;
						&lt;p&gt;После того как вы создали объект request, можете начать цикл запрос/ответ. Вспомните, что единственной целью объекта XMLHttpRequest является предоставление вам возможности посылать запросы и получать ответы. Все остальное (изменение пользовательского интерфейса, замена изображений, даже интерпретация переданных сервером данных) – это работа javascript, CSS или другого кода на ваших страницах. С готовым к использованию XMLHttpRequest вы можете сейчас послать запрос серверу.&lt;/p&gt;
						&lt;p&gt;Добро пожаловать в &amp;quot;песочницу&amp;quot;&lt;/p&gt;
						&lt;p&gt;Ajax имеет модель безопасности по типу &amp;quot;песочницы&amp;quot;. В результате ваш Ajax-код (и, в частности, объект XMLHttpRequest) может посылать запросы только тому домену, на котором выполняется. Вы подробнее узнаете о безопасности и Ajax в следующей статье, а теперь просто запомните, что код, выполняющийся на вашем локальном компьютере, может выполнять запросы только к серверным сценариям на вашем локальном компьютере. Если ваш Ajax-код работает на wwwbreakneckpizza.com, он должен посылать запросы к сценариям, работающим на wwwbreakneckpizza.com.&lt;/p&gt;
						&lt;p&gt;Установка URL сервера&lt;/p&gt;
						&lt;p&gt;Первое, что вам необходимо определить – это URL сервера для подключения. Это не является специфичным для Ajax (очевидно вы должны знать, как составить URL), но это существенно для выполнения соединения. В большинстве приложений вы будете составлять этот URL из некоторого набора статических данных в комбинации с данными из формы, с которой работают ваши пользователи. Например, в листинге 7 показан код javascript, который собирает значение поля с телефонным номером и составляет URL, используя эти данные.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 7. Создание URL-запроса&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160;var request = false;&lt;br /&gt;&amp;#160; &amp;#160;try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request = new XMLHttpRequest();&lt;br /&gt;&amp;#160; &amp;#160;} catch (trymicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;request = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;} catch (othermicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;request = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} catch (failed) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;request = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;}&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;if (!request)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Error initializing XMLHttpRequest!&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160;function getCustomerInfo() {&lt;br /&gt;var phone = document.getElementById(&amp;quot;phone&amp;quot;).value;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var url = &amp;quot;/cgi-local/lookupCustomer.php?phone=&amp;quot; + escape(phone);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Ничто не должно быть здесь не понятным для вас. Сначала код создает новую переменную phone и присваивает ей значение поля формы, имеющего ID &amp;quot;phone&amp;quot;. В листинге 8 приведен XHTML для этой конкретной формы, в которой вы можете увидеть поле field и его атрибут id.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 8. Форма &amp;quot;Break Neck Pizza&amp;quot;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;img src=&amp;quot;breakneck-logo_4c.gif&amp;quot; alt=&amp;quot;Break Neck Pizza&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;form action=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Enter your phone number:&lt;br /&gt;&amp;lt;input type=&amp;quot;text&amp;quot; size=&amp;quot;14&amp;quot; name=&amp;quot;phone&amp;quot; id=&amp;quot;phone&amp;quot; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;onchange=&amp;quot;getCustomerInfo();&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Your order will be delivered to:&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;address&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Type your order in here:&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;textarea name=&amp;quot;order&amp;quot; rows=&amp;quot;6&amp;quot; cols=&amp;quot;50&amp;quot; id=&amp;quot;order&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Order Pizza&amp;quot; id=&amp;quot;submit&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;/p&gt;
						&lt;p&gt;Обратите также внимание, что когда пользователи вводят телефонный номер или изменяют номер, вызывается метод getCustomerInfo(), приведенный в листинге 8. Затем этот метод собирает этот номер и использует его для составления строки URL, сохраняемой в переменной url. Помните: поскольку Ajax-код выполняется в &amp;quot;песочнице&amp;quot; и может соединяться только с тем же самым доменом, вам фактически не нужно указывать домен в URL. В данном примере имя сценария - /cgi-local/lookupCustomer.php. Наконец, номер телефона добавляется к этому сценарию как параметр GET: &amp;quot;phone=&amp;quot; + escape(phone).&lt;/p&gt;
						&lt;p&gt;Для тех, кто никогда прежде не видел метод escape(), я поясню - он используется для перевода в другое представление любого символа, который не может быть передан корректно в виде простого текста. Например, все пробелы в номере телефона преобразуются в символы %20, что дает возможность передачи этих символов в URL.&lt;/p&gt;
						&lt;p&gt;Вы можете добавить столько параметров, сколько нужно. Например, если вы хотите добавить еще один параметр, просто добавьте его к URL и разделите параметры символом амперсанда (&amp;amp;) [первый параметр отделяется от имени сценария знаком вопроса (?)].&lt;/p&gt;
						&lt;p&gt;Открытие запроса&lt;br /&gt;alt 	&lt;br /&gt;Открывает ли open()?&lt;br /&gt;Internet-разработчики не пришли к согласию насчет того, что точно делает метод open(). Чего он действительно не делает, так это не открывает запрос. Если бы вы проследили за сетью и передачей данных между вашей XHTML/Ajax-страницей и сценарием, с которым она связана, то не увидели бы никакого трафика при вызове метода open(). Непонятно почему было выбрано именно это имя, но ясно, что это не лучший выбор.&lt;/p&gt;
						&lt;p&gt;Имея URL, вы можете сконфигурировать запрос. Это делается при помощи метода open() вашего объекта XMLHttpRequest. Этот метод принимает пять параметров:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * request-type: Тип передаваемого запроса. Обычными значениями являются GET или POST, но вы можете также передать HEAD-запросы.&lt;br /&gt;&amp;#160; &amp;#160; * url: URL для соединения.&lt;br /&gt;&amp;#160; &amp;#160; * asynch: True, если вы хотите, чтобы запрос был асинхронным, и false, если он должен быть синхронным. Этот параметр необязателен и по умолчанию равен true.&lt;br /&gt;&amp;#160; &amp;#160; * username: Если требуется аутентификация, то здесь вы можете указать имя пользователя. Это необязательный параметр и он не имеет значения по умолчанию.&lt;br /&gt;&amp;#160; &amp;#160; * password: Если требуется аутентификация, здесь вы можете указать пароль. Это необязательный параметр и он не имеет значения по умолчанию.&lt;/p&gt;
						&lt;p&gt;Обычно вы будете использовать три первых параметра. На самом деле, даже если вы хотите асинхронный запрос, желательно указывать &amp;quot;true&amp;quot; в качестве третьего параметра. Это значение по умолчанию, но это приятная мелочь для самодокументирования. Всегда видно, асинхронный запрос или нет.&lt;/p&gt;
						&lt;p&gt;Объедините все это вместе, и у вас, скорее всего, получится примерно такая строка, какая показана в листинге 9.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 9. Открытие запроса&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function getCustomerInfo() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var phone = document.getElementById(&amp;quot;phone&amp;quot;).value;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var url = &amp;quot;/cgi-local/lookupCustomer.php?phone=&amp;quot; + escape(phone);&lt;br /&gt;request.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Как только вы вычислили URL, все становится тривиальным. Для большинства запросов использования GET достаточно (в будущих статьях вы увидите ситуации, в которых, возможно, захотите использовать POST); это все, что вам нужно для использования open().&lt;/p&gt;
						&lt;p&gt;Головоломка по асинхронии&lt;/p&gt;
						&lt;p&gt;В последующей статье этой серии я потрачу значительную часть времени на написание и использование асинхронного кода, но вы должны иметь представление о том, почему последний параметр в open() настолько важен. В обычной модели запрос/ответ (здесь думайте о Web 1.0) клиент (ваш браузер или код, выполняющийся на вашей локальной машине) посылает запрос серверу. Этот запрос является синхронным; другими словами, клиент ждет ответа от сервера. Пока клиент ждет, вы обычно получаете одну из нескольких форм уведомления о том, что вы ждете:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Песочные часы (главным образом в Windows).&lt;br /&gt;&amp;#160; &amp;#160; * Крутящийся мяч (обычно на Mac-компьютерах).&lt;br /&gt;&amp;#160; &amp;#160; * Приложение замирает и иногда меняется курсор.&lt;/p&gt;
						&lt;p&gt;Именно это дает ощущение, что Web-приложения неуклюжи или медленны – отсутствие реальной интерактивности. Когда вы нажимаете кнопку, ваше приложение главным образом становится непригодным к использованию, пока не будет получен ответ на переданный только что запрос. Если вы пошлете запрос, требующий интенсивных вычислений на сервере, время ожидания может быть значительным (по крайней мере, для сегодняшнего мира, использующего много процессоров, DSL и не привыкшего ждать).&lt;/p&gt;
						&lt;p&gt;Асинхронный запрос не ждет ответа от сервера. Вы посылаете запрос, и ваше приложение продолжает работу. Пользователи могут вводить данные в Web-форму, нажимать другие кнопки, даже уйти с формы. Нет крутящегося мяча или вращающихся песочных часов, и нет больших замираний приложения. Сервер молча отвечает на запрос, и когда завершается передача ответа, он дает знать об этом инициатору запроса (способами, о которых вы вскоре узнаете). В результате мы имеем приложение, которое не выглядит неуклюжим или медленным, а, наоборот, чувствительным, интерактивным и быстрым. Это только один компонент Web 2.0, но это очень важный компонент. Любые прекрасные GUI-компоненты и парадигмы Web-дизайна не могут преодолеть медленную, синхронную модель запрос/ответ.&lt;/p&gt;
						&lt;p&gt;Передача запроса&lt;/p&gt;
						&lt;p&gt;После настройки запроса с использованием open() вы готовы к передаче запроса. К счастью, метод для передачи запроса назван более правильно, чем open(); его просто назвали send().&lt;/p&gt;
						&lt;p&gt;send() принимает только один параметр – содержимое для передачи. Но прежде чем вы серьезно задумаетесь об этом, вспомните, что вы уже передали данные в самом URL:&lt;/p&gt;
						&lt;p&gt;var url = &amp;quot;/cgi-local/lookupCustomer.php?phone=&amp;quot; + escape(phone);&lt;br /&gt;&amp;#160; &amp;#160; 	&lt;/p&gt;
						&lt;p&gt;И хотя вы можете передать данные с использованием send(), вы можете также передать их через сам URL. В действительности в GET-запросах (которые будут составлять до 80% типичного использования Ajax) намного легче передавать данные в URL. Когда вы начинаете передавать защищенную информацию или XML, нужно рассмотреть передачу содержимого через send() (я рассмотрю защищенные данные и обмен XML-сообщениями в последующей статье этой серии). Если вам не надо передавать данные через send(), установите аргумент в значение null. Для передачи запроса в примере, используемом в данной статье, это именно то, что нам нужно (см. листинг 10).&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 10. Передача запроса&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function getCustomerInfo() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var phone = document.getElementById(&amp;quot;phone&amp;quot;).value;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var url = &amp;quot;/cgi-local/lookupCustomer.php?phone=&amp;quot; + escape(phone);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;request.send(null);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Указание метода обратного вызова&lt;/p&gt;
						&lt;p&gt;До сих пор вы сделали очень немного такого, что являлось бы чем-то новым, революционным или асинхронным. Маленькое ключевое слово &amp;quot;true&amp;quot; в методе open() устанавливает асинхронный запрос. На стороне сервера код пишется на Java-сервлетах и JSP, PHP или Perl. Так в чем же большой секрет Ajax или Web 2.0? Секрет вертится вокруг простого свойства XMLHttpRequest с названием onreadystatechange.&lt;/p&gt;
						&lt;p&gt;Прежде всего, вы должны понимать процесс, который вы создали в этом коде (пересмотрите листинг 10 при необходимости). Запрос настраивается и затем передается. Кроме того, поскольку это асинхронный процесс, javascript-метод (getCustomerInfo() в примере) не будет ожидать сервер. Поэтому код будет продолжать выполняться; в данном случае это означает, что произойдет выход из метода и управление вернется в форму. Пользователь может продолжить ввод информации, и приложение не будет ожидать сервер.&lt;/p&gt;
						&lt;p&gt;При этом возникает интересный вопрос: что происходит, когда сервер завершит обработку запроса? Ответ, по крайней мере, для имеющегося у нас на данный момент времени кода, - ничего! Очевидно, это не хорошо; следовательно, сервер должен иметь инструкцию некоего типа о том, что делать, когда он завершит обработку запроса, переданного ему объектом XMLHttpRequest.&lt;br /&gt;alt 	&lt;br /&gt;Ссылка на функцию в javascript&lt;br /&gt;javascript является слабо типизированным языком, и в переменной вы можете ссылаться почти на все, что угодно. То есть, если вы объявили функцию с названием updatePage(), javascript также рассматривает имя этой функции как переменную. Другими словами, вы можете ссылаться на функцию в вашем коде как на переменную с названием updatePage.&lt;/p&gt;
						&lt;p&gt;Здесь выходит на сцену свойство onreadystatechange. Это свойство позволяет вам указать метод обратного вызова (callback). Метод обратного вызова позволяет серверу (можете догадаться?) выполнить обратный вызов в коде вашей Web-страницы. Это добавляет в сервер уровень контроля; когда сервер завершает обработку запроса, он ищет объект XMLHttpRequest и, в частности, его свойство onreadystatechange. Затем активизируется любой метод, указанный в этом свойстве. Он называется методом обратного вызова, потому что сервер инициирует вызов в обратном направлении (в Web-странице) независимо от того, что происходит в самой Web-странице. Например, он может вызвать этот метод тогда, когда пользователь сидит в кресле, не трогая клавиатуру; однако, он может вызвать этот метод и тогда, когда пользователь вводит информацию, перемещает мышку, выполняет скроллинг страницы, нажимает кнопку... не важно, что делает пользователь.&lt;/p&gt;
						&lt;p&gt;Вот здесь и проявляет себя асинхронность: пользователь работает с формой на одном уровне, тогда как на другом уровне сервер отвечает на запрос и, затем, активизирует метод обратного вызова, указанный в свойстве onreadystatechange. Поэтому вы должны указать этот метод в вашем коде, как показано в листинге 11.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 11. Установка метода обратного вызова&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function getCustomerInfo() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var phone = document.getElementById(&amp;quot;phone&amp;quot;).value;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var url = &amp;quot;/cgi-local/lookupCustomer.php?phone=&amp;quot; + escape(phone);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;request.onreadystatechange = updatePage;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.send(null);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Обратите особое внимание на то, где в коде устанавливается это свойство – перед вызовом send(). Вы должны установить это свойство перед передачей запроса, поэтому сервер может просмотреть его после завершения обработки запроса. Все, что нам осталось – написать updatePage(), что и рассматривается в последнем разделе этой статьи.&lt;/p&gt;
						&lt;p&gt;Обработка ответов сервера&lt;/p&gt;
						&lt;p&gt;Вы передали запрос, ваш пользователь с удовольствием работает с Web-формой (в то время, когда сервер обрабатывает запрос), и теперь сервер завершает обработку запроса. Сервер просматривает свойство onreadystatechange и определяет, какой вызвать метод. После этого вы можете представлять свое приложение как любое другое приложение, асинхронное или нет. Другими словами, вы не должны принимать каких-либо специальных действий по написанию методов, реагирующих на сервер; просто измените форму, перенаправьте пользователя на другой URL, или сделайте все что хотите, реагируя на переданный из сервера ответ. В этом разделе мы остановимся на реакции на ответ от сервера и выполним обычное действие – изменим на лету часть формы, которую видит пользователь.&lt;/p&gt;
						&lt;p&gt;Обратные вызовы и Ajax&lt;/p&gt;
						&lt;p&gt;Вы уже увидели, как дать серверу знать, что делать после завершения обработки запроса: установить свойство onreadystatechange объекта XMLHttpRequest в имя функции, которая будет выполнена. Затем, когда сервер обработает запрос, он автоматически вызовет эту функцию. Вы также не должны беспокоиться о каких-либо параметрах этого метода. Начнем с простого метода, аналогичного показанному в листинге 12.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 12. Код метода обратного вызова&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160;var request = false;&lt;br /&gt;&amp;#160; &amp;#160;try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request = new XMLHttpRequest();&lt;br /&gt;&amp;#160; &amp;#160;} catch (trymicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;request = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;} catch (othermicrosoft) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;request = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} catch (failed) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;request = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;}&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;if (!request)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Error initializing XMLHttpRequest!&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160;function getCustomerInfo() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var phone = document.getElementById(&amp;quot;phone&amp;quot;).value;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;var url = &amp;quot;/cgi-local/lookupCustomer.php?phone=&amp;quot; + escape(phone);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.onreadystatechange = updatePage;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;request.send(null);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;br /&gt;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Server is done!&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Он просто выводит предупреждение о том, что сервер закончил свою работу. Попробуйте этот код на своей собственной странице, сохраните страницу и откройте ее в браузере (если вы хотите взять XHTML из этого примера, обратитесь к листингу 8). Когда вы введете номер телефона и покинете поле, вы должны увидеть всплывающее окно (см. рисунок 3); нажмите кнопку ОК и окно всплывет снова... и снова.&lt;/p&gt;
						&lt;p&gt;Рисунок 3. Ajax-код вывода всплывающего предупреждения&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s3/6a/56/de/08/6a56de0808c316c84ff691a207fe6e34.jpg&quot; alt=&quot;http://pics.kz/s3/6a/56/de/08/6a56de0808c316c84ff691a207fe6e34.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;В зависимости от вашего браузера вы получите два, три или даже четыре предупреждения, прежде чем форма прекратит отображать всплывающее окно. Что же происходит? Вы не приняли во внимание состояние готовности HTTP, важного компонента цикла запрос/ответ.&lt;/p&gt;
						&lt;p&gt;Состояния готовности HTTP&lt;/p&gt;
						&lt;p&gt;Раньше я говорил, что сервер, закончив обработку запроса, ищет, какой метод вызвать в свойстве onreadystatechange объекта XMLHttpRequest. Это правда, но это не вся правда. На самом деле он вызывает этот метод каждый раз, когда меняется состояние готовности HTTP. Что это значит? Хорошо, вы сначала узнаете об этих состояниях.&lt;/p&gt;
						&lt;p&gt;Состояние готовности HTTP отображает состояние или статус запроса. Оно используется для определения того, начат ли запрос, принимается ли ответ, или завершен ли цикл запрос/ответ. Это состояние помогает также при определении того, можно ли читать текст или данные, которые сервер мог предоставить в ответе. Вы должны знать о пяти состояниях готовности в ваших Ajax-приложениях:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * 0: Запрос не инициализирован (перед вызовом open()).&lt;br /&gt;&amp;#160; &amp;#160; * 1: Запрос инициализирован, но не был передан (перед вызовом send()).&lt;br /&gt;&amp;#160; &amp;#160; * 2: Запрос был передан и обрабатывается (на данном этапе вы можете обычно получить заголовки содержимого из ответа).&lt;br /&gt;&amp;#160; &amp;#160; * 3: Запрос обрабатывается; часто в ответе доступны некоторые частичные данные, но сервер не закончил свой ответ.&lt;br /&gt;&amp;#160; &amp;#160; * 4: Ответ завершен; вы можете получить ответ сервера и использовать его.&lt;/p&gt;
						&lt;p&gt;Как и почти все кросс-браузерные проблемы, эти состояния готовности используются несколько непоследовательно. Вы могли бы ожидать, что состояния всегда изменяются от 0 к 1, от 1 к 2, от 2 к 3, от 3 к 4, но на практике это редкий случай. Некоторые браузеры никогда не выдают 0 или 1, а сразу перепрыгивают к 2, затем к 3 и 4. Другие браузеры выдают все состояния. Но некоторые выдают состояние 1 несколько раз. Как вы видели в последнем разделе, сервер вызывал updatePage() несколько раз, и каждый вызов приводил к появлению всплывающего окна предупреждения – наверное, это не то, чего вы хотели!&lt;/p&gt;
						&lt;p&gt;Для Ajax-программирования единственное состояние, с которым вы должны иметь дело, - это состояние готовности 4, указывающее на то, что ответ сервера завершен и можно проверить ответные данные и использовать их. Для учета этого первая строка в вашем методе обратного вызова должна быть такой, как показано в листинге 13.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 13. Проверка состояния готовности&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;if (request.readyState == 4)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Server is done!&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Это изменение проверяет, действительно ли сервер завершил процесс. Попробуйте поработать с этой версией кода, и вы должны получить только одно предупреждающее сообщение, как и должно быть.&lt;/p&gt;
						&lt;p&gt;Коды состояния HTTP&lt;/p&gt;
						&lt;p&gt;Несмотря на явный успех кода в листинге 13, есть одна проблема – что если сервер ответил на ваш запрос и завершил обработку, но возвращает ошибку? Вспомните, ваш серверный код не знает, был ли вызван он Ajax-приложением, JSP-страницей, обычной HTML-формой или любым другим типом кода; он имеет только традиционные Web-методы оповещения. И в Web-мире HTTP-коды могут иметь дело с различными вещами, которые могут возникнуть в запросе.&lt;/p&gt;
						&lt;p&gt;Например, вы составили запрос к URL, ввели URL неправильно и получили код ошибки 404, указывающий, что страница отсутствует. Это один из многих кодов состояния, которые могут получать HTTP-запросы (ссылка на полный список кодов состояния приведен в разделе Ресурсы). Также распространенными являются коды 403 и 401, указывающие на то, что запрашиваются защищенные или запрещенные данные. В каждом из этих случаев есть коды, которые приходят в ответе. Другими словами, сервер выполнил запрос (означает, что состояние готовности HTTP равно 4), но, возможно, не возвращает данные, ожидаемые клиентом.&lt;/p&gt;
						&lt;p&gt;То есть, кроме состояния готовности вы должны также проверять HTTP-состояние. Вам подходит код состояния 200, просто означающий, что все в порядке. С состоянием готовности 4 и кодом состояния 200 вы готовы обработать серверные данные, и эти данные должны быть теми, которые вы запрашивали (и нет ошибок или другой проблемной информации). Добавьте еще одну проверку в ваш метод обратного вызова, как показано в листинге 14.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 14. Проверка кода состояния HTTP&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4)&lt;br /&gt;if (request.status == 200)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Server is done!&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Для более устойчивой обработки ошибок (с минимальным усложнением кода) вы можете добавить проверку или две для других кодов состояния; Посмотрите на модифицированную версию updatePage() в листинге 15.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 15. Добавление некоторой обработки ошибок&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;if (request.status == 200)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Server is done!&amp;quot;);&lt;br /&gt;else if (request.status == 404)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Request URL does not exist&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;Error: status code is &amp;quot; + request.status);&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Теперь измените URL в getCustomerInfo() в несуществующий URL и посмотрите, что произойдет. Вы должны увидеть предупреждение, говорящее о том, что запрошенный вами URL не существует – отлично! Очень трудоемко обрабатывать все ошибки, но это простое изменение решит 80 % проблем, которые могут возникнуть в обычном Web-приложении.&lt;/p&gt;
						&lt;p&gt;Чтение текста ответа&lt;/p&gt;
						&lt;p&gt;Теперь, когда вы убеждены, что запрос полностью обработан (через состояние готовности) и сервер вернул нормальный положительный ответ (через код состояния), можно, наконец, заняться данными, переданными от сервера. Они удобно сохранены в свойстве responseText объекта XMLHttpRequest.&lt;/p&gt;
						&lt;p&gt;Подробности о тексте в responseText, в терминах формата или длины, преднамеренно оставлены неопределенными. Это позволяет серверу установить этот текст виртуально во все что угодно. Например, один сценарий может возвратить разделенные запятыми значения, другой – разделенные вертикальной чертой значения (символ &amp;quot;|&amp;quot;), а третий может возвратить одну длинную строку текста. Это решает сервер.&lt;/p&gt;
						&lt;p&gt;В примере этой статьи сервер возвращает последний заказ клиента и его адрес, разделенные символом вертикальной черты. Заказ и адрес используются для установки элементов формы; в листинге 16 приведен код, обновляющий дисплей.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 16. Работа с ответом сервера&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160;function updatePage() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;if (request.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;if (request.status == 200) {&lt;br /&gt;var response = request.responseText.split(&amp;quot;|&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;order&amp;quot;).value = response[0];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;document.getElementById(&amp;quot;address&amp;quot;).innerHTML =&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;response[1].replace(/\n/g, &amp;quot;&lt;br /&gt;&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160;} else&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;alert(&amp;quot;status is &amp;quot; + request.status);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;}&lt;br /&gt;&amp;#160; &amp;#160;}&lt;/p&gt;
						&lt;p&gt;Сначала извлекается responseText и разделяется на части по символам вертикальной строки (&amp;quot;|&amp;quot;) при помощи метода javascript split(). Получившийся массив значений присваивается массиву response. Первое значение (последний заказ клиента) находится в response[0] и устанавливается как значение поля с ID &amp;quot;order.&amp;quot; Второе значение массива, response[1], является адресом клиента и требует несколько большей обработки. Поскольку строки в адресе разделены обычными разделителями строк (символ &amp;quot;\n&amp;quot;), нужно заменить их XHTML-разделителями строк &amp;lt;br /&amp;gt;. Это выполняется при помощи функции replace() с регулярным выражением. Наконец, модифицированный текст устанавливается как inner HTML элемента div в форме HTML. В результате этого форма неожиданно обновляется пользовательской информацией, как показано на рисунке 4.&lt;/p&gt;
						&lt;p&gt;Рисунок 4. Форма Break Neck после извлечения пользовательских данных&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s3/58/fe/e5/99/58fee59951174096dfdc7d289c73fc1b.jpg&quot; alt=&quot;http://pics.kz/s3/58/fe/e5/99/58fee59951174096dfdc7d289c73fc1b.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Перед заключением рассмотрим еще одно важное свойство XMLHttpRequest - responseXML. Это свойство содержит (догадались?) XML-ответ в случае, если сервер решил ответить в XML-формате. Работа с XML ответом существенно отличается от работы с обычным неформатированным текстом и включает работу с синтаксическим анализатором, Document Object Model (DOM) и некоторые другие соображения. Более подробно о работе с XML вы узнаете из будущей статьи. Пока же, поскольку responseXML обычно рассматривается при обсуждении responseText, мы просто упомянем его. Для многих простых Ajax-приложений responseText – это все что вам нужно, но вскоре вы научитесь работать также и с XML в Ajax-приложениях.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;В заключение&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Вы, возможно, уже немножко устали от XMLHttpRequest – я редко читаю целую статью об одном объекте, особенно если он простой. Однако вы будете использовать этот объект снова и снова в каждой странице и приложении, которое пишете с использованием Ajax. По правде говоря, осталось еще кое-что, что нужно сказать об XMLHttpRequest. В последующих статьях вы научитесь использовать в ваших запросах POST в дополнение к GET, устанавливать и читать заголовки содержимого в ваших запросах и ответах сервера; вы научитесь кодировать ваши запросы и даже работать с XML в вашей модели запрос/ответ.&lt;/p&gt;
						&lt;p&gt;Немного позже вы увидите некоторые популярные доступные инструментальные средства для Ajax. Эти средства действительно абстрагируют большинство деталей, рассмотренных в данной статье, и облегчают Ajax-программирование. Вы даже можете удивиться, зачем кодировать все эти низкоуровневые детали, если широко доступен инструментарий. Ответ заключается в том, что ужасно трудно выявить проблему в вашем приложении, если вы не понимаете, что в этом приложении происходит.&lt;/p&gt;
						&lt;p&gt;Поэтому не игнорируйте эти детали и не просматривайте их беглым взглядом; когда ваша инструментальная программа создаст ошибку, вы не застрянете на ней, почесывая голову и посылая электронные письма в службу поддержки. Со знанием методов непосредственного использования XMLHttpRequest вы обнаружите, насколько легко отлаживать и исправлять даже самые странные ошибки. Инструментарий хорош тогда, когда вы можете полностью рассчитывать на него в решении всех ваших проблем.&lt;/p&gt;
						&lt;p&gt;Поэтому чувствуйте себя комфортно с XMLHttpRequest. Даже если у вас есть работающий Ajax-код, который был создан с использованием инструментальной программы, попробуйте переписать его, используя только объект XMLHttpRequest и его свойства и методы. Это будет отличной тренировкой и, возможно, поможет вам намного лучше понять, что происходит.&lt;/p&gt;
						&lt;p&gt;В следующей статье вы еще глубже проникнете в этот объект, исследуя некоторые из его хитрых свойств (например, responseXML), а также узнаете, как использовать POST-запросы и передавать данные в нескольких различных форматах. Итак, начнем кодирование.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (TaronTo)</author>
			<pubDate>Wed, 23 Dec 2009 16:37:22 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=32#p32</guid>
		</item>
		<item>
			<title>Освоение Ajax: часть 1. Введение в Ajax</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=31#p31</link>
			<description>&lt;p&gt;Источник: wwwibm.com&lt;/p&gt;
						&lt;p&gt;Уровень сложности: простой&lt;/p&gt;
						&lt;p&gt;Брэт Маклафлин, автор и редактор, O&#039;Reilly Media Inc.&lt;/p&gt;
						&lt;p&gt;06.12.2005&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; Ajax, состоящий из HTML, технологии javascript™, DHTML и DOM, это замечательный подход, который помогает вам преобразовать тяжеловесные Web-интерфейсы в интерактивные Ajax-приложения. Автор, эксперт по Ajax, демонстрирует совместную работу этих технологий (от общего обзора до детального изучения), цель которой – сделать чрезвычайно эффективную Web-разработку повседневной реальностью. Он также раскрывает основные концепции Ajax, включая объект XMLHttpRequest.&lt;/p&gt;
						&lt;p&gt;Пять лет назад вы были гадким утенком (с которым никто не разговаривал), если не знали XML. Восемнадцать месяцев назад в центре внимания оказался Ruby, а программисты, не знающие что с ним происходит, не были приглашены к бачку с охлажденной водой. Сегодня, если вы хотите попасть на технологическую вечеринку, нужен Ajax.&lt;/p&gt;
						&lt;p&gt;Однако, Ajax – это далеко не чья-то прихоть, а мощный подход к созданию Web-сайтов, который не так трудно изучить, как полностью новый язык.&lt;/p&gt;
						&lt;p&gt;Перед тем, как я погружусь в детали Ajax, давайте потратим пару минут на осмысление того, что же делает Ajax. Когда в наше время вы пишете приложение, у вас есть два основных варианта:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Настольные приложения&lt;br /&gt;&amp;#160; &amp;#160; * Web-приложения&lt;/p&gt;
						&lt;p&gt;Оба варианта знакомы; настольные приложения обычно поставляются на CD (или иногда загружаются с Web-сайта) и устанавливаются целиком на вашем компьютере. Они могут использовать Интернет для загрузки обновлений, но код, выполняющий эти приложения, размещен на вашем рабочем столе. Web-приложения (и это не удивительно) работают где-то на Web-сервере, а вы обращаетесь к этим приложениям через ваш Web-браузер.&lt;/p&gt;
						&lt;p&gt;Более важным является то, что от того, где выполняется код этих приложений, зависит их поведение и способ вашего взаимодействия с ними. Настольные приложения обычно достаточно быстрые (они работают на вашем компьютере; вы не ждете интернет-подключения), имеют отличные пользовательские интерфейсы (обычно взаимодействующие с вашей операционной системой) и невероятно динамичны. Вы можете щелкать мышкой, вводить текст, пользоваться ниспадающими и всплывающими меню, перемещаться по окнам практически без каких-либо задержек.&lt;/p&gt;
						&lt;p&gt;С другой стороны, Web-приложения обычно самые свежие по времени и предоставляют возможности, которые вы никогда бы не смогли иметь на вашем компьютере (вспомните Amazon.com и eBay). Однако с могуществом Web приходит ожидание – ожидание ответа от сервера, ожидание обновления экрана, ожидание ответа на запрос и генерирования новой страницы.&lt;/p&gt;
						&lt;p&gt;Ясно, что все это упрощение, но вы получили общее представление. Как вы, возможно, уже подозреваете, Ajax пытается преодолеть разрыв между функциональностью и интерактивностью настольного приложения и всегда обновленным Web-приложением. Вы можете использовать динамические пользовательские интерфейсы, аналогичные имеющимся в настольном приложении, но доступные в Web-приложении.&lt;/p&gt;
						&lt;p&gt;Так чего же мы ждем? Начнем рассмотрение Ajax и способов превращения ваших неуклюжих Web-интерфейсов в чувствительные Ajax-приложения.&lt;/p&gt;
						&lt;p&gt;Старая технология, новые хитрости&lt;/p&gt;
						&lt;p&gt;Что касается Ajax, то реальность такова, что он охватывает много технологий – для его освоения необходимо углубиться в несколько различных технологий (вот почему я разобью на независимые части первые несколько статей из этой серии). Хорошей новостью является то, что вы, возможно, уже знаете достаточно о многих из этих технологий – большинство из этих индивидуальных технологий изучаются легко (определенно не так трудно, как язык программирования полностью, например Java или Ruby).&lt;br /&gt;alt 	&lt;br /&gt;Определение Ajax&lt;/p&gt;
						&lt;p&gt;Между прочим, Ajax – это аббревиатура от Asynchronous javascript and XML (и DHTML, и т.д.). Фраза была придумана Джессе Джеймсом Гарретом из Adaptive Path (см. раздел Ресурсы) и, по словам Джессе, не предназначалась быть аббревиатурой.&lt;/p&gt;
						&lt;p&gt;Вот основные технологии, вовлеченные в Ajax-приложения:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * HTML используется для создания Web-форм и указания полей для использования в вашем приложении.&lt;br /&gt;&amp;#160; &amp;#160; * javascript-код – это основной код, выполняющий Ajax-приложения и обеспечивающий взаимодействие с серверными приложениями.&lt;br /&gt;&amp;#160; &amp;#160; * DHTML, или Dynamic HTML, помогает динамически обновлять формы. Вы будете использовать div, span и другие динамические HTML-элементы для разметки вашего HTML.&lt;br /&gt;&amp;#160; &amp;#160; * DOM, Document Object Model (объектная модель документов), будет использоваться (через код javascript) для работы и со структурой вашего HTML, и (в некоторых случаях) с XML, полученным от сервера.&lt;/p&gt;
						&lt;p&gt;Рассмотрим все это по отдельности и разберемся в том, что делает каждая из этих технологий. Я исследую каждую из них в следующих статьях; сейчас просто познакомимся поближе с этими компонентами и технологиями. Чем больше вы знаете о них, тем легче перейти от бессистемных знаний к освоению каждой из них (и действительно улучшить процесс разработки Web-приложений).&lt;/p&gt;
						&lt;p&gt;Объект XMLHttpRequest&lt;/p&gt;
						&lt;p&gt;Первый объект, о котором вы хотите узнать, возможно, самый новый для вас; он называется XMLHttpRequest. Это объект javascript, и он создается так же просто, как показано в листинге 1.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Листинг 1. Создание нового объекта XMLHttpRequest&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var xmlHttp = new XMLHttpRequest();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;Я детально расскажу об этом объекте в следующей статье, а сейчас осознайте, что это объект, который управляет всем вашим взаимодействием с сервером. Прежде чем идти дальше, остановитесь и подумайте об этом – это технология javascript в объекте XMLHttpRequest, который общается с сервером. Это не обычный ход работы приложения, и именно здесь заключается почти вся магия Ajax.&lt;/p&gt;
						&lt;p&gt;В нормальных Web-приложениях пользователи заполняют поля форм и нажимают кнопку Submit (подтвердить). Затем форма передается на сервер полностью, сервер обрабатывает сценарий (обычно PHP или Java, возможно, CGI-процесс или что-то в этом роде), а потом передает назад всю новую страницу. Эта страница может быть HTML-страницей с новой формой с некоторыми заполненными данными, либо страницей подтверждения, либо, возможно, страницей с какими-то выбранными вариантами, зависящими от введенных в оригинальную форму данных. Естественно, пока сценарий или программа на сервере не обработается и не возвратится новая форма, пользователи должны ждать. Их экраны очистятся и будут перерисовываться по мере поступления новых данных от сервера. Вот где проявляется низкая интерактивность – пользователи не получают немедленной обратной реакции и определенно чувствуют себя не так, как при работе с настольными приложениями.&lt;/p&gt;
						&lt;p&gt;Ajax по существу помещает технологию javascript и объект XMLHttpRequest между вашей Web-формой и сервером. Когда пользователи заполняют формы, данные передаются в какой-то javascript-код, а не прямо на сервер. Вместо этого javascript-код собирает данные формы и передает запрос на сервер. Пока это происходит, форма на экране пользователя не мелькает, не мигает, не исчезает и не блокируется. Другими словами, код javascript передает запрос в фоновом режиме; пользователь даже не замечает, что происходит запрос на сервер. Более того, запрос передается асинхронно, а это означает, что ваш javascript-код (и пользователь) не ожидают ответа сервера. То есть, пользователи могут продолжать вводить данные, прокручивать страницу и работать с приложением.&lt;/p&gt;
						&lt;p&gt;Затем сервер передает данные обратно в ваш javascript-код (все еще находящийся в вашей Web-форме), который решает, что делать с данными. Он может обновить поля формы &amp;quot;на лету&amp;quot;, придавая свойство немедленности вашему приложению – пользователи получают новые данные без подтверждения или обновления их форм. javascript-код может даже получить данные, выполнить какие-либо вычисления и передать еще один запрос, и все это без вмешательства пользователя! В этом заключается мощь XMLHttpRequest. Он может общаться с сервером по своему желанию, а пользователь даже не догадывается о том, что происходит на самом деле. В результате мы получаем динамичность, чувствительность, высокую интерактивность настольного приложения вместе со всеми возможностями интернет.&lt;/p&gt;
						&lt;p&gt;Добавление javascript-кода&lt;/p&gt;
						&lt;p&gt;После того, как вы разберетесь с XMLHttpRequest, оставшийся javascript-код превращается в рутинную работу. Фактически, вы будете использовать javascript-код для небольшого числа основных задач:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Получить данные формы: javascript-код упрощает извлечение данных из вашей HTML-формы и передает их на сервер.&lt;br /&gt;&amp;#160; &amp;#160; * Изменить значения в форме: Форма обновляется тоже легко, от установки значений полей до замены изображений &amp;quot;на лету&amp;quot;.&lt;br /&gt;&amp;#160; &amp;#160; * Выполнить анализ HTML и XML: Вы будете использовать javascript-код для управления DOM (см. следующий раздел) и для работы со структурой вашей HTML-формы и всеми XML-данными, возвращаемыми сервером.&lt;/p&gt;
						&lt;p&gt;Для выполнения первых двух задач вы должны очень хорошо знать метод getElementById(), приведенный в листинге 2.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 2. Сбор и установка значений полей при помощи javascript-кода&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;// Получить значение поля &amp;quot;phone&amp;quot; и записать его в переменную phone&lt;br /&gt;var phone = document.getElementById(&amp;quot;phone&amp;quot;).value;&lt;br /&gt;// Установить значения в форме, используя массив response&lt;br /&gt;document.getElementById(&amp;quot;order&amp;quot;).value = response[0];&lt;br /&gt;document.getElementById(&amp;quot;address&amp;quot;).value = response[1];&lt;/p&gt;
						&lt;p&gt;Здесь нет ничего такого уж выдающегося, и это здорово! Вы должны начать понимать, что нет ничего чрезмерно сложного во всем этом. Как только вы освоите XMLHttpRequest, оставшаяся часть вашего Ajax-приложения будет простым javascript-кодом, похожим на приведенный в листинге 2, смешанным с немного более умным HTML. К тому же, время от времени есть немного работы с DOM... Итак, давайте рассмотрим это.&lt;/p&gt;
						&lt;p&gt;Завершение с DOM&lt;/p&gt;
						&lt;p&gt;И последнее, хотя и не менее важное, - это DOM, Document Object Model (объектная модель документа). Для некоторых из вас слухи о DOM могут быть немного пугающими – она не часто используется HTML-дизайнерами и даже немного не свойственна кодировщикам на javascript (пока вы действительно не решаете каких-либо программных задач высокого уровня). Вы можете найти широкое применение DOM в тяжеловесных программах, написанных на языках Java и C/C++; фактически, это и принесло DOM репутацию сложной и трудной для изучения.&lt;/p&gt;
						&lt;p&gt;К счастью, использование DOM в технологии javascript является делом легким и в основном интуитивным. Сейчас мне, наверное, надо было бы рассказать вам, как использовать DOM или хотя бы привести пару примеров кода, но даже это сбило бы вас с верного пути. Дело в том, что вы можете продвинуться довольно далеко в изучении Ajax без необходимости примешивать сюда DOM, и это именно тот путь, который я хочу вам показать. Я вернусь к DOM в следующей статье, но сейчас просто знайте, что она где-то здесь. Когда вы начнете передавать XML-данные вперед и назад между вашим javascript-кодом и реальными изменениями HTML-формы, вы углубитесь в DOM. А пока можно эффективно работать с Ajax без DOM, так что пока отложим ее до поры до времени.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Получение объекта Request&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Вооруженные этим общим обзором, вы готовы к более пристальному изучению. Поскольку XMLHttpRequest является центральным для Ajax-приложений (и, возможно, нов для многих из вас) я начну с него. Как вы видели в листинге 1, создать этот объект и использовать его должно быть просто, не правда ли? Подождите минуточку.&lt;/p&gt;
						&lt;p&gt;Помните те ужасные войны браузеров, происходившие несколько лет назад, и как ничто не работало одинаково в разных браузерах? Поверите вы или нет, но те войны продолжаются до сих пор, хотя и с намного меньшим масштабом. И, сюрприз: XMLHttpRequest – это одна из жертв этих войн. Поэтому вы должны выполнить несколько различных действий для обеспечения возможности работы XMLHttpRequest. Я покажу вам как это сделать шаг за шагом.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Работа с браузерами Microsoft&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Браузер Microsoft Internet Explorer для обработки XML использует анализатор MSXML (ссылки на дополнительную информацию по MSXML вы можете найти в разделе Ресурсы). Поэтому, когда вы пишете Ajax-приложения, которые должны работать в Internet Explorer, необходимо создать объект особым способом.&lt;/p&gt;
						&lt;p&gt;Однако, это не так то и легко. На самом деле в ходу две различных версии MSXML. Версия MSXML зависит от версии технологии javascript, установленной в Internet Explorer, поэтому вам нужно написать код, подходящий для обеих версий. Взгляните на листинг 3, в котором приведен код для создания XMLHttpRequest в браузерах Microsoft.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 3. Создание объекта XMLHttpRequest в браузерах Microsoft&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;var xmlHttp = false;&lt;br /&gt;try {&lt;br /&gt;&amp;#160; xmlHttp = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;} catch (e) {&lt;br /&gt;&amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; xmlHttp = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; } catch (e2) {&lt;br /&gt;&amp;#160; &amp;#160; xmlHttp = false;&lt;br /&gt;&amp;#160; }&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;Все это пока может не иметь смысла, но это нормально. Вы углубитесь в программирование на javascript, обработку ошибок, условную компиляцию и многое другое еще до окончания этой статьи. А пока вы должны записать в своей голове две основных строки:&lt;/p&gt;
						&lt;p&gt;xmlHttp = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;/p&gt;
						&lt;p&gt;и&lt;/p&gt;
						&lt;p&gt;xmlHttp = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);.&lt;/p&gt;
						&lt;p&gt;В двух словах, этот код пытается создать объект, используя одну версию MSXML; если это не получится, создается объект для второй версии. Изящно, да? Если ничего не сработало, переменная xmlHttp устанавливается в false, для того чтобы указать вашему коду, что что-то не так. В этом случае вы, возможно, работаете с браузером не от Microsoft и должны использовать другой код для выполнения работы.&lt;/p&gt;
						&lt;p&gt;Работа с Mozilla и браузерами не от Microsoft&lt;/p&gt;
						&lt;p&gt;Если Internet Explorer не ваш браузер, либо вы пишете код для браузеров не от Microsoft, вам нужен другой код. Фактически, это простая строка, которую вы видели в листинге 1:&lt;/p&gt;
						&lt;p&gt;var xmlHttp = new XMLHttpRequest object;.&lt;/p&gt;
						&lt;p&gt;Эта намного более простая строка создает объект XMLHttpRequest в Mozilla, Firefox, Safari, Opera и в большой степени в каждом браузере не от Microsoft, поддерживающем Ajax в любой форме или разновидности.&lt;/p&gt;
						&lt;p&gt;Объединение&lt;/p&gt;
						&lt;p&gt;Мы хотим поддерживать все браузеры. Кто хочет писать приложение, работающее только в Internet Explorer, или приложение, работающее только во всех остальных браузерах? Еще хуже, хотите ли вы написать ваше приложение дважды? Конечно, нет! Итак, объединим поддержку для Internet Explorer и для остальных браузеров. В листинге 4 приведен код, делающий это.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 4. Создание объекта XMLHttpRequest для всех браузеров&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;/* Создание нового объекта XMLHttpRequest для общения с Web-сервером */&lt;br /&gt;var xmlHttp = false;&lt;br /&gt;/*@cc_on @*/&lt;br /&gt;/*@if (@_jscript_version &amp;gt;= 5)&lt;br /&gt;try {&lt;br /&gt;&amp;#160; xmlHttp = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;} catch (e) {&lt;br /&gt;&amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; xmlHttp = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;#160; } catch (e2) {&lt;br /&gt;&amp;#160; &amp;#160; xmlHttp = false;&lt;br /&gt;&amp;#160; }&lt;br /&gt;}&lt;br /&gt;@end @*/&lt;br /&gt;if (!xmlHttp &amp;amp;&amp;amp; typeof XMLHttpRequest != &#039;undefined&#039;) {&lt;br /&gt;&amp;#160; xmlHttp = new XMLHttpRequest();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;Пока проигнорируйте комментарии и непонятные теги, типа @cc_on; это специальные команды javascript-компилятора, которые мы рассмотрим детально в моей следующей статье, которая будет полностью посвящена XMLHttpRequest. Основу этого кода можно разделить на три шага:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;1. Создайте переменную xmlHttp для ссылки на объект XMLHttpRequest, который вы создадите.&lt;br /&gt;&amp;#160; &amp;#160;2. В блоке try создайте объект в браузерах Microsoft:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * В блоке try создайте объект с использованием объекта Msxml2.XMLHTTP.&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; * Если это не получится, В блоке try создайте объект с использованием объекта Microsoft.XMLHTTP.&lt;br /&gt;&amp;#160; &amp;#160;3. Если xmlHttp все еще не установлен, создайте объект для остальных браузеров.&lt;/p&gt;
						&lt;p&gt;В конце этого процесса xmlHttp должен ссылаться на корректный объект XMLHttpRequest, независимо от используемого пользователем браузера.&lt;/p&gt;
						&lt;p&gt;Пара слов о защите&lt;/p&gt;
						&lt;p&gt;Как насчет защиты? Современные браузеры предлагают пользователям возможность повысить уровень безопасности, отключить технологию javascript и запретить множество настроек в своих браузерах. В этих ситуациях ваш код, вероятно, не будет работать ни при каких обстоятельствах. Для таких ситуаций вы должны элегантно решить проблемы – есть, по крайней мере, одна статья об этом, а одну я напишу позднее (это, наверное, будет длинная серия, но не беспокойтесь – вы все освоите до окончания этой серии статей). Пока же вы пишете устойчивый, но не совершенный код, который отлично подходит для изучения Ajax. Вы вернетесь к более качественному коду позже.&lt;/p&gt;
						&lt;p&gt;Запрос/ответ в мире Ajax&lt;/p&gt;
						&lt;p&gt;Итак, вы уже знакомы с Ajax и имеете базовое представление об объекте XMLHttpRequest и о том, как создать его. Если вы читали внимательно, то вы даже понимаете, что это технология javascript общается с любым Web-приложением на сервере, а не ваша HTML-форма, которую вы подтвердили напрямую.&lt;/p&gt;
						&lt;p&gt;Что мы пропустили? Как на самом деле использовать XMLHttpRequest. Поскольку это критический код, который вы будете использовать в некоторых формах в каждом вашем Ajax-приложении, рассмотрим коротко, как выглядит базовая модель запрос/ответ в Ajax.&lt;/p&gt;
						&lt;p&gt;Выполнение запроса&lt;/p&gt;
						&lt;p&gt;У вас есть ваш превосходный новый объект XMLHttpRequest; приведем его в движение. Во-первых, нам понадобится javascript-метод, который ваша Web-страница может вызвать (например, когда пользователь вводит текст или выбирает вариант из меню). Затем, нужно следовать одной и той же основной схеме практически во всех ваших Ajax-приложениях:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160;1. Получить какие-либо данные из Web-формы.&lt;br /&gt;&amp;#160; &amp;#160;2. Создать URL для подключения.&lt;br /&gt;&amp;#160; &amp;#160;3. Открыть соединение с сервером.&lt;br /&gt;&amp;#160; &amp;#160;4. Установить функцию для сервера, которая выполнится после его ответа.&lt;br /&gt;&amp;#160; &amp;#160;5. Передать запрос.&lt;/p&gt;
						&lt;p&gt;В листинге 5 приведен пример Ajax-метода, который выполняет именно эти операции и именно в этом порядке:&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 5. Выполнить запрос с Ajax&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;function callServer() {&lt;br /&gt;&amp;#160; // Получить city и state из web-формы&lt;br /&gt;&amp;#160; var city = document.getElementById(&amp;quot;city&amp;quot;).value;&lt;br /&gt;&amp;#160; var state = document.getElementById(&amp;quot;state&amp;quot;).value;&lt;br /&gt;&amp;#160; // Продолжать только если есть значения обоих полей&lt;br /&gt;&amp;#160; if ((city == null) || (city == &amp;quot;&amp;quot;)) return;&lt;br /&gt;&amp;#160; if ((state == null) || (state == &amp;quot;&amp;quot;)) return;&lt;br /&gt;&amp;#160; // Создать URL для подключения&lt;br /&gt;&amp;#160; var url = &amp;quot;/scripts/getZipCode.php?city=&amp;quot; + escape(city) + &amp;quot;&amp;amp;state=&amp;quot; + escape(state);&lt;br /&gt;&amp;#160; // Открыть соединение с сервером&lt;br /&gt;&amp;#160; xmlHttp.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;&amp;#160; // Установить функцию для сервера, которая выполнится после его ответа&lt;br /&gt;&amp;#160; xmlHttp.onreadystatechange = updatePage;&lt;br /&gt;&amp;#160; // SПередать запрос&lt;br /&gt;&amp;#160; xmlHttp.send(null);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;Многое из этого не требует пояснений. Первая часть кода использует базовый javascript-код для сбора значений из нескольких полей формы. Затем код устанавливает PHP-сценарий в качестве URL для подключения. Обратите внимание, как указывать URL и как добавлять к нему city и state (из формы), используя простые GET-параметры.&lt;/p&gt;
						&lt;p&gt;Затем открывается соединение; это первое место, где вы опять увидели в действии XMLHttpRequest. Указывается метод соединения (GET) и URL. Последний параметр, когда установлен в true, запрашивает асинхронное соединение (то есть, делает это способом, сооветствующим названию Ajax). При использовании false код ждал бы выполнения запроса и не продолжал бы работу до получения ответа. При использовании true ваши пользователи могут работать с формой (и даже вызывать другие javascript-методы) пока сервер обрабатывает этот запрос в фоновом режиме.&lt;/p&gt;
						&lt;p&gt;Свойство onreadystatechange xmlHttp (вспоминайте, это ваш экземпляр объекта XMLHttpRequest) позволяет вам информировать сервер о том, что следует делать после завершения работы (что может быть через пять минут или через пять часов). Поскольку код не собирается ждать сервер, вы должны дать серверу знать, что делать, так чтобы вы смогли среагировать. В данном случае будет инициирован конкретный метод (называемый updatePage()) после завершения сервером обработки вашего запроса.&lt;/p&gt;
						&lt;p&gt;Наконец, вызывается send() со значением null. Поскольку вы добавили данные для передачи на сервер (city и state) в URL запроса, вам не надо передавать что-либо в запросе. Таким образом, передается ваш запрос, и сервер может делать то, что вы указали ему делать.&lt;/p&gt;
						&lt;p&gt;Если вы кроме этого ничего больше не делаете, обратите внимание на то, насколько все просто и понятно! В отличие от осознания вами асинхронной природы Ajax, все это действительно простые вещи. Вы оцените то, как это освобождает вас для концентрации внимания на крутых приложениях и интерфейсах, а не на сложном HTTP-коде запроса/ответа.&lt;/p&gt;
						&lt;p&gt;Код в листинге 5 очень прост. Данные являются простым текстом и могут быть включены как часть URL-запроса. GET посылает запрос вместо более сложного POST. Не добавляется XML, заголовки контента, не передаются данные в теле запроса – можно сказать, Ajax-утопия.&lt;/p&gt;
						&lt;p&gt;Не переживайте - ситуация станет более сложной по мере выпуска статей этой серии. Вы научитесь передавать POST-запросы, устанавливать заголовки запроса и типы содержимого, кодировать XML в вашем сообщении, добавлять защиту в ваш запрос – список довольно большой! Не беспокойтесь пока о сложных вещах; узнайте основы и вскоре вы освоите полный арсенал Ajax-средств.&lt;/p&gt;
						&lt;p&gt;Обработка ответа&lt;/p&gt;
						&lt;p&gt;Теперь вы должны разобраться с ответом сервера. Пока вы должны знать только два момента:&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; * Не делать ничего, пока свойство xmlHttp.readyState не будет равно 4.&lt;br /&gt;&amp;#160; &amp;#160; * Сервер будет записывать свой ответ в свойстве xmlHttp.responseText.&lt;/p&gt;
						&lt;p&gt;Первый момент (состояния готовности) готовится стать основным объемом следующей статьи; вы узнаете о стадиях HTTP-запроса столько, сколько никогда даже и не хотели знать. Пока вы просто проверяйте на равенство определенному значению (4), и все будет работать (и вы будете знать, что искать в следующей статье). Второй момент (использование свойства xmlHttp.responseText для получения ответа от сервера) является простым. В листинге 6 приведен пример метода (который сервер может вызвать), основанного на значениях, переданных в листинге 5.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 6. Обработка ответа от сервера&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;function updatePage() {&lt;br /&gt;&amp;#160; if (xmlHttp.readyState == 4) {&lt;br /&gt;&amp;#160; &amp;#160; var response = xmlHttp.responseText;&lt;br /&gt;&amp;#160; &amp;#160; document.getElementById(&amp;quot;zipCode&amp;quot;).value = response;&lt;br /&gt;&amp;#160; }&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;Опять же, код не является трудным или сложным. Он ожидает, пока сервер не вызовет его с нужным состоянием готовности, и затем использует значение, которое сервер возвращает (в данном случае ZIP-код для введенного пользователем города и штата), для установки другого поля формы. В результате поле zipCode неожиданно появляется с ZIP-кодом, но пользователь ни разу не щелкнул по кнопке! Это поведение настольного приложения, о чем я говорил ранее. Оперативность, ощущение динамичности и т.д., а все с маленьким Ajax-кодом.&lt;/p&gt;
						&lt;p&gt;Наблюдательные читатели, возможно, заметят, что поле zipCode является обычным текстовым полем. После возврата сервером ZIP-кода и установки этого поля методом updatePage() в значение ZIP-кода города/штата пользователи могут переопределить это значение. Так сделано умышленно по двум причинам: сохранить этот пример простым и показать вам, что иногда нужно, чтобы пользователи имели возможность переопределить значения, возвращенные сервером. Помните об обоих моментах; они важны при хорошем дизайне пользовательского интерфейса.&lt;/p&gt;
						&lt;p&gt;Перехват в Web-формах&lt;/p&gt;
						&lt;p&gt;Что нам осталось? В сущности, не много. Вы имеете javascript-метод, собирающий введенную пользователем в форму информацию, передаете ее серверу, предоставляете еще один javascript-метод для обработки ответа и даже устанавливаете значение поля, когда этот ответ приходит. Все что осталось на самом деле – вызвать этот первый метод и запустить полный процесс. Вы могли бы, очевидно, добавить кнопку в вашу HTML-форму, но это же старый, добрый 2001 год, не так ли? Воспользуемся возможностями технологии javascript, как показано в листинге 7.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Листинг 7. Запуск Ajax-процесса&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;lt;form&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;City: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;city&amp;quot; id=&amp;quot;city&amp;quot; size=&amp;quot;25&amp;quot; &lt;br /&gt;onchange=&amp;quot;callServer();&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;State: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;state&amp;quot; id=&amp;quot;state&amp;quot; size=&amp;quot;25&amp;quot; &lt;br /&gt;onchange=&amp;quot;callServer();&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Zip Code: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;zipCode&amp;quot; id=&amp;quot;zipCode&amp;quot; size=&amp;quot;5&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/p&gt;
						&lt;p&gt;Если это выглядит как еще один кусок в рутинном, в некоторой степени, коде – вы правы, так и есть! Когда пользователь вводит новое значение для любого из полей city или state, запускается метод callServer(), и Ajax-функция начинается. Вам кажется, что вы начинаете понимать суть вещей? Отлично!&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;В заключение&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;В настоящий момент вы, возможно, не готовы взять и написать ваше первое Ajax-приложение, по крайней мере, пока не исследовали раздел Ресурсы. Однако, вы уже можете начать понимать основную идею о том, как работают такие приложения и что такое объект XMLHttpRequest. В готовящихся статьях вы изучите этот объект, а также то, как контролировать взаимодействие javascript-to-server и работать с HTML-формами, и даже разберетесь с DOM.&lt;/p&gt;
						&lt;p&gt;Пока же потратьте некоторое время на размышления о том, насколько мощными могут быть Ajax-приложения.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (TaronTo)</author>
			<pubDate>Wed, 23 Dec 2009 08:15:05 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=31#p31</guid>
		</item>
		<item>
			<title>Введение в синтаксис</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=23#p23</link>
			<description>&lt;p&gt;как вставить скрипт в документ HTML (общие сведения); &lt;br /&gt;комментарии в javascript; &lt;br /&gt;как объявлять переменные и давать им правильные имена; &lt;br /&gt;разбор скрипта и синтаксис методов; &lt;br /&gt;метод alert(); &lt;br /&gt;полезная мелочь: «заглушка» на временно не работающую ссылку &lt;/p&gt;
						&lt;p&gt;В создании web-страниц есть много разных тонкостей. Но есть и три кита. Это HTML, CSS и javascript.&lt;/p&gt;
						&lt;p&gt;Рекомендую организовать самообразование следующим образом: как только освоите синтаксис HTML и научитесь делать примитивные странички с текстом, картинками и таблицами, сразу подключайтесь к изучению CSS. Как только поймёте, как работать с CSS, начинайте осваивать javascript, параллельно пополняя «словарный запас» во всех трёх языках. Думаю, что через полгода сможете построить весьма красивый и функциональный сайт.&lt;/p&gt;
						&lt;p&gt;Долго я не знал, как подступиться к javascript. Попадались учебники либо слишком абстрактные — теория, теория, и непонятно, как приложить её к практике, либо, наоборот, слишком конкретные: вот тебе набор готовых рецептов, бери и пользуйся, а как это всё крутится — не твоего умишки дело.&lt;/p&gt;
						&lt;p&gt;Попался мне как-то учебник Вадима Дунаева. Многие, я знаю, ругают этот учебник. Кроме того, я скачл мерзко отсканированный PDF, где вместо &amp;quot;()&amp;quot; могло оказаться, например, &amp;quot;Q&amp;quot;, а латинские буквы в кодах заменены (местами!) аналогичными русскими, из-за чего эти коды не работают. В общем, пришлось попыхтеть. И, честно скажу, если бы я до этого ничего не читал про javascript, то в этих ошибках бы не разобрался и присоединился бы к числу ругателей. Но я тогда сидел без работы, было время вникнуть, и учебник мне понравился. Но он очень подробный и рассчитан на людей, которые уже с программированием соприкасались.&lt;/p&gt;
						&lt;p&gt;Так вот, я хочу попробовать убить двух зайцев. Написать нечто понятное для любого чайника и в то же время конструктивно-познавательное. Чтобы этот чайник на основе моих советов мог написать пусть простой, но полностью оригинальный скрипт.&lt;/p&gt;
						&lt;p&gt;Итак:&lt;br /&gt;Вставка в документ HTML&lt;/p&gt;
						&lt;p&gt;Вы наверняка видели в HTML-кодах такие тэги:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 12em&quot;&gt;&lt;pre&gt;&amp;lt;!-- ТАБЛИЦЫ С КОДОМ--&amp;gt;

&amp;lt;script&amp;gt;
&amp;lt;!-- здесь какая-то непонятная абракадабра
--&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Вот эта абракадабра между тэгами и есть скрипт.&lt;br /&gt;Сам тэг относится к языку HTML, и у него могут быть следующие атрибуты:&lt;/p&gt;
						&lt;p&gt;language &lt;br /&gt;type &lt;br /&gt;src &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 7.5em&quot;&gt;&lt;pre&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt;
&amp;lt;!-- код скрипта --&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Этот атрибут необязателен. Его стоит использовать либо для уточнения версии языка (javascript1.1, javascript1.2 и т.п.), либо если используешь другой язык (например, ). То есть вреда этот атрибут в любом случае не принесёт, но в стандартной ситуации он вроде как лишний. &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 7.5em&quot;&gt;&lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
&amp;lt;!-- код скрипта --&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Атрибут type, который указывает на тип текста: text/javascript. Он появился в версии HTML 4.0. Его-то я и рекомендую использовать.&lt;/p&gt;
						&lt;p&gt;Прежде чем перейти к атрибуту src, выясним, в какие разделы кода HTML можно вставлять скрипты.&lt;/p&gt;
						&lt;p&gt;В любые. Но с умом.&lt;/p&gt;
						&lt;p&gt;Часто в скрипте указывается вывод конкретного текста, что называется, здесь и сейчас. Такой скрипт вставляется прямо в , «на место происшествия».&lt;/p&gt;
						&lt;p&gt;Бывают скрипты с объявлениями переменных, которые могут быть использованы в других скриптах на странице, с функциями, которые можно вызвать из любого места кода HTML. Такие скрипты разумнее всего помещать между тэгами.&lt;/p&gt;
						&lt;p&gt;Но можно сделать и так, чтобы использовать скрипт сразу на нескольких web-страницах. Для этого его код нужно записать в отдельный файл с расширением .js (например, myscript_1.js). Тэги и писать в нём уже не надо.&lt;/p&gt;
						&lt;p&gt;И вот тогда-то, для вызова скрипта с web-страницы, нам и понадобится атрибут src. Работает он так же, как и аналогичный атрибут тэга :&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 6em&quot;&gt;&lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;
src=&amp;quot;scripts/myscript_1.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Вот таким образом и помещается на разные страницы одна и та же шапка или меню, записанные в файле скрипта. Особенно это выручает на тех хостингах, где SSI не проходит.&lt;/p&gt;
						&lt;p&gt;Можно также вставлять маленькие скрипты в некоторые атрибуты тэгов HTML, но об этом — чуть позже.&lt;/p&gt;
						&lt;p&gt;Комментарии&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Говорят, остались ещё такие браузеры, которые не понимают скриптов. Встречаются и маньяки-пользователи, которые настолько задвинуты на безопасности, что отключают скрипты. В этой ситуации скрипт выполняться не будет, но код его, та самая «абракадабра», просто вывалится на экран.&lt;/p&gt;
						&lt;p&gt;Так вот, чтобы не вываливалась, мы заключаем её в HTML-комментарии.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
&amp;lt;!--
    Код скрипта
// --&amp;gt;
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Ммм... а что это за два слэша перед закрытием комментария?&lt;/p&gt;
						&lt;p&gt;Закрывающий комментарий находится уже в «теле» скрипта. А javascript не понимает этих корявых HTML&#039;ских скобок, для него это инородное тело, генерирующее ошибку. Значит, нужно скрыть этот закрывающий тэг от скрипта, поместив его как комментарий javascript. У javascript комментарии выглядят несколько изящнее: //. После этого знака скрипт не видит закрывающую скобку HTML, а HTML благополучно скрывает текст скрипта, и на экране не видно никаких «левых» записей.&lt;/p&gt;
						&lt;p&gt;Раз уж мы коснулись комментариев, то надо сказать, что в javascript они имеют две формы — такие же, как в C и C++ (а кстати и в CSS тоже).&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;// Эта форма комментария&lt;br /&gt;// действует только на одну строку,&lt;br /&gt;// то есть на каждой новой строке&lt;br /&gt;// нужно выставлять знак комментария.&lt;br /&gt;А это уже код скрипта...&lt;/p&gt;
						&lt;p&gt;/* А эта форма комментария&lt;br /&gt;действует на сколько угодно строк&lt;br /&gt;до тех пор, пока не натолкнётся&lt;br /&gt;на закрывающий значок,&lt;br /&gt;зеркально отражающий начальный. */&lt;br /&gt;А теперь опять код скрипта...&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Не путайте комментарии HTML и комментарии javascript! Это разные языки, хотя и сосуществуют «в одном флаконе». Или, точнее, в одной банке. Как пауки...&lt;/p&gt;
						&lt;p&gt;Вернёмся к проблеме ветхих браузеров. Допустим, с помощью javascript Вы сделали из двух картинок что-то вроде анимированного баннера. Тогда Вы можете порадовать пользователей «убогих» браузеров (а Вы, я надеюсь, не полностью лишены альтруизма) лицезрением хотя бы одной из этих картинок с помощью тэга &lt;br /&gt;&amp;lt;noscript /&amp;gt;&lt;br /&gt;: &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 15em&quot;&gt;&lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
&amp;lt;!--
    Код Вашего баннера
// --&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;noscript&amp;gt;
&amp;lt;img src=&amp;quot;одна_из_картинок.gif&amp;quot;&amp;gt;
&amp;lt;/noscript&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;В каких редакторах писать скрипты&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Возможно, существуют какие-то специальные редакторы для javascript. Я таких не встречал да и не слишком искал. Обычно скрипты пишут в тех же редакторах, какие используют для создания web-страниц. Я, например, люблю HomeSite. Написание скрипта в этих редакторах ничем не отличается от написания его в простом блокноте, кроме подсветки кода. А она иногда очень помогает. Скачал я однажды скрипт (у какого-то немца), а он не работает. Присмотрелся к коду и увидел, что ключевое слово switch почему-то не выделено. Гляжу — а там не switch, а switsch, Donner, Wetter! Убрал буковку — и поехало.&lt;/p&gt;
						&lt;p&gt;Кстати, во всех наших примерах код выглядит именно так, как в окне HomeSite.&lt;/p&gt;
						&lt;p&gt;С места в карьер&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Следующий пример — плагиат у Дунаева. Но он настолько прост и глубок, что не могу удержаться. Я добавил сюда только некоторые детали оформления записи, чтобы объяснить заодно и их.&lt;/p&gt;
						&lt;p&gt;Сразу предупреждаю: практически этот пример абсолютно бесполезный. Но в нём сконцентрированы многие ключевые понятия языка javascript и его синтаксиса.&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 24em&quot;&gt;&lt;pre&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Пример 1&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
&amp;lt;!--
    var х = 5;
    var y = х + 3;
    alert(y);

&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Собственно скрипт&lt;/p&gt;
						&lt;p&gt;Если Вы скопируете этот код в чистую страницу Блокнота и сохраните её как файл.html, то при открытии файла увидите следующее:&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pics.kz/s4/79/79/ea/a9/7979eaa95072d76cf516b4252ed2ea78.gif&quot; alt=&quot;http://pics.kz/s4/79/79/ea/a9/7979eaa95072d76cf516b4252ed2ea78.gif&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Разберём, как это выходит.&lt;/p&gt;
						&lt;p&gt;var х = 5;&lt;/p&gt;
						&lt;p&gt;Здесь мы объявляем переменную x, которая равна 5.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FeDeRaL)</author>
			<pubDate>Mon, 21 Dec 2009 19:50:17 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=23#p23</guid>
		</item>
		<item>
			<title>Урок №1. Первая программа</title>
			<link>https://speak.forumkz.ru/viewtopic.php?pid=22#p22</link>
			<description>&lt;p&gt;Все вы использовали компьютерные программы, такие как текстовый процессор, электронные таблицы и даже Microsoft Windows 95. Компьютерные программы, или программное обеспечение, представляют собой файлы, содержащие инструкции, которые указывают компьютеру, что следует делать. Если вы работаете в среде MS-DOS или Windows, то, например, файлы с расширениями ЕХЕ и СОМ содержат команды, которые компьютер может выполнять. Другими словами, файлы содержат специальные инструкции, выполняемые компьютером, обычно одну за другой, для решения определенной задачи. При создании программы вы указываете инструкции, которые компьютер должен выполнить. Из этого урока вы узнаете, как указать такие инструкции с помощью операторов C++. К концу данного урока вы освоите следующие основные концепции: &lt;/p&gt;
						&lt;p&gt;• При создании программы используйте текстовый редактор, чтобы ввести операторы C++ в исходный файл программы. &lt;/p&gt;
						&lt;p&gt;• Для преобразования операторов программы C++ в выполнимую программу, в единицы и нули, которые понимает компьютер, используйте специальную программу — компилятор C++. &lt;/p&gt;
						&lt;p&gt;• Для изменения или исправления программы используйте текстовый редактор. &lt;/p&gt;
						&lt;p&gt;• При нарушении одного (или более) правил программирования на C++ компилятор выдаст на экран сообщения о синтаксических ошибках. Вам следует отредактировать программу, чтобы исправить ошибки, а затем запустить компилятор снова. &lt;/p&gt;
						&lt;p&gt;Программирование представляет собой процесс определения последовательности инструкций, которые должен выполнить компьютер для решения определенной задачи. Для указания этих инструкций вы используете язык программирования, например C++. С помощью текстового редактора вы вносите программные операторы в исходный файл. Далее вы используете специальную программу — компилятор — для преобразования операторов из формата, который вы можете читать и понимать, в единицы и нули, которые понимает компьютер. &lt;/p&gt;
						&lt;p&gt;Лучший способ понять процесс создания и компиляции программы — построить простую программу на C++. Давайте этим займемся! &lt;/p&gt;
						&lt;p&gt;СОЗДАНИЕ ПРОСТОЙ ПРОГРАММЫ &lt;/p&gt;
						&lt;p&gt;Как и следовало ожидать, ваша первая программа на C++ называется FIRST.СРР. При создании программ на C++ используйте расширение СРР, чтобы другие могли понять, что этот файл содержит программу на C++. Когда вы позже запустите эту программу, она выведет на экран дисплея сообщение Учимся программировать на языке C++/Следующий пример вывода показывает подсказку командной строки (в данном примере С:\&amp;gt;), вводимую вами командную строку (имя программы FIRST, за которым следует ENTER) и вывод программы на экран: &lt;/p&gt;
						&lt;p&gt;С:\&amp;gt; FIRST &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Учимся программировать на языке C++! &lt;/p&gt;
						&lt;p&gt;Как известно, при программировании вы можете работать в среде, основанной на командной строке, например MS-DOS или UNIX, или в среде типа Windows. Для упрощения вывода в данной книге подразумевается, что вы работаете из командной строки. В этом случае для выполнения программы FIRST.EXE вы должны ввести имя программы FIRST в ответ на системную подсказку и затем нажать ENTER. &lt;/p&gt;
						&lt;p&gt;Для начала вам следует использовать текстовый редактор, например EDIT (поставляется с MS-DOS), для создания файла, который содержит операторы программы и называется исходным файлом. Не используйте текстовый процессор, такой как Word или WordPerfect, для создания исходного файла программы. Как известно, текстовые процессоры позволяют вам создавать форматированные документы, которые могут содержать полужирный текст, выровненные поля, а также другие особенности. Чтобы отформатировать документы таким образом, текстовый процессор вставляет специальные (скрытые) символы внутрь документа. Такие символы могут включать или выключать курсив или выбирать определенную ширину полей. Несмотря на то что такие специальные символы имеют смысл для текстового процессора, C++ их не поймет и эти символы приведут к ошибкам. &lt;/p&gt;
						&lt;p&gt;С помощью текстового редактора введите следующие операторы программы C++ (точно так, как они изображены, используя верхний и нижний регистры), как показано ниже: &lt;/p&gt;
						&lt;p&gt;#include &amp;lt;iostream.h&amp;gt; &lt;/p&gt;
						&lt;p&gt;void main(void) &lt;/p&gt;
						&lt;p&gt;{ &lt;br /&gt;&amp;#160; &amp;#160;cout &amp;lt;&amp;lt; &amp;quot;Учимся программировать на языке C++!&amp;quot;; &lt;br /&gt;} &lt;/p&gt;
						&lt;p&gt;Не беспокойтесь, если операторы C++ не имеют для вас смысла. Вы узнаете назначение каждого из них из урока 2. А пока обратите особое внимание на ваш ввод. Удостоверьтесь, например, что вы ввели верное количество кавычек, точек с запятой и скобок. Еще раз более внимательно проверьте операторы своей программы. Если они верны, сохраните операторы в файле FIRST. СРР &lt;/p&gt;
						&lt;p&gt;Что означает имя? &lt;/p&gt;
						&lt;p&gt;При создании программы на C++ вы вносите операторы программы в исходный файл. Применяйте расширение СРР, чтобы другие программисты могли понять, что данный файл содержит программу на C++. Далее используйте имя файла, которое указывает назначение программы. Например, если вы создаете финансовую программу, можно использовать имя BUDGET.CPP. Аналогичным образом программу, которая вычисляет оклады в фирме, вы можете назвать SALARY. СРР. Чтобы избежать путаницы, никогда не используйте для названия программы имя существующей команды MS-DOS, например COPY или DEL. &lt;br /&gt;КОМПИЛЯЦИЯ ВАШЕЙ ПРОГРАММЫ &lt;/p&gt;
						&lt;p&gt;Компьютер работает с комбинациями единиц и нулей (называемых машинным языком), которые представляют наличие или отсутствие электрических сигналов. Если сигнал равен единице (наличие), компьютер может выполнить одну операцию, а если сигнал равен нулю (отсутствие), компьютер может выполнить другую операцию. Однако к счастью, нет необходимости писать программы в нулях и единицах (как это делали программисты в 1940 и 50 гг.). Вместо этого специальная программа — компилятор C++ — преобразует операторы программы (ваш исходный код) в машинный язык. &lt;/p&gt;
						&lt;p&gt;Другими словами, компилятор просматривает исходный файл, содержащий операторы программы на C++. Если ваши операторы не нарушают ни одно правило языка C++, компилятор преобразует их в машинный язык (единицы и нули), который компьютер может выполнить. Компилятор хранит машинный язык в выполняемом файле, имеющем, как правило, расширение ЕХЕ. Если файл ЕХЕ существует, вы можете запустить программу, вводя ее имя в ответ на командную подсказку. &lt;/p&gt;
						&lt;p&gt;В зависимости от используемого вами компилятора, команды, которые вы применяете для его вызова, будут различны. Например, при использовании Borland C++ вам следует компилировать программу FIRST.CPP с помощью команды ВСС: &lt;/p&gt;
						&lt;p&gt;C:\&amp;gt; BCC FIRST.CPP &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Если вы применяете не Borland C++, обратитесь к документации, поставляемой с вашим компилятором, чтобы определить правильную команду для его запуска. По окончании работы компилятор создаст выполнимую программу и сохранит ее в файле на диске. В среде MS-DOS файл выполни- &lt;/p&gt;
						&lt;p&gt;мой программы будет иметь расширение ЕХЕ, например FIRST.EXE. Если при компиляции программы компилятор выдает сообщения об ошибках, отредактируйте свой исходный файл и сравните каждый символ исходного файла с символами, которые приведены в этой книге. Исправьте все ошибки, сохраните сделанные изменения, а затем откомпилируйте про грамму второй раз. После того как вы успешно откомпилировали свою программу, запустите ее, вводя имя программы в ответ на командную подсказку как это было показано выше. &lt;/p&gt;
						&lt;p&gt;Представление о компиляторе &lt;/p&gt;
						&lt;p&gt;При создании программы вы используете язык программирования (такой как C++), чтобы указать инструкции, выполняемые компьютером. Применяя текстовый редактор, вы вносите операторы программы в исходный файл. Далее используется специальная программа — компилятор, которая преобразует ваш исходный файл в машинный язык (единицы и нули, понимаемые компьютером). Если компиляция прошла успешно, результатом будет файл выполнимой программы. Однако если вы допустили одну или несколько ошибок или нарушили какое-либо правило C++, компилятор выдаст на экран сообщения об ошибках, и для их исправления вам следует заново отредактировать исходный файл. &lt;/p&gt;
						&lt;p&gt;Если вы работаете на большой машине или мини-ЭВМ, у вас должен быть компилятор, доступный для вас и других пользователей вашей системы. Если же вы используете ПК, вам следует приобрести и установить компилятор, такой как Borland C++ или Microsoft Visual C++. &lt;br /&gt;СОЗДАНИЕ ВТОРОЙ ПРОГРАММЫ &lt;/p&gt;
						&lt;p&gt;Хочется надеяться, что вы смогли успешно откомпилировать и выполнить программу FIRST. CPP. Если это так, используйте ваш текстовый редактор, чтобы создать второй программный файл с именем EASY. CPP, который содержит следующие операторы программы: &lt;/p&gt;
						&lt;p&gt;#include &amp;lt;iostream.h&amp;gt; &lt;/p&gt;
						&lt;p&gt;void main(void) &lt;/p&gt;
						&lt;p&gt;{ &lt;br /&gt;&amp;#160; &amp;#160;cout &amp;lt;&amp;lt; &amp;quot;Программировать на C++ просто!&amp;quot;; &lt;br /&gt;} &lt;/p&gt;
						&lt;p&gt;Как и ранее, сохраните свои операторы программы на C++ в исходном файле и вызовите компилятор, указав имя файла программы в командной строке компилятора. В случае Borland C++ используйте следующую команду для компиляции программы: &lt;/p&gt;
						&lt;p&gt;С:\&amp;gt; ВСС EASY.CPP &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Если компиляция программы прошла успешно, компилятор создаст выполнимую программу с именем EASY.EXE. Когда вы запустите эту программу, на вашем экране появится следующее сообщение: &lt;/p&gt;
						&lt;p&gt;С.\&amp;gt; EASY &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Программировать на C++ просто! &lt;/p&gt;
						&lt;p&gt;Далее используя редактор, отредактируйте исходный файл EASY. CPP и измените выводимое на экран сообщение таким образом, чтобы включить слово очень, как показано ниже: &lt;/p&gt;
						&lt;p&gt;cout &amp;lt;&amp;lt; &amp;quot;Программировать на C++ очень просто!&amp;quot;; &lt;/p&gt;
						&lt;p&gt;Сохраните ваше изменение в исходном файле и откомпилируйте программу. После успешной компиляции запустите программу, как показано ниже: &lt;/p&gt;
						&lt;p&gt;С:\&amp;gt; EASY &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Программировать на C++ очень просто! &lt;/p&gt;
						&lt;p&gt;Каждый раз, когда вы изменяете исходный файл, вам следует откомпилировать программу заново, чтобы изменения вступили в силу. Например, используйте текстовый редактор, чтобы снова изменить исходный файл. В этот раз добавьте новую строку в свою программу: &lt;/p&gt;
						&lt;p&gt;#include &amp;lt;iostream.h&amp;gt; &lt;/p&gt;
						&lt;p&gt;void main(void) &lt;/p&gt;
						&lt;p&gt;{ &lt;br /&gt;&amp;#160; &amp;#160;cout &amp;lt;&amp;lt; &amp;quot;Программировать на C++ очень просто!&amp;quot;; &lt;br /&gt;&amp;#160; &amp;#160;cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; &amp;quot;Можно расслабиться!&amp;quot;; &lt;br /&gt;} &lt;/p&gt;
						&lt;p&gt;Сохраните ваши изменения в исходном файле. Затем запустите программу, как показано ниже: &lt;/p&gt;
						&lt;p&gt;С:\&amp;gt; EASY &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Программировать на C++ очень просто! &lt;/p&gt;
						&lt;p&gt;Как видите, программа не выводит новую строку на экран. Чтобы изменения в исходном файле вступили в силу, вы должны откомпилировать программу. В данном случае необходимо откомпилировать программу так, как было описано выше, а затем запустить ее. Так как компилятор использовал изменения вашего исходного кода, то, как показано ниже, на экран будет выведена новая строка: &lt;/p&gt;
						&lt;p&gt;C:\&amp;gt; EASY &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Программировать на C++ очень просто! &lt;/p&gt;
						&lt;p&gt;Можно расслабиться! &lt;br /&gt;ИЗУЧЕНИЕ СИНТАКСИЧЕСКИХ ОШИБОК &lt;/p&gt;
						&lt;p&gt;Каждый язык — английский, французский, немецкий и даже C++ — имеет набор правил, называемых синтаксисом, которым вы должны следовать, когда используете данный язык. В английском языке, например, предложения обычно заканчиваются точкой, восклицательным или вопросительным знаком. Вы также используете заглавные буквы в начале предложения. В синтаксисе C++ используется точка с запятой, круглые скобки, фигурные скобки и многие другие символы. Когда вы забываете или неправильно употребляете эти символы, компилятор C++ выводит на экран сообщение об ошибке, которое описывает ошибку и соответствующий ей номер строки в исходном файле. &lt;/p&gt;
						&lt;p&gt;Компилятор C++ не может создать выполнимую программу, пока не будут исправлены все синтаксические ошибки. Чтобы понять процесс обнаружения и исправления синтаксических ошибок, создайте следующую программу с именем SYNTAX. CPP: &lt;/p&gt;
						&lt;p&gt;#include &amp;lt;iostream.h&amp;gt; &lt;/p&gt;
						&lt;p&gt;void main(void) &lt;/p&gt;
						&lt;p&gt;{ &lt;br /&gt;&amp;#160; &amp;#160;cout &amp;lt;&amp;lt; Заключайте сообщение в кавычки; &lt;br /&gt;} &lt;/p&gt;
						&lt;p&gt;Если посмотреть внимательно, можно заметить, что сообщения, выведенные двумя предыдущими программами, в вашем исходном файле взяты в кавычки. Синтаксис (правила) C++ требует кавычек. При компиляции программы компилятор выведет сообщения о синтаксических ошибках. В случае Borland C++ компилятор выведет следующие сообщения: &lt;/p&gt;
						&lt;p&gt;С:\&amp;gt; ВСС SYNTAX.CPP &amp;lt;ENTER&amp;gt; &lt;/p&gt;
						&lt;p&gt;Borland C++ Version 4.00 Copyright (с) 1993 Borland &lt;/p&gt;
						&lt;p&gt;International syntax.cpp: &lt;/p&gt;
						&lt;p&gt;Error syntax.cpp 5: Undefined symbol &#039;Заключайте&#039; in function main() &lt;/p&gt;
						&lt;p&gt;Error syntax.cpp 5: Statement missing; in function main() *** 2 errors in Compile *** &lt;/p&gt;
						&lt;p&gt;В этом случае компилятор вывел две синтаксические ошибки. Обе ошибки относятся к 5 строке исходного файла. Отредактируйте файл и возьмите сообщение в кавычки, как показано ниже: &lt;/p&gt;
						&lt;p&gt;cout &amp;lt;&amp;lt; &amp;quot;Заключайте сообщение в кавычки&amp;quot;; &lt;/p&gt;
						&lt;p&gt;Теперь можете успешно откомпилировать программу и получить выполнимый файл. Когда вы впервые начинаете использовать какой-либо язык программирования, можете рассчитывать на несколько синтаксических ошибок каждый раз при компиляции программы. После того как вы самостоятельно создадите несколько программ, вы будете быстро определять и исправлять подобные ошибки. &lt;/p&gt;
						&lt;p&gt;Изучение синтаксических ошибок &lt;/p&gt;
						&lt;p&gt;При создании программы на C++ вам следует придерживаться определенных правил, называемых правилами синтаксиса. Например, надо брать текстовые сообщения в кавычки и ставить точку с запятой после большинства операторов вашей программы (позже вы узнаете, для каких операторов требуется точка с запятой, а для каких нет). Если в программе нарушаются правила синтаксиса, компилятор C++ выводит сообщение об ошибке на экран. Вам следует исправить все синтаксические ошибки до того, как компилятор сможет создать выполнимую программу. &lt;br /&gt;РАБОТА В СРЕДЕ ТИПА WINDOWS &lt;/p&gt;
						&lt;p&gt;Для упрощения в каждом из предыдущих примеров предполагается, что вы работаете в среде, основанной на командной строке, например MS-DOS или UNIX. Однако сегодня большинство программистов на C++ программируют в среде типа Windows, такой как Visual C++, или интегрированной среде разработки фирмы Borland. При программировании в среде типа Windows операторы программы не отличаются от тех, которые показаны здесь. Другими словами, операторы C++ в программе FIRST.CPP, написанной в Windows, идентичны тем, которые вы будете использовать в среде, основанной на командной строке. Что изменяется в Windows, так это процесс компиляции и запуска программы. &lt;/p&gt;
						&lt;p&gt;Внутри такой среды программирования вы можете создавать исходные файлы, используя встроенный редактор, и затем компилировать программу с помощью выбора пункта меню или щелчка мыши по кнопке инструментальной линейки. Если программа содержит синтаксические ошибки, среда программирования сводит сообщения об ошибках в специальное окно. После того как вы успешно откомпилируете вашу программу, можно использовать пункт меню (или кнопку инструментальной линейки) для запуска программы. Программная среда может открыть отдельное окно, в котором будет отображаться вывод программы. &lt;/p&gt;
						&lt;p&gt;Среда программирования называется так, потому что обеспечивает все инструментальные средства, необходимые для создания, компиляции и запуска программ. &lt;br /&gt;ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ &lt;/p&gt;
						&lt;p&gt;Из этого урока вы узнали, как создавать и компилировать программы на C++! В уроке 2 вы получите более подробный обзор операторов, которые использовались в программах, созданных в данном уроке. Вы изучите использование фигурных скобок {}, ключевых слов, таких как void, а также как научить программы направлять вывод на экран. &lt;/p&gt;
						&lt;p&gt;&amp;#160; До изучения урока 2 убедитесь, что вы освоили следующие основные концепции: &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;1)Программы представляют собой файлы, содержащие последовательность инструкций, которые компьютер будет &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; выполнять. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;2)Вы создаете программы на C++, используя текстовый редактор. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;3)Вы сохраняете свои программы на C++ в исходных файлах, для которых используется расширение СРР. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;4)Компилятор преобразует операторы программы на C++ в единицы и нули — машинный язык, который понимает&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; компьютер. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;5)Подобно всем языкам, в C++ существует набор правил, называемых синтаксисом. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;6)Если вы нарушаете правила синтаксиса, компилятор выводит сообщение, описывающее ошибку. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;7)Вы должны исправить все синтаксические ошибки, прежде чем компилятор создаст выполняемую программу. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;8)После внесения изменений в исходный файл следует заново откомпилировать программу, чтобы изменения &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; вступили в силу. &lt;/p&gt;
						&lt;p&gt;Источник: programmersclub.ru&lt;/p&gt;</description>
			<author>mybb@mybb.ru (FeDeRaL)</author>
			<pubDate>Mon, 21 Dec 2009 19:30:16 +0300</pubDate>
			<guid>https://speak.forumkz.ru/viewtopic.php?pid=22#p22</guid>
		</item>
	</channel>
</rss>
