<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Пашин блог</title>
	
	<link>http://pashinblog.ru</link>
	<description>Блог веб-девелопера</description>
	<lastBuildDate>Mon, 12 Sep 2011 10:32:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/pashinblog/feed" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="pashinblog/feed" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Нежадные(ungreedy) регулярные выражения в Javascript</title>
		<link>http://pashinblog.ru/coding/ungreedy-regular-expressions-in-javascript/</link>
		<comments>http://pashinblog.ru/coding/ungreedy-regular-expressions-in-javascript/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 12:06:56 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[regular expressions]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/?p=162</guid>
		<description><![CDATA[Привет. Как вы, наверное, знаете, джаваскрипт не поддерживает никакие другие модификаторы шаблонов регулярных выражений, кроме &#171;g&#187;(глобальная подстановка), &#171;i&#187;(игнорировать регистр символов) и &#171;m&#187;(многострочная подстановка). В частности, нет такого полезного модификатора, как &#171;Ungreedy&#187;. Но, как оказалось, его можно включить, но немного по-другому. Например у нас есть задача: заменить все {$var} в строке &#171;Some variable here: {$var} and [...]]]></description>
			<content:encoded><![CDATA[<p>Привет.</p>
<p>Как вы, наверное, знаете, джаваскрипт не поддерживает никакие другие модификаторы шаблонов регулярных выражений, кроме &#171;g&#187;(глобальная подстановка), &#171;i&#187;(игнорировать регистр символов) и &#171;m&#187;(многострочная подстановка). В частности, нет такого полезного модификатора, как &#171;Ungreedy&#187;. Но, как оказалось, его можно включить, но немного по-другому.</p>
<p>Например у нас есть задача: заменить все <em>{$var}</em> в строке &#171;Some variable here: {$var} and there: {$var}&#187; на &#171;&lt;a&gt;var&lt;/a&gt;&#187;. Если мы попробуем использовать регулярное выражение &#171;/{\$(.*)}/g&#187;, то получим следующее: &#171;Some variable here: &lt;a&gt;var} and there: {$var&lt;/a&gt;&#187;, что явно нам не подходит. Это произошло потому, что по-умолчанию в JS регулярные выражения &#171;жадные&#187; — т.е. пытаются взять максимально подходящее под шаблон количество символов. В нашем случае под шаблон подошла вся строка от первого &#171;{$&#187; до последнего &#171;}&#187;. Нам же нужно другое поведение.</p>
<p>Для этого используем хитрое сочетание специальных символов(подсмотренное в <a href="https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions" target="_blank">MDN</a>), и наш шаблон обретает следующий вид: &#171;/{\$(.+?)}/g&#187;. Теперь при замене мы получаем именно то, что нам требуется &#171;Some variable here: &lt;a&gt;var&lt;/a&gt; and there: &lt;a&gt;var&lt;/a&gt;&#187;.</p>
<p>Удачи!</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/coding/ungreedy-regular-expressions-in-javascript/","Нежадные(ungreedy) регулярные выражения в Javascript")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/coding/ungreedy-regular-expressions-in-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Простой способ синхронизации структуры и данных MySQL при работе с Mercurial</title>
		<link>http://pashinblog.ru/coding/mysql-sync-in-mercurial/</link>
		<comments>http://pashinblog.ru/coding/mysql-sync-in-mercurial/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 06:53:50 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/?p=145</guid>
		<description><![CDATA[Привет. Недавно перевёл работу на Mercurial и встала задача организовать синхронизацию MySQL. Погуглив, ничего простого и надёжного не было найдено, поэтому пришлось самому решать эту задачу. Решение оказалось на удивление простым. Разделим задачу на две части: сохранение изменений базы данных, с последующим  коммитом и пушем в центральный репозиторий, и обновление структуры БД после апдейта. Тогда [...]]]></description>
			<content:encoded><![CDATA[<p>Привет. Недавно перевёл работу на Mercurial и встала задача организовать синхронизацию MySQL. Погуглив, ничего простого и надёжного не было найдено, поэтому пришлось самому решать эту задачу.</p>
<p><span id="more-145"></span>Решение оказалось на удивление простым. Разделим задачу на две части: сохранение изменений базы данных, с последующим  коммитом и пушем в центральный репозиторий, и обновление структуры БД после апдейта. Тогда задание сводится к тому, чтобы перед коммитом(а точнее перед <em>hg status)</em> сделать дамп базы в определённый файл и закоммитить его. И затем после <em>hg update</em> нужно этот файл импортировать в базу, вместе с свежими изменениями.</p>
<h3>Общее решение</h3>
<p>Для решения проблемы воспользуемся хуками (<a href="http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html">подробнее</a>). Заходим в папку <em>.hg</em> в нашем репозитории, и находим(или не находим, тогда создаём) там файл <em>hgrс. </em>Открываем его любимым редактором и вставляем туда следующий код:</p>
<p><code>[hooks]<br />
pre-status = c:\path\to\mysql\bin\mysqldump.exe -u USERNAME -pUSERPSWD DBNAME &gt; db\dump.sql</code></p>
<p><code> </code></p>
<p><code>update = c:\path\to\mysql\bin\mysql.exe -u USERNAME -pUSERPSWD DBNAME &lt; db\dump.sql</code></p>
<p>Если вы не понимаете указанные параметры, запустите <em>mysqldump &#8212;help</em> и почитайте мануал. Вкратце — заменяем USERNAME на имя пользователя MySQL(должен иметь права для дампа и импорта),  USERPSWD — на пароль этого пользователя и DBNAME на имя базы данных. Если хотите, можете поменять место хранения дампа(<em>db\dump.sql</em>, относительно корня репозитория). Пользователям не-windows систем может потребоваться поменять ещё и разделитель директорий на &#171;/&#187;.</p>
<p>Всё. Теперь можно запустить <em>hg status</em> и увидеть, что Mercurial заметил изменения в дампе(после первого запуска появится файл с дампом, не забудьте добавить его в репозиторий командой <em>hg add</em>):</p>
<p><a href="http://www.pashinblog.ru/wp-content/uploads/2010/11/hg-status.png"><img class="alignnone size-full wp-image-152" title="hg status" src="http://www.pashinblog.ru/wp-content/uploads/2010/11/hg-status.png" alt="" width="677" height="342" /></a></p>
<h3>Решение для TortoiseHg</h3>
<p>При использовании <a href="http://tortoisehg.bitbucket.org/">TortoiseHg</a> не срабатывает хук &#171;pre-status&#187;. Вызвано это тем, что команда &#171;status&#187; там вообще не запускается. Я не смог выяснить, какая команда там запускается при формировании списка изменённых файлов в окне &#171;commit&#187;, поэтому пришлось вешать хук на сам коммит. В итоге в файл <em>hgrc</em> там нужно добавить немного изменённый код:</p>
<p><code>[hooks]<br />
commit.a = c:\path\to\mysql\bin\mysqldump.exe -u USERNAME -pUSERPSWD DBNAME &gt; db\ep.sql<br />
commit.b = hg status</code></p>
<p><code> </code></p>
<p><code>update = c:\path\to\mysql\bin\mysql.exe -u USERNAME -pUSERPSWD DBNAME &lt; db\temp.sql</code></p>
<p>Теперь коммит будет проходить в два этапа — сначала изменённые файлы, затем срабатывает хук, и сразу коммитим изменённый дамп. Чуть менее удобно, но пока другого решения я не нашёл. Апдейт работает так же, как и в первом случае.</p>
<p>Спасибо за внимание. Как обычно, буду рад любым улучшениям и предложениям.</p>
<p>Полезные ссылки:</p>
<ul>
<li><a href="http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html">мануал</a> по mercurial hooks</li>
<li><a href="http://dl.dropbox.com/u/6477771/mysqldump.exe">mysqldump.exe</a> версии 5.1.5 для пользователей Денвера(там урезанная версия MySQL и нет этого файла)</li>
</ul>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/coding/mysql-sync-in-mercurial/","Простой способ синхронизации структуры и данных MySQL при работе с Mercurial")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/coding/mysql-sync-in-mercurial/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Запуск приложений до входа в Windows</title>
		<link>http://pashinblog.ru/sysadmin/run-on-load/</link>
		<comments>http://pashinblog.ru/sysadmin/run-on-load/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 22:31:41 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/?p=133</guid>
		<description><![CDATA[Самый простой способ запустить приложение, или что-либо другое, сразу после загрузки системы — использовать встроенный в windows планировщик заданий. Расскажу на примере Windows Server 2003. Предположим, нам нужно запустить Денвер, причём именно до входа пользователя в систему. Открываем «Назначенные задания» (Пуск → Все программы → Стандартные → Служебные → Назначенные задания), там нажимаем «Добавить задание». [...]]]></description>
			<content:encoded><![CDATA[<p>Самый простой способ запустить приложение, или что-либо другое, сразу после загрузки системы — использовать встроенный в windows планировщик заданий. Расскажу на примере Windows Server 2003. Предположим, нам нужно запустить <a href="http://www.denwer.ru/">Денвер</a>, причём именно до входа пользователя в систему.</p>
<p>Открываем «Назначенные задания» (Пуск → Все программы → Стандартные → Служебные → Назначенные задания), там нажимаем «Добавить задание». В окне выбора приложения нажимаем «Обзор» и выбираем файл run.exe в папке c:/webservers/denwer/ (путь по-умолчанию, у вас может быть другим).</p>
<p><a href="http://www.pashinblog.ru/wp-content/uploads/2010/10/screen_1.jpg"><img class="alignnone size-full wp-image-135" title="Выбор денвера" src="http://www.pashinblog.ru/wp-content/uploads/2010/10/screen_1.jpg" alt="" width="563" height="412" /></a></p>
<p>Затем нажимаем «Далее» и переходим к выбору режима запуска. Тут нас интересует режим «при загрузке компьютера».</p>
<p><a href="http://www.pashinblog.ru/wp-content/uploads/2010/10/screen_2.jpg"><img class="alignnone size-full wp-image-136" title="Выбор режима запуска" src="http://www.pashinblog.ru/wp-content/uploads/2010/10/screen_2.jpg" alt="" width="440" height="318" /></a></p>
<p>После этого снова нажимаем «Далее» и указываем имя и пароль пользователя, от имени которого вы хотите выполнить запуск приложения. Для денвера лучше использовать аккаунт администратора, чтобы избежать проблем с подключением дисков и изменением hosts-файла. Затем осталось лишь нажать «Готово», и проверить задание, перезагрузив компьютер.</p>
<p>P.S. Несмотря на то, что в статье, в качестве примера, используется денвер, я крайне не рекомендую использовать его на «боевых» серверах. По крайней мере без должной кропотливой настройки его компонентов.</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/sysadmin/run-on-load/","Запуск приложений до входа в Windows")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/sysadmin/run-on-load/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Подключение PPPoE с указанием имени службы в Ubuntu</title>
		<link>http://pashinblog.ru/sysadmin/pppoe-service-name-ubuntu/</link>
		<comments>http://pashinblog.ru/sysadmin/pppoe-service-name-ubuntu/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 23:09:34 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[pppoe]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/?p=117</guid>
		<description><![CDATA[Провайдер требует указать имя службы для подключения PPPoE? Немного подправим конфиги, и все получится. Например, в файле /etc/ppp/peers/dsl-provider у нас хранятся настройки подключения. Находим строку: plugin rp-pppoe.so eth0 Дописываем: rp_pppoe_service имя_службы plugin rp-pppoe.so rp_pppoe_service имя_службы eth0 Если используется пакет pppoe, то находим строку: pty "/usr/sbin/pppoe -I eth0 -T 80 -m 1452" Дописываем: -S имя_службы pty [...]]]></description>
			<content:encoded><![CDATA[<p>Провайдер требует указать имя службы для подключения PPPoE?<br />
Немного подправим конфиги, и все получится.<br />
Например, в файле /etc/ppp/peers/dsl-provider у нас хранятся настройки подключения.<br />
Находим строку:<br />
<code>plugin rp-pppoe.so eth0</code><br />
Дописываем: rp_pppoe_service имя_службы<br />
<code>plugin rp-pppoe.so rp_pppoe_service имя_службы eth0</code><br />
Если используется пакет pppoe, то находим строку:<br />
<code>pty "/usr/sbin/pppoe -I eth0 -T 80 -m 1452"</code><br />
Дописываем: -S имя_службы<br />
<code>pty "/usr/sbin/pppoe -I eth0 -T 80 -m 1452 -S имя_службы"</code></p>
<p>(c) <a href="http://my.runtu.org/blog/maksipes">http://my.runtu.org/blog/maksipes</a></p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/sysadmin/pppoe-service-name-ubuntu/","Подключение PPPoE с указанием имени службы в Ubuntu")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/sysadmin/pppoe-service-name-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Раскрась машинку, %USERNAME%!</title>
		<link>http://pashinblog.ru/coding/car_painter/</link>
		<comments>http://pashinblog.ru/coding/car_painter/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 10:19:36 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[png]]></category>
		<category><![CDATA[Томат]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/?p=109</guid>
		<description><![CDATA[Снова привет. Нашёл в дебрях компьютера одну забавную штуку, которую мы с Лёшей в студии делали для одного клиента. Она была задумана как главная «замануха» для посетителей, но клиент не принял, к сожалению. Выкладываю её вам на пощупать, посмотреть код и сказать мнение. В процессе создания было прочитано несколько статей по теме цвета, сделан не [...]]]></description>
			<content:encoded><![CDATA[<p>Снова привет.<br />
Нашёл в дебрях компьютера одну забавную <a href="http://pashinblog.ru/sandbox/car_painter/">штуку</a>, которую мы с <a href="http://tetzkatlipoka.livejournal.com/44875.html">Лёшей</a> в студии делали для одного клиента. Она была задумана как главная «замануха» для посетителей, но клиент не принял, к сожалению. Выкладываю её вам на пощупать, посмотреть код и сказать мнение.</p>
<p>В процессе создания было прочитано несколько статей по теме цвета, сделан не один десяток экспериментов, и взорван мозг :). Основой всего стала png-маска машинки, под которой лежит див. Цвет дива как раз и настраивается бегунками. Все вычисления и формулы вы можете сами найти и почитать в <a href="http://pashinblog.ru/sandbox/car_painter/static/js/dragger.js">dragger.js</a>, может быть потом подробнее расскажу как там и что.</p>
<p>Буду рад услышать ваше мнение.</p>
<p>En taro Adun, Executor!</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/coding/car_painter/","Раскрась машинку, %USERNAME%!")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/coding/car_painter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Кроссбраузерный placeholder</title>
		<link>http://pashinblog.ru/coding/placeholder/</link>
		<comments>http://pashinblog.ru/coding/placeholder/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 21:00:01 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery plugin]]></category>
		<category><![CDATA[placeholder]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/?p=24</guid>
		<description><![CDATA[Добрый день. Наконец-то дошли руки до написания первого тематического поста в блог. Им я начну цикл статей о jQuery плагинах, которые мы активно используем в студии. Итак, статья о такой полезной вещи как плэйсхолдер (placeholder). Интро Placeholder это текст, по умолчанию стоящий в текстовых полях формы. Он подсказывает посетителю сайта, что же ему нужно написать [...]]]></description>
			<content:encoded><![CDATA[<p>Добрый день.</p>
<p>Наконец-то дошли руки до написания первого тематического поста в блог. Им я начну цикл статей о jQuery плагинах, которые мы активно используем в <a href="http://tomatstudio.ru" target="_blank">студии</a>. Итак, статья о такой полезной вещи как плэйсхолдер (placeholder).<br />
<span id="more-24"></span></p>
<h3>Интро</h3>
<p>Placeholder это текст, по умолчанию стоящий в текстовых полях формы. Он подсказывает посетителю сайта, что же ему нужно написать в это поле. Сейчас всё чаще встречаются сайты, на которых он используется, поэтому тема, мне кажется, актуальна. Выглядит он вот так:</p>
<p><a href="http://www.pashinblog.ru/wp-content/uploads/2010/04/placeholder_howlook.png"><img class="alignnone size-full wp-image-36" title="placeholder_howlook" src="http://www.pashinblog.ru/wp-content/uploads/2010/04/placeholder_howlook.png" alt="" width="400" height="30" /></a></p>
<p>В некоторых ситуациях использование плэйсхолдера может избавить нас от необходимости ставить заголовок у поля формы, как например на картинке выше. В общем очень удобная и полезная штука.</p>
<p>В данный момент атрибут &#171;placeholder&#187; работает только в браузерах на движке Webkit (Google Chrome и Safari), то есть только очень маленький процент юзеров увидит его. А хочется порадовать всех.</p>
<h3>Требования</h3>
<ul>
<li>Плагин должен обрабатывать и текстовые поля (&lt;input type=&#8217;text&#8217;&gt;) и текстовые области (&lt;textarea&gt;)</li>
<li>Для браузеров на движке Webkit оставлять их реализацию</li>
<li>При отправке формы плэйсхолдеры должны убираться(несмотря на очевидность, в большинстве аналогичных плагинов это не сделано :)</li>
<li>Плагин должен быть кроссбраузерным, т.е. под все браузеры, в которых вообще работает jQuery.</li>
<li>Плагин должен быть удобным (подключил — юзай)</li>
</ul>
<h3>Реализация</h3>
<p>Основой всего в этом плагине для нас будет, так называемый, «Has Attribute» селектор (<a href="http://api.jquery.com/has-attribute-selector/" target="_blank">мануал</a>). Сначала была мысль выбрать все элементы, у которых есть атрибут &#171;placeholder&#187;, и для каждого вешать нужные обработчики. Но в ходе тестирования стало понятно, что для текстовых полей будет одна обработка, а для текстовых областей другая, поэтому я решил сначала выбирать по селектору input[placeholder] и потом по textarea[placeholder].</p>
<p>Начнём с &#171;каркаса&#187;. Сделан выход, если браузер на Webkit, создаётся нужный для работы класс (#a9a9a9 &#8212; цвет &#171;родного&#187; Webkit&#8217;овского плэйсхолдера)</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">browser</span>.<span style="color: #660066;">safari</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// Webkit has own placeholder, so we are free</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&amp;lt;style&amp;gt;'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.jqueryPlaceholder{color:#a9a9a9!important;}'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">appendTo</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'head'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// Create placeholder class</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input[placeholder]'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//Processing placeholders for input.texts</span>
		<span style="color: #006600; font-style: italic;">// ...</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'textarea[placeholder]'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//Processing placeholders for textareas</span>
		<span style="color: #006600; font-style: italic;">// ...</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Затем ставим полям значения, которые у нас стоят в атрибуте &#171;placeholder&#187;, и вешаем наш созданный класс. Тут я наткнулся на забавный баг, когда тестировал плагин в Firefox&#8217;е. Он заключался в том, что если написать что-нибудь в поле, то  после обновления окна, плейсхолдер не появлялся (как и должно быть), а вот класс снова навешивался. После скрупулезного дебага выяснилось, что Огнелис при обновлении окна не очищает форму. Это, в принципе, удобно, но в данном случае было нам вредно. Для исправления проблемы я просто добавил ещё одно условие.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span> <span style="color: #339933;">||</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'placeholder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// (Mozzi refresh fix)</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'jqueryPlaceholder'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'placeholder'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Дальше, всё просто и очевидно. Вешаем обработчики событий focus и blur на наши элементы.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #000066;">focus</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'placeholder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>
			.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'jqueryPlaceholder'</span><span style="color: #009900;">&#41;</span>
			.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #000066;">blur</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>
			.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'jqueryPlaceholder'</span><span style="color: #009900;">&#41;</span>
			.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'placeholder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Для текстовых областей всё аналогично, за исключением того, что вместо $(this).val() мы используем this.value, по причине что в первом случае в некоторых браузерах странно определяется содержимое. Ну и заодно немного разгружаем жквери. :)</p>
<p>Базовый функционал плагина сделан, всё работает, но не очищаются поля при сабмите. Сделаем и это. Для этого находим все формы на странице (так как их обычно немного, не будем устраивать гонки за скоростью), и вешаем на их сабмит обработчик. Он будет искать все текстовые поля и области и проверять, не стоит ли в них текст плэйсхолдера. Если стоит — очищаем.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'form'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//Processing &quot;clear on submit&quot;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">submit</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'placeholder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;textarea&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'placeholder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Теперь тестируем весь плагин на нашей <a href="http://www.pashinblog.ru/sandbox/placeholder/">демке</a>. Убеждаемся, что всё хорошо во всех браузерах, и со спокойной душой скачиваем <a href="http://www.pashinblog.ru/wp-content/uploads/2011/09/jquery.placeholder.min_.js">сжатый исходник</a> (ну или <a href="http://www.pashinblog.ru/wp-content/uploads/2011/09/jquery.placeholder.js">полный</a>, если хочется поразбираться). Не забывайте, что для работы нужен <a href="http://www.pashinblog.ru/wp-content/uploads/2010/04/jquery-1.4.1.min_.js">jQuery</a>.</p>
<h3>Outro</h3>
<p>Надеюсь вам пригодится этот плагин. Любые багрепорты, пожелания или вопросы можете оставлять в комментариях, или присылать на <a href="mailto:me@pashinblog.ru">me@pashinblog.ru</a>.</p>
<p>Спасибо за внимание.</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/coding/placeholder/","Кроссбраузерный placeholder")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/coding/placeholder/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Сборщик багов</title>
		<link>http://pashinblog.ru/root/bugs/</link>
		<comments>http://pashinblog.ru/root/bugs/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 22:17:35 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[root]]></category>
		<category><![CDATA[Общее]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/root/sborshhik-bagov/</guid>
		<description><![CDATA[Hello, there. Так как я пока осваиваюсь в Вордпрессе, и могу где нибудь накосячить, прошу вас писать о обнаруженных багах в комментах к этому посту. Постепенно буду делать свою тему на дизайне, который нарисовал мой друг и коллега tetzkatlipoka. До встречи :)]]></description>
			<content:encoded><![CDATA[<p>Hello, there.<br />
Так как я пока осваиваюсь в Вордпрессе, и могу где нибудь накосячить, прошу вас писать о обнаруженных багах в комментах к этому посту.<br />
Постепенно буду делать свою тему на дизайне, который нарисовал мой друг и коллега <a href="http://tetzkatlipoka.livejournal.com/" target="_blank">tetzkatlipoka</a>.<br />
До встречи :)</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/root/bugs/","Сборщик багов")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/root/bugs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Первый пост</title>
		<link>http://pashinblog.ru/root/first-post/</link>
		<comments>http://pashinblog.ru/root/first-post/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 16:29:12 +0000</pubDate>
		<dc:creator>Павел</dc:creator>
				<category><![CDATA[root]]></category>
		<category><![CDATA[Общее]]></category>

		<guid isPermaLink="false">http://www.pashinblog.ru/?p=4</guid>
		<description><![CDATA[Он трудный самый&#8230; :) Привет, мир!]]></description>
			<content:encoded><![CDATA[<p>Он трудный самый&#8230; :) Привет, мир!</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://pashinblog.ru/root/first-post/","Первый пост")</script>]]></content:encoded>
			<wfw:commentRss>http://pashinblog.ru/root/first-post/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using memcached
Database Caching using memcached
Object Caching 704/818 objects using memcached

Served from: pashinblog.ru @ 2012-02-13 04:20:37 -->

