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

<channel>
	<title>Fix Blog</title>
	<atom:link href="http://fixblog.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://fixblog.ru</link>
	<description>в помощь веб-мастерам</description>
	<lastBuildDate>Fri, 03 Jun 2011 05:32:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>jquery ajax</title>
		<link>http://fixblog.ru/2010/04/14/jquery-ajax/</link>
		<comments>http://fixblog.ru/2010/04/14/jquery-ajax/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 16:07:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=348</guid>
		<description><![CDATA[Web 2.0 неожиданно возродил технологию под названием XMLHttpRequest, появившуюся еще в 2000 году. Эта технология позволяет обращаться к серверу без перезагрузки текущей страницы. На данный момент можно считать, что все современные браузеры реализуют эту технологию в объеме, достаточном для безболезненного ее использования. В новой реинкарнации триумвират XMLHttpRequest, JavaScript и DOM называется AJAX.
Пуристы Web-технологий различают следующие [...]]]></description>
			<content:encoded><![CDATA[<p>Web 2.0 неожиданно возродил технологию под названием XMLHttpRequest, появившуюся еще в 2000 году. Эта технология позволяет обращаться к серверу без перезагрузки текущей страницы. На данный момент можно считать, что все современные браузеры реализуют эту технологию в объеме, достаточном для безболезненного ее использования. В новой реинкарнации триумвират XMLHttpRequest, JavaScript и DOM называется AJAX.</p>
<p><span id="more-348"></span>Пуристы Web-технологий различают следующие подвиды этой технологии:</p>
<p>* AJAX – Asynchronous JavaScript and XML, асинхронный Javascript и XML. В ответ на запрос с клиента сервер отвечает правильно сфоримированным XML-документом.<br />
* AJAH – Asynchronous JavaScript and HTML, асинхронный Javascript и HTML. В ответ на запрос с клиента сервер отвечает уже сгенерированным HTML-документом или его частью.<br />
* AHAH – Asynchronous HTML and HTTP, асинхронный HTML и HTTP. То же самое, что и AJAH.<br />
* AJAJ – JavaScript and JSON, асинхронный Javascript и JSON. В ответ на запрос с клиента сервер отвечает правильной записью объекта Javascript в формате JSON (http://json.org).</p>
<p>jQuery предлагает реализацию всех трех подвидов технологии AJAX и еще один, AJAJs – все те же и Javascript. Теперь обо всем этом подробнее.</p>
<p>Базовыми функциями для работы с AJAX являются post() и get() (есть еще более низкоуровневая, ajax(), но мы ее не будем рассматривать):</p>
<p><em>$.post(url[, params[, callback]])<br />
$.get(url[, params[, callback]])</em></p>
<p>Здесь:</p>
<p>* url – адрес страницы, на которую будет отправлен запрос;<br />
* params – параметры, передаваемые в запросе в виде пар «ключ : значение»;<br />
* callback – функция, которая будет вызвана в случае успешного завершения вызова.</p>
<p>Пример:</p>
<p><em>$.post(<br />
&#8216;/ajaxtest.php&#8217;,<br />
{<br />
type: "test-request",<br />
param1: "param1&#8243;,<br />
param2: 2<br />
},<br />
onAjaxSuccess<br />
);<br />
function onAjaxSuccess(data)<br />
{<br />
// Здесь мы получаем данные, отправленные сервером<br />
alert(data);<br />
}</em></p>
<p>А что же на сервере? Вызов страницы при помощи технологии AJAX ничем не отличается от простого вызова страницы, например, путем открытия ее в браузере. То есть передаваемые параметры будут доступны на этой странице так же, как если бы они были переданы стандартными методами get или post. На сервере у нас может существовать, например, вот такой ajaxtest.php:</p>
<p><em>&lt;?php<br />
// Если страница вызвана с помощью .post(), переданные значения будут,<br />
// как всегда, доступны в глобальной переменной $_POST<br />
// Если страница вызвана с помощью .get, переданные значения будут,<br />
// как всегда, доступны в глобальной переменной $_GET</p>
<p>echo &#8216;text&#8217;;<br />
?&gt;</em></p>
<p>После того как ajaxtest.php отработает, в функцию onAjaxSuccess на клиенте будет передан текст «text». Обратите внимание на HTTP_X_REQUESTED_WITH. Этот HTTP-заголовок устанавливается jQuery во время запросов с помощью AJAX. Это помогает узнать, тип поступившего запроса и соответственно обрабатывать данные. Во всем остальном запрос через Аякс ничем не отличается от обычного запроса страницы у сервера.<br />
ПРИМЕЧАНИЕ</p>
<p>В различных библиотеках, особенно использующих шаблон MVC, часто необходимо знать, как была вызвана страница – открыли ее в браузере или запросили через AJAX? При запросе с помощью технологии AJAX устанавливается HTTP-заголовок HTTP_X_REQUESTED_WITH со значением “XmlHTTPRequest”. Таким образом, в РНР, например, можно узнать, вызвана ли страница с помощью AJAX так:</p>
<p><em>if($_SERVER['HTTP_X_REQUESTED_WITH'] == &#8216;XMLHttpRequest&#8217;)<br />
{<br />
// выполняем соответствующий код<br />
}</em></p>
<p>Теперь рассмотрим, как работать с четырьмя подвидами AJAX.<br />
AJAX</p>
<p>Если сервер на запрос возвращает заголовок Content-Type: text/xml и правильно сформированный XML-документ, то в функцию onAjaxSuccess будет передан уже готовый к употреблению DOM этого документа, с которым можно будет работать, используя методы jQuery. Пример:<br />
ajaxtest2.php:</p>
<p><em>&lt;?php<br />
header("Content-Type: text/xml; charset=utf-8&#8243;);<br />
?&gt;<br />
&lt;list&gt;<br />
&lt;item id="1&#8243;&gt;<br />
Item 1<br />
&lt;/item&gt;<br />
&lt;item id="2&#8243;&gt;<br />
Item 2<br />
&lt;/item&gt;<br />
&lt;/list&gt;</em></p>
<p>Наш JavaScript:</p>
<p><em>// Функцию post опускаем, написать ее не составляет труда<br />
function onAjaxSuccess(xml)<br />
{<br />
// Получаем коллекцию всех элементов item из пришедшего xml<br />
items = $("item", xml);</p>
<p>// Находим item с id="1&#8243;<br />
item = $("#1&#8243;, xml);</p>
<p>// или при помощи XPath<br />
item2 = $("item[@id='2']", xml);</p>
<p>// Извлекаем текст из элемента<br />
alert(item2.html());<br />
}</em></p>
<p>Как видите, работа с полученным с сервера ответов в виде XML ничем не отличается от работы с уже загруженным в браузер документом.<br />
<strong>AHAH</strong></p>
<p>Как уже было видно в первом примере с методом post(), если значение заголовка Content-Type – не «text/xml», ответ с сервера передается как есть, в текстовом виде. Поскольку обычно такой ответ сразу показывается на странице без дополнительной обработки, то нет смысла заводить отдельные функции вроде onAjaxSuccess. Для получения и отображения полученного с сервера HTML jQuery предоставляет метод load:</p>
<p><em>load(url[, params[, callback]]);</em></p>
<p>Этот метод прикрепляется к любому элементу на странице, в котором планируется показать ответ с сервера. После выполнения запроса ответ с сервера автоматически запишется в соответствующий элемент:</p>
<p><em>$("#mydiv").load("/ajaxtest.php");</em></p>
<p>Мы выполняем запрос к файлу из первого примера про AJAX. После выполнения запроса в элемент с id="mydiv" будет записано слово «text».<br />
AJAJ</p>
<p>Многие разработчики, столкнувшиеся с технологией AJAX, не любят передавать на клиент XML. Объясняется это тем, что XML может быть довольно большим по размеру, и существуют дополнительные трудности при разборе его структуры на клиенте. Благодаря jQuery, разбор XML на клиенте не представляет никакой сложности. А если разработчики активно используют AHAH, то и размеры передаваемого документа перестают быть решающим аргументом.</p>
<p>И все же многие предпочтут использовать JSON. JSON – это способ записи данных, который позволяет прогнать эту запись через функцию eval() и получить полноценный Javascript-объект. Для работы с данными в таком формате jQuery предлагает метод $.getJSON:</p>
<p><em>getJSON(url, params, callback)</em></p>
<p>После выполнения запроса ответ с сервера прогоняется через функцию eval(), а полученный объект передается в функцию callback:<br />
ajaxtest3.php</p>
<p><em>&lt;?php<br />
header(&#8216;Content-Type: text/javascript; charset=utf-8&#8242;);<br />
?&gt;<br />
{<br />
params: &lt;?php echo $_REQUEST['params']; ?&gt;,<br />
response: &#8216;Наш ответ Чемберлену&#8217;<br />
}</p>
<p>Javascript:</p>
<p>$.getJSON(<br />
&#8216;/ajaxtest3.php&#8217;,<br />
{params: "text"},<br />
onAjaxSuccess<br />
);<br />
function onAjaxSuccess(obj)<br />
{<br />
alert(obj.params);<br />
alert(obj.response);<br />
}</em></p>
<p><strong>AJAJs</strong></p>
<p>Помимо трех вышеперечисленных способов получения данных с сервера jQuery предлагает еще один. С его помощью можно загрузить и выполнить любой сценарий Javascript с сервера. Для этого используется метод getScript:</p>
<p><em>getScript(url[, callback])</em></p>
<p>Пример:<br />
script.js</p>
<p><em>$("a").css("color", "#0F0&#8243;);</em></p>
<p>Наш Javascript:<br />
<em><br />
$.getScript(&#8216;/script.js&#8217;);</em></p>
<p>После выполнения этого метода будет загружен и выполнен сценарий script.js, который окрасит все ссылки на странице в зеленый цвет.</p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/jquery-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>эффекты jquery</title>
		<link>http://fixblog.ru/2010/04/14/%d1%8d%d1%84%d1%84%d0%b5%d0%ba%d1%82%d1%8b-jquery/</link>
		<comments>http://fixblog.ru/2010/04/14/%d1%8d%d1%84%d1%84%d0%b5%d0%ba%d1%82%d1%8b-jquery/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 16:04:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=346</guid>
		<description><![CDATA[Метод animate является основой большинства, если не всех, эффектов jQuery и плагинов. Например, jQuery предлагает следующие методы для показа и скрытия элементов:
 * show([speed[, callback]]) – показать элемент;
* hide([speed[, callback]]) – скрыть элемент;
* fadeIn(speed[, callback]) – показать элемент путем изменения его прозрачности;
* fadeOut(speed[, callback]) – скрыть элемент путем изменения его прозрачности;
* slideDown(speed, callback) – показать [...]]]></description>
			<content:encoded><![CDATA[<p>Метод animate является основой большинства, если не всех, эффектов jQuery и плагинов. Например, jQuery предлагает следующие методы для показа и скрытия элементов:</p>
<p><span id="more-346"></span> <em>* show([speed[, callback]]) – показать элемент;<br />
* hide([speed[, callback]]) – скрыть элемент;<br />
* fadeIn(speed[, callback]) – показать элемент путем изменения его прозрачности;<br />
* fadeOut(speed[, callback]) – скрыть элемент путем изменения его прозрачности;<br />
* slideDown(speed, callback) – показать элемент, спустив его сверху;<br />
* slideUp(speed, callback) – показать элемент, подняв его снизу;</em></p>
<p>где</p>
<p>speed – скорость в миллисекундах или одно из "slow" (600 миллисекунд) или "fast" (200 миллисекунд);</p>
<p>callback – функция, которая будет вызвана после выполнения анимации.</p>
<p>Рассмотрим, например, реализацию функции show:</p>
<p><em>show: function(speed,callback){<br />
// находим в переданной нам коллекции скрытые элементы (см. врезку)<br />
var hidden = this.filter(":hidden");<br />
// если нам передана скорость, то вызываем метод animate<br />
if(speed)<br />
{<br />
hidden.animate(<br />
{<br />
height: "show",<br />
width: "show",<br />
opacity: "show"<br />
},<br />
speed,<br />
callback<br />
)<br />
}<br />
else<br />
{<br />
// иначе просто проходим по коллекции элементов и показываем их,<br />
// меняя стиль display с none на block<br />
hidden.each(<br />
function()<br />
{<br />
this.style.display = this.oldblock ? this.oldblock : "";<br />
if ( jQuery.css(this,"display") == "none" )<br />
this.style.display = "block";<br />
}<br />
);<br />
}<br />
return this;<br />
}</em></p>
<p>Скрытая мощь функции animate позволяет создавать поистине удивительные эффекты.</p>
<p>Необходимо также заметить, что все эффекты библиотеки jQuery применяются к элементам не сразу, а по очереди. То есть, предположим, что мы написали такой код:</p>
<p><em>for(i = 0; i &lt; 10; i++)<br />
{<br />
$("#my-div").animate({height: "show"}, 300);<br />
$("#my-div").animate({height: "hide"}, 300);<br />
}</em></p>
<p>В результате мы получим не беспорядочное моргание, пока двадцать эффектов борются за право показать/скрыть элемент «my-div», а плавный показ, потом сокрытие, потом снова показ – и так 20 раз. Обратите внимание, что очередь эффектов составляется поэлементно. То есть эффекты, примененные к разным элементам одновременно, будут выполняться одновременно.</p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/%d1%8d%d1%84%d1%84%d0%b5%d0%ba%d1%82%d1%8b-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>animate jquery</title>
		<link>http://fixblog.ru/2010/04/14/animate-jquery/</link>
		<comments>http://fixblog.ru/2010/04/14/animate-jquery/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 16:00:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=342</guid>
		<description><![CDATA[Ключевой функцией, на которой базируются все остальные, является функция animate:
 
animate(params, speed, easing, callback);

Здесь:
* params – свойства, которые участвуют в анимации в виде пар {ключ: значение}. Например: {height: "show"} или {opacity: 50, width: 100, height: 200}.
* speed – скорость в миллисекундах.
* easing – замедлениие анимации (замедляется ли к концу, "easein", или, наоборот, ускоряется, "easeout". Дополнительные [...]]]></description>
			<content:encoded><![CDATA[<p>Ключевой функцией, на которой базируются все остальные, является функция animate:<br />
<span id="more-342"></span> <em><br />
animate(params, speed, easing, callback);<br />
</em><br />
Здесь:</p>
<p>* params – свойства, которые участвуют в анимации в виде пар {ключ: значение}. Например: {height: "show"} или {opacity: 50, width: 100, height: 200}.<br />
* speed – скорость в миллисекундах.<br />
* easing – замедлениие анимации (замедляется ли к концу, "easein", или, наоборот, ускоряется, "easeout". Дополнительные типы доступны в модулях расширения).<br />
* callback – функция, которая будет вызвана после завершения анимации.</p>
<p>Пример.</p>
<p>Пусть у нас есть элемент div с каким-нибудь текстом. Мы хотим скрыть этот текст, заменить новым, и показать обновленный текст.</p>
<p><em>$("#mydiv")<br />
.animate({height: "hide"}, 300)<br />
.text("Новый текст")<br />
.animate({height: "show"}, 300);</em></p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/animate-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>autocomplete jquery</title>
		<link>http://fixblog.ru/2010/04/14/autocomplete-jquery/</link>
		<comments>http://fixblog.ru/2010/04/14/autocomplete-jquery/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 15:57:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=340</guid>
		<description><![CDATA[Если Вы пробовали что-то найти в Google, то наверняка знаете, что после ввода символа в текстовое поле появляется выпадающий список, который содержит десяток строк со словами, начальные символы которых совпадают с теми символами, что Вы уже успели ввести. Так работает Google Suggest. Почему бы не сделать так же на своем сайте? Ведь это удобно. К [...]]]></description>
			<content:encoded><![CDATA[<p>Если Вы пробовали что-то найти в Google, то наверняка знаете, что после ввода символа в текстовое поле появляется выпадающий список, который содержит десяток строк со словами, начальные символы которых совпадают с теми символами, что Вы уже успели ввести. Так работает Google Suggest. Почему бы не сделать так же на своем сайте? Ведь это удобно. К тому же с библиотекой jQuery это не так уж и сложно…<br />
<span id="more-340"></span><br />
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p>
<p>Сначала потребуется только подключить библиотеку jQuery и файл query.autocomplete.js в разделе HEAD нужной страницы.<br />
<em>&lt;script type="text/javascript" src="js/jquery-1.2.1.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" src="js/jquery.autocomplete.js"&gt;&lt;/script&gt;</em></p>
<p>Учтите, что файл jquery.autocomplete.js использует имена классов (начинаются с ac_), но если Вы захотите по каким-то причинам изменить эти имена – это тоже можно будет довольно легко сделать.</p>
<p>Что касается HTML-кода, то естественно нужно описать поле для ввода текста:<br />
<em>&lt;input id="example" type="text" /&gt;</em></p>
<p>А вот использовать jquery.autocomplete.js можно двумя разными способами.</p>
<p>Способ первый:<br />
Если объем данных не очень большой, и данные не будут изменяться, то их можно поместить непосредственно на странице, как и сделано в примере в текстовом поле слева.<br />
<em>&lt;script type="text/javascript"&gt;<br />
$(document).ready(function(){<br />
$("#example").autocompleteArray([<br />
"Магадан",<br />
"Магас",<br />
"Магнитогорск",<br />
"Майкоп",<br />
........<br />
"Муром",<br />
"Мценск",<br />
"Мыски",<br />
"Мытищи",<br />
"Мышкин"<br />
],<br />
{<br />
delay:10,<br />
minChars:1,<br />
matchSubset:1,<br />
autoFill:true,<br />
maxItemsToShow:10<br />
}<br />
);<br />
});<br />
&lt;/script&gt;</em></p>
<p>Способ второй:<br />
Если данные большого объема, и/или часто изменяются, то необходимо предусмотреть обработку этих данных на сервере (для примера выбран PHP). jquery.autocomplete.js предусматривает отправку GET-запроса с параметром q, значением которого являются введенные символы. Именно так в примере работает текстовое поле справа.<br />
<em>&lt;script type="text/javascript"&gt;<br />
$(document).ready(function(){<br />
$("#example2&#8243;).autocomplete("autocomplete.php", {<br />
delay:10,<br />
minChars:2,<br />
matchSubset:1,<br />
autoFill:true,<br />
matchContains:1,<br />
cacheLength:10,<br />
selectFirst:true,<br />
formatItem:liFormat,<br />
maxItemsToShow:10,<br />
onItemSelect:selectItem<br />
});<br />
});<br />
&lt;/script&gt;</em></p>
<p>В этих примерах, помимо данных (в первом случае) и URL обработчика (во втором случае) мы передаем некоторые опции. Список опций приведен ниже:</p>
<p>autoFill – когда Вы начинаете вводить текст, в поле ввода будет подставлено (и выделено) первое подходящее значение из списка. Если Вы продолжаете вводить текст, в поле ввода и далее будет подставляться подходящее значение, но уже с учетом введенного Вами текста. (По умолчанию: false).</p>
<p>inputClass – этот класс будет добавлен к элементу ввода. (По умолчанию: «ac_input»).</p>
<p>resultsClass – класс для UL, который будет содержать элементы результата (элементы LI). (По умолчанию: «ac_results»).</p>
<p>loadingClass – класс для элемента ввода, в то время, когда происходит обработка данных на сервере. (По умолчанию: «ac_loading»).</p>
<p>lineSeparator – символ, который разделяет строки в данных, возвращаемых сервером. (По умолчанию: «\n»).</p>
<p>cellSeparator – символ, который разделяет «ячейки» в строках данных, возвращаемых сервером. (По умолчанию: «|»).</p>
<p>minChars – минимальное число символов, которое пользователь должен напечатать перед тем, как будет активизирван запрос. (По умолчанию: 1).</p>
<p>delay – задержка в миллисекундах. Если в течение этого времени пользователь не нажимал клавиши, активизируется запрос. Если используется локальный запрос (к данным, находящимся непосредственно в файле), задержку можно сильно уменьшить. Например до 40ms. (По умолчанию: 400).</p>
<p>cacheLength – число ответов от сервера, сохраняемых в кэше. Если установлено в 1 – кэширование данных отключено. Никогда не устанавливайте меньше единицы. (По умолчанию: 1).</p>
<p>matchSubset – использовать ли кэш для уточнения запросов. Использование этой опции может сильно снизить нагрузку на сервер и увеличить производительность. Не забудьте при этом еще и установить для cacheLength значение побольше. Например 10. (По умолчанию: 1).</p>
<p>matchCase – использовать ли сравнение чувствительное к регистру символов (только если Вы используете кэширование). (По умолчанию: 0).</p>
<p>maxItemsToShow – ограничивает число результатов, которые будут показаны в выпадающем списке. Если набор данных содержит сотни элементов, может быть неудобно показывать весь список пользователю. Рекомендованное значение 10. (По умолчанию: -1).</p>
<p>extraParams – дополнительные параметры, которые могут быть переданы на сервер. Если Вы напишете {page:4}, то строка запроса к обработчику на сервере будет сформирована следующим образом: my_handler.php?q=foo&amp;page=4 (По умолчанию: {}).</p>
<p>width – устанавливает ширину выпадающего списка. По умолчанию ширина выпадающего списка определена шириной элемента ввода. Однако, если ширина элемента ввода небольшая, а строки выпадающего списка содержат большое количество символов – эта опция вполне может пригодиться. (По умолчанию: 0).</p>
<p>selectFirst – если установить в true, то по нажатию клавиши Tab или Enter будет выбрано то значение, которое в данный момент установлено в элементе ввода. Если же имеется выбранный вручную («подсвеченный») результат из выпадающего списка, то будет выбран именно он. (По умолчанию: false).</p>
<p>selectOnly – если установить в true и в выпадающем списке только одно значение, оно будет выбрано по нажатию клавиши Tab или Enter, даже если этот пункт не был выбран пользователем с помощью клавиатуры или указателя мыши. Заметьте, что эта опция отменяет действие опции selectFirst. (По умолчанию: false).</p>
<p>formatItem – JavaScript функция, которая поможет обеспечить дополнительную разметку элементов выпадающего списка. Функция будет вызываться для каждого элемента LI. Возвращаемые от сервера данные могут быть отображены в элементах LI выпадающего списка (см. второй пример). Принимает три параметра: строка результата, позиция строки в списке результатов, общее число элементов в списке результатов. (По умолчанию: none).</p>
<p>onItemSelect – JavaScript функция, которая будет вызвана, когда элемент списка выбран. Принимает единственный параметр – выбранный элемент LI. Выбранный элемент будет иметь дополнительный атрибут «extra», значением которого будет являться массив всех ячеек строки, которая была получена в качестве ответа от сервера. (По умолчанию: none).</p>
<p>Последние две опции весьма важны, если Вы хотите сделать действительно удобный и полезный элемент интерфейса, поэтому приведу примеры.<br />
function liFormat (row, i, num) {<br />
var result = row[0] + "&lt;em&gt;" +<br />
row[1] + " тыс.чел.&lt;/em&gt;";<br />
return result;<br />
}</p>
<p>В опции formatItem мы определили имя вызываемой функции – liFormat, а сама функция просто формирует строку, которая будет вставлена в соответствующий элемент LI. Строка содержит название поселка и элемент em, в который выводится количество проживающих там, в тысячах человек. Элемент em имеет класс qnt, с помощью которого, используя CSS, мы сдвигаем этот элемент вправо, немного уменьшаем размер шрифта и делаем сам шрифт зеленого цвета.</p>
<p>Следующий пример для опции onItemSelect:<br />
<em>function selectItem(li) {<br />
if( li == null ) var sValue = "Ничего не выбрано!";<br />
if( !!li.extra ) var sValue = li.extra[2];<br />
else var sValue = li.selectValue;<br />
alert("Выбрана запись с ID: " + sValue);<br />
}</em></p>
<p>Здесь видно как можно работать со значениями атрибута «extra» выбранного элемента LI. В примере мы выводим в alert значение идентификатора для записи из нашей тестовой базы.</p>
<p>Нам осталось только разобрать те действия, которые будут выполняться на стороне сервера. Как Вы наверное помните, мы выбрали для этого PHP. Вспомним также, что на сервер передается GET-запрос с параметром q, содержащим уже введенные пользователем символы. Сам код Вы сможете посмотреть, скачав файл примера.</p>
<p>Весь код мы будем выполнять только в случае существования XMLHttpRequest, только если передан GET-запрос с параметром q. Для примера используется текстовый файл, в котором содержится база данных. Вот фрагмент этого файла:<br />
<em>1:Пашковский:Краснодарский край:43,0<br />
2:Горячеводский:Ставропольский край:34,4<br />
3:Калинино:Краснодарский край:34,1<br />
4:Приволжский:Саратовская область:32,0<br />
. . . . . . . . . . . . . . . . . . .<br />
268:Залари:Иркутская область:10,0<br />
269:Октябрьский:Пермский край:10,0<br />
270:Ишеевка:Ульяновская область:10,0<br />
271:Жешарт:Республика Коми:10,0<br />
272:Прохоровка:Белгородская область:10,0</em></p>
<p>Мы читаем этот файл в массив, а затем в цикле перебираем все строки, в свою очередь разбивая каждую из них в массив, к элементу под номером один (название поселка) которого обращаемся для поиска соответствия с переданным GET-запросом. Если соответствие будет найдена выводим информацию, правда в несколько ином порядке, чем она хранилась в файле.</p>
<p>Такой подход выбран во-первых, потому что это пример, который должен быть очень просто воспроизведен на любом другом сайте, и во-вторых, чтобы при очень небольшом объеме данных дать почувствовать тот момент, когда запрос выполняется.</p>
<p>Вот собственно и все, обращу разве Ваше внимание на то, что для работы со строками использую мультибайтовые строковые функции.</p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/autocomplete-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>всплывающие подсказки</title>
		<link>http://fixblog.ru/2010/04/14/%d0%b2%d1%81%d0%bf%d0%bb%d1%8b%d0%b2%d0%b0%d1%8e%d1%89%d0%b8%d0%b5-%d0%bf%d0%be%d0%b4%d1%81%d0%ba%d0%b0%d0%b7%d0%ba%d0%b8/</link>
		<comments>http://fixblog.ru/2010/04/14/%d0%b2%d1%81%d0%bf%d0%bb%d1%8b%d0%b2%d0%b0%d1%8e%d1%89%d0%b8%d0%b5-%d0%bf%d0%be%d0%b4%d1%81%d0%ba%d0%b0%d0%b7%d0%ba%d0%b8/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 14:56:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=337</guid>
		<description><![CDATA[Или как их еще называют &#8211; баблы.
Код пузыря и объекта, при наведении курсора на который будет появляться подсказка.
&#60;div&#62;
&#60;div id="download"&#62;Наведи на меня курсор&#60;/div&#62;
&#60;table style="opacity: 0; top: -50px; left: -33px; display: none;" id="dpop"&#62;
&#60;tbody&#62;&#60;tr&#62;
&#60;td id="topleft"&#62;&#60;/td&#62;
&#60;td&#62;&#60;/td&#62;
&#60;td id="topright"&#62;&#60;/td&#62;
&#60;/tr&#62;
&#60;tr&#62;
&#60;td&#62;&#60;/td&#62;
&#60;td&#62;Вот здесь пишем текст&#60;/td&#62;
&#60;td&#62;&#60;/td&#62;
&#60;/tr&#62;
&#60;tr&#62;
&#60;td id="bottomleft"&#62;&#60;/td&#62;
&#60;td&#62;&#60;img alt="popup tail" src="files/bubble-tail2.png" height="29&#8243; width="30&#8243; /&#62;&#60;/td&#62;
&#60;td id="bottomright"&#62;&#60;/td&#62;
&#60;/tr&#62;
&#60;/tbody&#62;&#60;/table&#62;
&#60;/div&#62;
CSS
Теперь прописываем стили всем элементам, при этом делаем так, чтобы при отключенных [...]]]></description>
			<content:encoded><![CDATA[<p>Или как их еще называют &#8211; баблы.</p>
<p><span id="more-337"></span>Код пузыря и объекта, при наведении курсора на который будет появляться подсказка.</p>
<p><em>&lt;div&gt;<br />
&lt;div id="download"&gt;Наведи на меня курсор&lt;/div&gt;<br />
&lt;table style="opacity: 0; top: -50px; left: -33px; display: none;" id="dpop"&gt;<br />
&lt;tbody&gt;&lt;tr&gt;<br />
&lt;td id="topleft"&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;/td&gt;<br />
&lt;td id="topright"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;</p>
<p>&lt;tr&gt;<br />
&lt;td&gt;&lt;/td&gt;<br />
&lt;td&gt;Вот здесь пишем текст&lt;/td&gt;<br />
&lt;td&gt;&lt;/td&gt;<br />
&lt;/tr&gt;</p>
<p>&lt;tr&gt;<br />
&lt;td id="bottomleft"&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;img alt="popup tail" src="files/bubble-tail2.png" height="29&#8243; width="30&#8243; /&gt;&lt;/td&gt;<br />
&lt;td id="bottomright"&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/tbody&gt;&lt;/table&gt;<br />
&lt;/div&gt;</em></p>
<p><strong>CSS</strong></p>
<p>Теперь прописываем стили всем элементам, при этом делаем так, чтобы при отключенных скриптах ничего не плыло:</p>
<p><em>.bubbleInfo {<br />
position: relative;<br />
top: 150px;<br />
left: 100px;<br />
width: 500px;<br />
}<br />
.trigger {<br />
position: absolute;<br />
}</p>
<p>.popup {<br />
position: absolute;<br />
display: none;<br />
z-index: 50;<br />
border-collapse: collapse;<br />
font-size: .8em;<br />
}</p>
<p>.popup td.corner {<br />
height: 15px;<br />
width: 19px;<br />
}</p>
<p>.popup td#topleft {<br />
background-image: url(files/bubble-1.png);<br />
}</p>
<p>.popup td.top {<br />
background-image: url(files/bubble-2.png);<br />
}</p>
<p>.popup td#topright {<br />
background-image: url(files/bubble-3.png);<br />
}</p>
<p>.popup td.left {<br />
background-image: url(files/bubble-4.png);<br />
}</p>
<p>.popup td.right {<br />
background-image: url(files/bubble-5.png);<br />
}</p>
<p>.popup td#bottomleft {<br />
background-image: url(files/bubble-6.png);<br />
}</p>
<p>.popup td.bottom {<br />
background-image: url(files/bubble-7.png);<br />
text-align: center;<br />
}</p>
<p>.popup td.bottom img {<br />
display: block;<br />
margin: 0 auto;<br />
}</p>
<p>.popup td#bottomright {<br />
background-image: url(files/bubble-8.png);<br />
}</p>
<p></em><strong>jQuery</strong></p>
<p>Теперь сам код, который реализовывает эту прикольную анимацию.<em></p>
<p>$(function () {<br />
$(&#8216;.bubbleInfo&#8217;).each(function () {<br />
var distance = 10;<br />
var time = 250;<br />
var hideDelay = 500;</p>
<p>var hideDelayTimer = null;</p>
<p>var beingShown = false;<br />
var shown = false;<br />
var trigger = $(&#8216;.trigger&#8217;, this);<br />
var info = $(&#8216;.popup&#8217;, this).css(&#8216;opacity&#8217;, 0);</p>
<p>$([trigger.get(0), info.get(0)]).mouseover(function () {<br />
if (hideDelayTimer) clearTimeout(hideDelayTimer);<br />
if (beingShown || shown) {<br />
return;<br />
} else {<br />
beingShown = true;</p>
<p>info.css({<br />
top: -40,<br />
left: -33,<br />
display: &#8216;block&#8217;<br />
}).animate({<br />
top: &#8216;-=&#8217; + distance + &#8216;px&#8217;,<br />
opacity: 1<br />
}, time, &#8217;swing&#8217;, function() {<br />
beingShown = false;<br />
shown = true;<br />
});<br />
}</p>
<p>return false;<br />
}).mouseout(function () {<br />
if (hideDelayTimer) clearTimeout(hideDelayTimer);<br />
hideDelayTimer = setTimeout(function () {<br />
hideDelayTimer = null;<br />
info.animate({<br />
top: &#8216;-=&#8217; + distance + &#8216;px&#8217;,<br />
opacity: 0<br />
}, time, &#8217;swing&#8217;, function () {<br />
shown = false;<br />
info.css(&#8216;display&#8217;, &#8216;none&#8217;);<br />
});</p>
<p>}, hideDelay);</p>
<p>return false;<br />
});<br />
});<br />
});</em></p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/%d0%b2%d1%81%d0%bf%d0%bb%d1%8b%d0%b2%d0%b0%d1%8e%d1%89%d0%b8%d0%b5-%d0%bf%d0%be%d0%b4%d1%81%d0%ba%d0%b0%d0%b7%d0%ba%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jquery всплывающее окно</title>
		<link>http://fixblog.ru/2010/04/14/jquery-%d0%b2%d1%81%d0%bf%d0%bb%d1%8b%d0%b2%d0%b0%d1%8e%d1%89%d0%b5%d0%b5-%d0%be%d0%ba%d0%bd%d0%be/</link>
		<comments>http://fixblog.ru/2010/04/14/jquery-%d0%b2%d1%81%d0%bf%d0%bb%d1%8b%d0%b2%d0%b0%d1%8e%d1%89%d0%b5%d0%b5-%d0%be%d0%ba%d0%bd%d0%be/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 14:44:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=334</guid>
		<description><![CDATA[Итак, перед нами очередная очень распространенная задача — по клику на эскиз изображения (который фактически является ссылкой) красиво развернуть оригинальную картинку. Красиво — это в нашем случае что-то отличное от target="_blank" и с каким-нибудь «вау-эффектом».
Все скрипты, выполняющие данную задачу принято называть лайтбоксами (lightbox). В поисках неплохих решений, мною были запытаны более двух десятков скриптов, но [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, перед нами очередная очень распространенная задача — по клику на эскиз изображения (который фактически является ссылкой) красиво развернуть оригинальную картинку. Красиво — это в нашем случае что-то отличное от target="_blank" и с каким-нибудь «вау-эффектом».<br />
Все скрипты, выполняющие данную задачу принято называть лайтбоксами (lightbox). В поисках неплохих решений, мною были запытаны более двух десятков скриптов, но в результате в копилку были включены только нижеследующие.</p>
<p><a href="http://fancy.klade.lv">Fancy Box</p>
<p></a>Скрипт представляет собой плагин к jQuery.<br />
Возможности:</p>
<p>* Подгоняет размеры изображений под разрешение монитора;<br />
* Пририсовывает тень к всплывающему окошку;<br />
* Поддерживает возможность группирования объектов и их просмотр в виде галереи в одном окне;<br />
* Выведет для вас не только изображения, но и inline-элементы, а также HTML-контен в iframe;<br />
* Конечно же, все это благолепие можно конфигурировать, а также экспериментировать с CSS.</p>
<p>Теперь о размерах, а точнее, весе скрипта (вопрос немаловажный):</p>
<p>* непосредственно jquery.fancybox-1.0.0.js – 12 Кб<br />
* сам jQery (jquery-1.2.3.pack.js) – 29,1 Кб<br />
* дополнительный скриптик jquery.pngFix.pack.js – 2,52 Кб<br />
* CSS – около 4 Кб<br />
* изображения – 17 Кб</p>
<p>Подключение и использование скрипта не представляет никакой сложности:<br />
1. Сначала подключаем скрипты и CSS:</p>
<p><em>/* обязательно */<br />
&lt;script type="text/javascript" src="js/jquery.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" src="js/jquery.fancybox.js"&gt;&lt;/script&gt;</p>
<p>/* опционально */<br />
&lt;script type="text/javascript" src="js/jquery.pngFix.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" src="js/jquery.metadata.js"&gt;&lt;/script&gt;</p>
<p>/* цепляем CSS */<br />
&lt;link rel="stylesheet" href="css/fancybox.css" type="text/css" media="screen"&gt;</em></p>
<p>2. Берем подопытную картинку:</p>
<p><em>&lt;a href="image_big.jpg"&gt;&lt;img src="image_small.jpg" alt=""/&gt;&lt;/a&gt;</em></p>
<p>примечание: можете использовать атрибут title для отображения подписи к изображению, а также rel – для группировки обектов.<br />
Заключаем картинку в какое-нибудь оформление (p, div, span – без разницы) с определенным ID. Например, так:</p>
<p><em>&lt;p id="”test1”"&gt;&lt;a href="image_big.jpg"&gt;&lt;img src="image_small.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;</em></p>
<p>3. Инициализируем плагин:</p>
<p><em>$(document).ready(function() {<br />
$("p#test1 a").fancybox();<br />
});</em></p>
<p>Готово. В данном случае по щелчку на изображение появится всплывающее окошко с оригиналом изображения. Все параметры окна будут по умолчанию Но вы можете использовать дополнительные опции при вызове плагина, например:</p>
<p><em>$(document).ready(function() {<br />
$("p#test2 a").fancybox({<br />
&#8216;hideOnContentClick&#8217;: true<br />
});<br />
});</em></p>
<p>Параметр &#8216;hideOnContentClick&#8217;: true  — делает возможным закрытие всплывающего окна не только по нажатию на специальную кнопку, но и по щелчку на свободной области.<br />
Со всеми возможными настройками можете ознакомиться на официальном сайте плагина, где также можно скачать архив и полюбоваться на примеры работы скрипта .</p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/jquery-%d0%b2%d1%81%d0%bf%d0%bb%d1%8b%d0%b2%d0%b0%d1%8e%d1%89%d0%b5%d0%b5-%d0%be%d0%ba%d0%bd%d0%be/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>htaccess 301</title>
		<link>http://fixblog.ru/2010/04/14/htaccess-301/</link>
		<comments>http://fixblog.ru/2010/04/14/htaccess-301/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 14:39:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=331</guid>
		<description><![CDATA[Тема 301 редиректа постоянно обсуждается в различных SEO-форумах, да и каждая поисковая система в своей системе помощи имеет специальные разделы. Пока разбирался я нашел перечисленные ниже варианты организации редиректа, часть из которых опробовал у себя.

301 редирект это наилучший метод сохранения ваших позиций в поисковых системах, когда вы переносите страницу или сайт. Код "301&#8243; интерпретируется как [...]]]></description>
			<content:encoded><![CDATA[<p>Тема 301 редиректа постоянно обсуждается в различных SEO-форумах, да и каждая поисковая система в своей системе помощи имеет специальные разделы. Пока разбирался я нашел перечисленные ниже варианты организации редиректа, часть из которых опробовал у себя.<br />
<span id="more-331"></span><br />
301 редирект это наилучший метод сохранения ваших позиций в поисковых системах, когда вы переносите страницу или сайт. Код "301&#8243; интерпретируется как постоянное перемещение ("moved permanently").</p>
<p><strong>1. Простой редирект (в файле .htaccess или httpd.conf для Apache):</strong><br />
<em>Redirect 301 / http://www.you.com/new.htm</em><br />
где:<br />
Redirect 301 &#8211; это инструкция, говорящая что страница перемещена<br />
/ &#8211; означает, что все с верхнего уровня сайта, включая все подкаталоги, будет переадресовано<br />
http://www.you.com/new.htm &#8211; новая страница или сайт (не забывайте поставить последний "/", если переадресация идет на сайт).</p>
<p>Чтобы переадресовать только страницу, сохранив PR старой страницы:<br />
<em>Redirect 301 /old/old.htm http://www.you.com/new.htm</em><br />
где:<br />
/old/old.htm &#8211; путь и имя старой страницы</p>
<p>Аналогичный синтаксис для переадресации сайта:<br />
<em>RedirectPermanent / http://www.you.com/</em><br />
Пример переадресации каталога:<br />
<em>RedirectPermanent /old-directory http://www.domain.com/new-directory/</em></p>
<p>Например, зашедших в test переадресуем на www.test.com, остальных на enter.test.com (порядок следования записей важен):</p>
<p><em>Redirect permanent /test    http://www.test.com/<br />
Redirect permanent /        http://enter.test.com/</em></p>
<p>Примечание: для моих целей (изменение домена) хватило первого варианта простого 301 редиректа.<br />
<strong>2.Использование mod_rewrite (прописывается в файле .htaccess):</strong></p>
<p>Ставшая классической задача слияния имена сайта с www и без него, решается так:</p>
<p><em>Options +FollowSymLinks<br />
RewriteEngine on<br />
RewriteCond %{HTTP_HOST} ^yoursite\.com<br />
RewriteRule ^(.*)$ http://www.yoursite.com/$1 [R=permanent,L] . </em></p>
<p>или альтернативный синтаксис:</p>
<p><em>Options +FollowSymLinks<br />
RewriteEngine On<br />
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]<br />
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]</em></p>
<p>Обозначение [R=301,L] означает: перенаправить клиента и отправить ему код статуса 301 (R=301) и сделать это правило последним (L).</p>
<p>Редирект старого домена на новый:</p>
<p><em>Options +FollowSymLinks<br />
RewriteEngine on<br />
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]</em></p>
<p>Например, если необходимо чтобы вместо rewrite.htm загружался файл rewrite.html, добавьте в .htaccess:</p>
<p><em>RewriteEngine   on<br />
RewriteBase     /<br />
RewriteRule     ^rewrite\.htm$  rewrite.html [R=permanent]</em></p>
<p>Для замены всех .htm файлов .html файлами:</p>
<p><em>RewriteEngine  on<br />
RewriteBase     /<br />
RewriteRule     ^(.*)\.htm$  $1.html [R=permanent]</em></p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/htaccess-301/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>htaccess 404</title>
		<link>http://fixblog.ru/2010/04/14/htaccess-404/</link>
		<comments>http://fixblog.ru/2010/04/14/htaccess-404/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 14:36:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=328</guid>
		<description><![CDATA[Чтобы подставить свою 404 страницу, вместо той что предлагает CMS/Сервер, достаточно прописать в htaccess следующее:
ErrorDocument 404 /errors/404.html
]]></description>
			<content:encoded><![CDATA[<p>Чтобы подставить свою 404 страницу, вместо той что предлагает CMS/Сервер, достаточно прописать в htaccess следующее:</p>
<p><code>ErrorDocument 404 /errors/404.html</code></p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/htaccess-404/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>подсветка синтаксиса</title>
		<link>http://fixblog.ru/2010/04/14/%d0%bf%d0%be%d0%b4%d1%81%d0%b2%d0%b5%d1%82%d0%ba%d0%b0-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81%d0%b0/</link>
		<comments>http://fixblog.ru/2010/04/14/%d0%bf%d0%be%d0%b4%d1%81%d0%b2%d0%b5%d1%82%d0%ba%d0%b0-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81%d0%b0/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 14:34:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=326</guid>
		<description><![CDATA[Небольшой обзор известных мне скриптов для подсветки синтактиса в  textarea в реальном времени и его последующего редактирования.
 
Codepress
Пожалуй, самый известный. Отлично работает в Firefox, но не работает в  Opera, Safari (WinXP). Кроме простой подсветки умеет делать  автозаполнение (дописывает парные скобки). Возможно использовать  несколько таких редакторов на одной странице.
P.S. Прочитав комментарии на [...]]]></description>
			<content:encoded><![CDATA[<p>Небольшой обзор известных мне скриптов для подсветки синтактиса в  textarea в реальном времени и его последующего редактирования.<br />
<span id="more-326"></span> <a name="habracut"></a><br />
<a href="http://codepress.org/">Codepress</a><br />
Пожалуй, самый известный. Отлично работает в Firefox, но не работает в  Opera, Safari (WinXP). Кроме простой подсветки умеет делать  автозаполнение (дописывает парные скобки). Возможно использовать  несколько таких редакторов на одной странице.<br />
P.S. Прочитав комментарии на официальном сайте, можно избавиться от  некоторых багов.</p>
<p><a href="http://www.cdolivet.net/index.php?page=editArea">EditArea</a><br />
Подсвечивает PHP, CSS, Javascript, Python, HTML, XML, VB, C, C++,  Pascal, Basic, Brainf*ck, имеет локализацию для 9 языков. Работает в IE 6  и 7, Firefox 1.5 и 2, Opera 9 и Safari (WinXP). Кроме того, имеет более  «богатый» интерфейс.</p>
<p><a href="http://marijn.haverbeke.nl/codemirror/">CodeMirror</a><br />
Подсвечивает, к сожалению, только HTML, JavaScript и XML. Работает в  Firefox 1.5+, IE6+, Safari 3+, Opera 9.5+.</p>
<p><a href="http://helene.muze.nl/ariadne/loader.php/helene/demo/">Helene</a><br />
Распознает только PHP. Работает в Firefox 1.5 и 2, Opera 9 и Safari  (WinXP).</p>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/%d0%bf%d0%be%d0%b4%d1%81%d0%b2%d0%b5%d1%82%d0%ba%d0%b0-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>визуальный редактор</title>
		<link>http://fixblog.ru/2010/04/14/%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d1%80%d0%b5%d0%b4%d0%b0%d0%ba%d1%82%d0%be%d1%80/</link>
		<comments>http://fixblog.ru/2010/04/14/%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d1%80%d0%b5%d0%b4%d0%b0%d0%ba%d1%82%d0%be%d1%80/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 14:32:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Note]]></category>

		<guid isPermaLink="false">http://fixblog.ru/?p=324</guid>
		<description><![CDATA[Сказание о TinyMCE
Ну, эта программа, по моему мнению, занимает почётный пьедестал первенства на рынке подобных продуктов, так как обладает наиболее функциональным интерфейсом, "портативностью", ассоциативностью, и при всё при этом &#8211; относительной скоростью. Но сказать это, означает не сказать ровным счётом ничего, так как этими поверхностными похвалами нельзя раскрыть все её достоинства, среди которых: наиболее проработанный [...]]]></description>
			<content:encoded><![CDATA[<p>Сказание о TinyMCE</p>
<p>Ну, эта программа, по моему мнению, занимает почётный пьедестал первенства на рынке подобных продуктов, так как обладает наиболее функциональным интерфейсом, "портативностью", ассоциативностью, и при всё при этом &#8211; относительной скоростью. Но сказать это, означает не сказать ровным счётом ничего, так как этими поверхностными похвалами нельзя раскрыть все её достоинства, среди которых: наиболее проработанный среди всех вышеперечисленных систем API-интерфейс, простота и понятность, дововольно быстрое время обработки (учитывая уровень и качество производимых системой действий), ну а так же качество обработки внешних данных. К примеру, вы можете просто скопировать текст из документа Word, и при правильной настройке, система транслирует его в очень и очень похожем формате, при относительной чистоте кода, который соответствует стандартам, что выдвигает главный законодатель мод в WWW &#8211; W3C. Но, безусловно, не бывает мёду без дёгтя, и в этом случае есть свои минусы. Среди них неработоспособность на браузерах Opera заканчивая 8.4, на которых система вообще не будет работать. Ну и, конечно, учитывая все её возможности и мультиброузерность, на выходе мы получаем довольно объёмный исходный код, а именно 1,9 МБайт, но я считаю, что размер окупает себя сполна.</p>
<p><span id="more-324"></span>Что ж, чтобы не быть голословным, и не занимать большую часть статьи рекламой и похвалами, я покажу вам систему в режиме реального времени.</p>
<p>Чтобы загрузить себе версию системы, вам необходимо зайти на сайт http://tinymce.org и скачать себя последнюю версию, после чего читать дальше моё повествование.</p>
<p>Итак, допустим, у вас есть некоторый документ form.html, в котором содержится некоторая форма, с полем TextArea. Но как его сделать WYSIWYG-типа?</p>
<p>Да очень просто, для этого вам сначала необходимо подключить основной класс TinyMCE, после чего в документе автоматически станет доступным прототип объекта TinyMCE, который и является основным API-интерфейсом системы, через который происходит общение с программой, и её настройка.</p>
<p>Давайте рассмотрим простейший случай применения программы, на примере документа с формой и элементом TextArea:</p>
<p>Листинг 1.1</p>
<p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Первый пример&lt;/title&gt;<br />
&lt;meta http-equiv=&#8217;Content-Type&#8217;<br />
Content=&#8217;text/html;charset=utf-8&#8242;/&gt;<br />
&lt;script type=&#8217;text/javascript&#8217;<br />
src=&#8217;tinymce/jscripts/tiny_mce/tiny_mce.js&#8217;&gt;&lt;/script&gt;<br />
&lt;script type=&#8217;text/javascript&#8217;&gt;<br />
&lt;!&#8211;<br />
tinyMCE.init({<br />
mode : "textareas",<br />
theme : "simple"<br />
});<br />
&#8211;&gt;<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h3&gt;Некоторый элемент TextArea&lt;/h3&gt;<br />
&lt;textarea id=&#8217;ds1&#8242; cols=&#8217;65&#8242; rows=&#8217;13&#8242;&gt;&lt;/textarea&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p>
<p>В данном простейшем случае в качестве поля для редактирования мы увидим редактор с минимальным набором функций для стандартного форматирования текста, но не больше. Подобный подход можно применить в рамках проекта по созданию чата, форума, гостевой книги и прочего. Для более же сложных вариантов у нас есть дополнительный набор функций и методов, о которых мы сейчас и поговорим.</p>
<p>Но давайте поговорим сначала о параметрах, которые мы в данном случае передаём в метод инициализации класса &#8211; init().</p>
<p>Мы передаём в качестве параметра некоторый хеш, в котором значение элемента mode соответствует &#8216;textareas&#8217;, а элемента theme &#8211; &#8217;simple&#8217;. Элемент `mode` означает метод "замены" стандартных текстовых полей (textarea), на WYSIWYG. Он может принимать значения &#8216;textareas&#8217; , &#8216;exact&#8217; и &#8217;specify_textareas&#8217;.</p>
<p>В случае &#8216;textareas&#8217; мы даём команду редактору преобразовать все элементы TextArea в редактируемые элементы. В остальных случаях мы манипулируем определенным полями для редактирования, идентификаторы которых необходимо перечислить в качестве значения элемента elems, через запятую.</p>
<p>В свою очередь элемент &#8216;theme&#8217; означает ничто иное, как текущий тип оформления редактора и может принимать значения: &#8217;simple&#8217; и &#8216;advanced&#8217;.</p>
<p>В нашем случае, когда мы используем тип &#8217;simple&#8217;, мы подключаем исключительно стандартные функции редактора, и при этом не может особо менять его функционал, как я уже говорил &#8211; это вполне сгодится для малых проектов, а так же для тех, в которых необходима высокая скорость соединения.</p>
<p>Теперь давайте рассмотрим работу с редактором во время включённого режима темы &#8216;advanced&#8217;.</p>
<p>В этом случае мы имеем гибкий в редактировании интерфейс, полное редактирование всех используемых редактором функций, а так же ещё несколько моментов.</p>
<p>Что ж, допустим, вы начали проект некоторого электронного журнала или Интернет-издания, в котором принципиальной является возможность создание статей со стороны администрации. При этом следует учитывать, что интерфейс программы должен быть как можно более схожим с привычным для нас интерфейсом наиболее используемого Word&#8217;а, а так же иметь достаточное количество функций для воплощения всех идей редактора относительно форматирования текста статьи, и никогда не должно возникать таких вопросов как: "А куда нужно нажать?", "А почему оно не показывает:.", "А куда делся весь текст":</p>
<p>Для более редкого возникновения подобных вопросов (но ведь от них никуда не деться <img src='http://fixblog.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  мы сейчас немного изменим, текущий вариант редактора и добавим следующие функции:</p>
<p>1. Автоматическое форматирование вставляемого текста<br />
2. Добавим функции форматирования<br />
3. Изменим расположение панелей управления<br />
4. Зададим язык редактора<br />
5. Добавим проверку орфографии</p>
<p>Что ж, давайте обсудим точнее, что мы хотим увидеть в редакторе:</p>
<p>1. Панель форматирования находится сверху<br />
2. Панель состояния отсутствует<br />
3. Язык редактора &#8211; русский<br />
4. Функции форматирования: полужирный, курсив, подчёркивание, шрифт, размер, стиль текста, цвет, заливка.<br />
5. Функции структурного форматирования: таблица, выравнивание, табуляция, список<br />
6. Дополнительные функции: вставка изображения, вставка, предпросмотр, вставка гиперссылки, функции "отката" и "возврата", ну и, наверное, введём печать.</p>
<p>Что ж, формализация задания есть, теперь давайте решим, как мы будем это воплощать в жизнь.</p>
<p>Для воплощения функции авторформата вставляемого извне текста необходимо указать параметр хеш-списка &#8211; &#8216;paste_auto_cleanup_on_paste&#8217;, который принимает в качестве значения булев (true || false), и в зависимости от этого форматирует или нет внешний текст, переданный из буфера обмена.</p>
<p>При использовании данного параметра следует так же использовать и следующие параметры:</p>
<p><em> paste_convert_headers_to_strong : (true | false),<br />
paste_strip_class_attributes : "all",<br />
paste_remove_spans : (true | false),<br />
paste_remove_styles : (true | false)</em></p>
<p>Ну, я их не озвучиваю, так как их названия и так ассоциативны. Что ж, со вставкой мы проблему решили, и теперь нам необходимо решить ещё несколько задач, поставленных нами ранее. Но давайте сейчас поговорим про панели программы, так как это довольно важно при проектировании визуального отображения редактора.</p>
<p>Существует два вида панелей, а именно: панель инструментов (toolbar) и панель состояния (statusbar).</p>
<p>На первой панели размещаются функциональные кнопки, а так же другие средства для форматирования и редактирования текста.</p>
<p>Каждая из этих панелей может иметь своё положение (снизу или сверху), то есть у нас есть возможность довольно гибко менять их положения в редакторе. Для этого можно воспользоваться параметрами:</p>
<p><em> theme_advanced_toolbar_location : (top | bottom | none),<br />
theme_advanced_statusbar_location : top | bottom | none)</em></p>
<p>При этом в зависимости от значения параметра и будет установлено конечное положение панели, или если параметр стоит в значении &#8216;none&#8217;, то панель вообще не будет отображена.</p>
<p>И ещё, панель инструментов имеет такой параметр как выравнивание, в соответствии значения которого, и будет центрированы элементы панели. За центрирование элементов отвечает параметр theme_advanced_toolbar_location, и может принимать стандартные значения: center, left, right (по-умолчанию установлен параметр center).</p>
<p>Итак, с панелями разобрались, но ведь на них следует добавить что-то?</p>
<p>Ведь по-умолчанию он будут просто пустовать, с минимальным набором значений, на ведь не нужен такой редактор?</p>
<p>Для размещения, элементы, или же другими словами &#8211; кнопки, должны разбиваться на несколько категорий, в каждой из которых могут находиться элементы (не)разделённые знаком разделителя. Для абстракции групп в программе используется понятие кнопок, и для задания группы в качестве значения параметра theme_advanced_button(n+1), где n-текущий номер группы, задается набор элементов, которые к ней должны относится.</p>
<p>Хотя про набор вы можете, особо не беспокоится, так как по-умолчанию в панели инструментов вы и так сможете найти стандартный набор необходимых функций выравнивания, форматирования и прочего, но это доступно лишь в режиме темы &#8216;advanced&#8217;.</p>
<p>Для задания языка редактора нужно всего лишь добавить параметр &#8216;language&#8217; со значением &#8216;ru&#8217;.</p>
<p>Что ж, давайте посмотрим, что вышло у меня:</p>
<p>Листинг 1.2.</p>
<p><em>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;TNT43 Visual Editor&lt;/title&gt;<br />
&lt;script type=&#8217;text/javascript&#8217; src=&#8217;tinymce/jscripts/tiny_mce/tiny_mce.js&#8217;&gt;&lt;/script&gt;<br />
&lt;script type=&#8217;text/javascript&#8217;&gt;<br />
tinyMCE.init({<br />
mode : "textareas",<br />
theme : "advanced",<br />
language: "ru",<br />
plugins : "table,save,advhr,advimage,advlink,insertdatetime,<br />
preview,zoom, searchreplace,print,contextmenu,paste,directionality ",<br />
theme_advanced_buttons1_add_before : "save,newdocument,separator",<br />
theme_advanced_buttons1_add : "fontselect,fontsizeselect",<br />
theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,<br />
forecolor,backcolor",<br />
theme_advanced_buttons2_add_before: "cut,copy,paste,pastetext,pasteword,separator",<br />
theme_advanced_buttons3_add : "advhr,separator,print,separator,ltr,rtl,separator ",<br />
theme_advanced_toolbar_location : "top",<br />
theme_advanced_toolbar_align : "left",<br />
theme_advanced_statusbar_location : "bottom",<br />
plugi2n_insertdate_dateFormat : "%Y-%m-%d",<br />
plugi2n_insertdate_timeFormat : "%H:%M:%S",<br />
theme_advanced_resizing : true,<br />
theme_advanced_resize_horizontal : false,<br />
paste_auto_cleanup_on_paste : true,<br />
paste_convert_headers_to_strong : false,<br />
paste_strip_class_attributes : "all",<br />
paste_remove_spans : false,<br />
paste_remove_styles : false<br />
});<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;textarea id=&#8217;data&#8217; rows=&#8217;15&#8242; cols=&#8217;60&#8242;&gt;&lt;/textarea&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</em></p>
<p>Вот &#8211; это и весь код. Он выглядит довольно громоздко, но в целом довольно прост для понимания.</p>
<p>Что ж, давайте рассмотрим его анатомию. Сначала мы передаём наиболее важные параметры, а именно: метод "замены" текстовых полей, тип темы редактора, язык редактора, а так же список подключаемых плагинов. Кстати о них. Насколько вы заметили, если внимательно читали, то в рамках данного текста мы их ещё не разу не упоминали.</p>
<p>Плагины &#8211; некоторые внешние модули, которые необходимы для воплощения тех либо иных функций программы. Плагины размещаются в папке `plugins`, откуда подключатся к программе в момент вызова. Для использования плагинов в программе, их сначала необходимо перечислить через запятую, в качестве параметров элемента `plugins`, после чего добавить соответствующую кнопку на панель, для их использования.</p>
<p>Так же в рамках примера в листинге 1.2, мы использовали плагин inserdate, для котрого позже задали параметр dateFormat и timeFormat, которые вводят формат используемого времени и даты, соответственно. Они задаются в соответствии со спецификацией функции временных меток.</p>
<p>Так же стоит упомянуть другие интересные функции, использованные в примере:</p>
<p>* paste_remove &#8211; при режиме true, редактор фильтрует все поступившие из буфера обмела данные, и удаляет контеинеры spaи.<br />
* paste_convert_headers_to_strong &#8211; при режиме true, редактор изменяет все заголовки (h1,h2,h3,h4,h5,h6) в буффере обмена на элементы &lt;strong&gt;<br />
* paste_auto_cleanup_on_paste &#8211; фильтр для данных из буфера обмена (применимо к данным из MS Word)</p>
<p>Вот, по-моему, для общего обзора системы хватит. Однако мы ещё не рассмотрели довольно большое количество методов API-интерфейса, без которых часто очень сложно представить себе работу с редактором. Но обещаю, что мы рассмотрим их в следующих выпусках МК.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">
<table style="border-collapse: collapse; width: 167pt;" border="0" cellspacing="0" cellpadding="0" width="222">
<col style="width: 167pt;" width="222"></col>
<tbody>
<tr style="height: 15pt;" height="20">
<td style="height: 15pt; width: 167pt;" width="222" height="20">визуальный редактор</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://fixblog.ru/2010/04/14/%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d1%80%d0%b5%d0%b4%d0%b0%d0%ba%d1%82%d0%be%d1%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

