<?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>Seleckis.lv :: журнал Никиты Селецкого &#187; JavaScript</title>
	<atom:link href="http://seleckis.lv/category/journal/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://seleckis.lv</link>
	<description></description>
	<lastBuildDate>Tue, 08 Feb 2011 13:52:50 +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>Min-width и max-width в IE6 с помощью expression</title>
		<link>http://seleckis.lv/journal/browsers/min-width-i-max-width-v-ie6-s-pomoschyu-expression</link>
		<comments>http://seleckis.lv/journal/browsers/min-width-i-max-width-v-ie6-s-pomoschyu-expression#comments</comments>
		<pubDate>Thu, 06 Aug 2009 08:52:17 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Брaузеры]]></category>

		<guid isPermaLink="false">http://seleckis.lv/?p=1690</guid>
		<description><![CDATA[Уже писали много раз, просто приведу свой код.
В JavaScript-файле размещаем такую функцию:

function width(min,max){
	w = document.documentElement.clientWidth;
	return (w = max) ? max + "px" : "auto");
}

Функция всего лишь принимает значения максимальной и минимальной ширины, проверяет текущую ширину документа и возвращает значение:

Если ширина документа меньше минимальной ширины, то возвращается минимальная ширина;
Если ширина документа больше максимальной ширины, то возвращается [...]]]></description>
			<content:encoded><![CDATA[<p>Уже писали много раз, просто приведу свой код.</p>
<p>В JavaScript-файле размещаем такую функцию:</p>
<pre lang="javascript">
function width(min,max){
	w = document.documentElement.clientWidth;
	return (w <= min) ? min + "px" : ((w >= max) ? max + "px" : "auto");
}
</pre>
<p>Функция всего лишь принимает значения максимальной и минимальной ширины, проверяет текущую ширину документа и возвращает значение:</p>
<ol>
<li>Если ширина документа меньше минимальной ширины, то возвращается минимальная ширина;</li>
<li>Если ширина документа больше максимальной ширины, то возвращается максимальная ширина;</li>
<li>Иначе ширина указывается автоматическая.</li>
</ol>
<p>Функция из CSS вызывается следующим образом:</p>
<pre lang="css">
div {
    width: expression(width(600,1000));

    /* далее для нормальных браузеров */
    min-width: 600px;
    max-width: 1000px;
}
</pre>
<p>600 и 1000 — минимальная и максимальная ширина. Поскольку expression работает только для IE, а min-width и max-width уже работают в IE7 и IE8, то этот CSS нужно изолировать и вынести в отдельный css-файл и подключить его с помощью условных комментариев, либо воспользоваться хакками, поскольку чтобы изменить значение придётся лезть в два файла, а не в один. Ну это уже как кому удобнее.</p>
<p><a href='http://seleckis.lv/wp-content/uploads/2009/08/min-max-width.zip'>Скачайте пример</a> и убедитесь, что всё работает.</p>
<p>Минимальную ширину в IE 6 можно эмулировать с помощью приёма, в котором указывается правый border для контейнера шириной в необходимую минимальную ширину элемента, а элементу задаётся правый отрицательный margin равный той же минимальной ширине. При этом внутренний элемент должен быть либо плавающим (float), либо inline-block. В общем не читайте и не внимайте в эти последние предложения, а просто посмотрите <a href="http://www.cssplay.co.uk/boxes/width.html">пример на cssplay.co.uk</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/browsers/min-width-i-max-width-v-ie6-s-pomoschyu-expression/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ещё один PNG Fix для IE6</title>
		<link>http://seleckis.lv/journal/javascript/eshe-odi-png-fix-dlya-ie6</link>
		<comments>http://seleckis.lv/journal/javascript/eshe-odi-png-fix-dlya-ie6#comments</comments>
		<pubDate>Fri, 28 Nov 2008 12:56:41 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://seleckis.lv/?p=1447</guid>
		<description><![CDATA[Разработчики из Unit Interactive написали новый скрипт заставляющий IE6 адекватно отображать полупрозрачные PNG‑картинки — Unit PNG Fix.
Главные преимущества скрипта:

Очень компактный JavaScript: меньше 1 Kb!
Исправляет большинство проблем интерактивности вызванных использованием IE-фильтров.
Работает и для &#60;img&#62; и для CSS-свойства «background».
Запускается автоматически. Не нужно определять классы или вызывать функции.
Работает и для элементов со значением auto для свойств width и height.

Установка [...]]]></description>
			<content:encoded><![CDATA[<p>Разработчики из <a href="http://unitinteractive.com/labs">Unit Interactive</a> написали новый скрипт заставляющий IE6 адекватно отображать полупрозрачные PNG‑картинки — <a href="http://unitinteractive.com/labs/unitpngfix.php">Unit PNG Fix</a>.</p>
<h3>Главные преимущества скрипта:</h3>
<ul>
<li>Очень компактный JavaScript: меньше 1 Kb!</li>
<li>Исправляет большинство проблем интерактивности вызванных использованием IE-фильтров.</li>
<li>Работает и для &lt;img&gt; и для CSS-свойства «background».</li>
<li>Запускается автоматически. Не нужно определять классы или вызывать функции.</li>
<li>Работает и для элементов со значением <em>auto</em> для свойств <em>width</em> и <em>height.</em></li>
</ul>
<p>Установка скрипта:</p>
<ol>
<li><a href="http://labs.unitinteractive.com/unitpngfix.php">Скачиваем</a> это чудо.</li>
<li>Подключаем в &lt;head&gt;:
<pre lang="html4strict">
<!--[if lt IE 7]>
        <script type="text/javascript" src="unitpngfix.js"></script>
<![endif]--></pre>
<p>Естественно путь к файлу сами правите как нужно.</li>
<li>Файл «clear.gif» помещаем в папочку с картинками, а в файле скрипта «unitpngfix.js» исправляете путь к этой картинке (только путь должен быть прямой относительно корня сайта).</li>
</ol>
<p>Небольшие примечания:</p>
<ol>
<li>Unit PNG Fix проверяет наличие CSS-свойства «background-repeat» и если оно используется, то в IE6 картинка растягивается, чтобы заполнить всю площадь элемента. Чушь конечно, но это единственный вариант выхода из ситуации, когда IE6 напрочь игнорирует это свойство.</li>
<li>А так же, нет возможности изменить позицию фона в элементе. Стало быть техника CSS работать не будет. Ну и не надо, для таких вещей на сайтах с требованиями высокой производительности используйте <a href="http://webo.in/articles/habrahabr/46-cross-browser-data-url/">data:URI в связке с MHTML</a>.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/javascript/eshe-odi-png-fix-dlya-ie6/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Публичная порка JS-гуру</title>
		<link>http://seleckis.lv/journal/fun/publichnaya-porka-js-guru</link>
		<comments>http://seleckis.lv/journal/fun/publichnaya-porka-js-guru#comments</comments>
		<pubDate>Mon, 09 Jun 2008 13:09:32 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Развлекуха]]></category>

		<guid isPermaLink="false">http://seleckis.lv/journal/fun/publichnaya-porka-js-guru</guid>
		<description><![CDATA[Конкурс закончился и работы проверены. Работы прислали 11 программистов, из которых один участник прислал аж 8 вариантов.
На удивление решения задачи оказались очень разные. Многие писали обработчики событий обычным способом, но некоторые всё-таки рекомендуемым AddEventListener/AttachEvent. Поразило разнообразие способов проверки на пробелы и наличие классов. 
В принципе, поскольку сама задача была решена практически всеми, то нет смысла [...]]]></description>
			<content:encoded><![CDATA[<p>Конкурс закончился и работы проверены. Работы прислали 11 программистов, из которых один участник прислал аж 8 вариантов.</p>
<p>На удивление решения задачи оказались очень разные. Многие писали обработчики событий обычным способом, но некоторые всё-таки рекомендуемым AddEventListener/AttachEvent. Поразило разнообразие способов проверки на пробелы и наличие классов. </p>
<p>В принципе, поскольку сама задача была решена практически всеми, то нет смысла опираться на эти результаты при подведении итогов. Поэтому, я буду придираться не только к самой задаче, но и к стилю программирования.</p>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/said-ali.zip' title=''> Said</a></h3>
<p>Эффективное решение с помощью цикла проверить все поля и свойства объекта inputData перед выводом. А, ведь действительно, поля могут быть заполнены не только вручную, но и скриптом.</p>
<p>Хорошее решение вынести все тримы в отдельные функции и использовать их как в PHP. Правда, на мой взгляд такие вещи должны прописываться как прототипы.</p>
<p>Нехороший повтор AddEventListener/AttachEvent. Можно было объединить.</p>
<p>Неправильное изменение элемента. Класс должен добавляться, а не заменяться.</p>
<p>Не могу понять эту конструкцию. </p>
<pre lang="javascript">
if (typeof(e.target) == 'text') e.target.className = 'edit';
</pre>
<p>Разве typeof(e.target) должен возвращать text? По-моему он возвращает object. Соответственно эта часть не работает в Firefox. Видимо автор скрипта хотел проверить тип элемента формы. Правильно было бы написать так:</p>
<pre lang="javascript">
if (typeof(e.target) != 'undefined' &#038;&#038; e.target.type == 'text') e.target.className += ' edit';
</pre>
<p>Правильно, добавил проверку существования свойства объекта inputData, на тот случай если в форму добавили поле ввода, а свойство в inputData не добавили. </p>
<pre lang="javascript">
if (!!inputData[el.name] || inputData[el.name] == '') inputData[el.name] = el.value;
</pre>
<p>Только для чего написаны два восклицательных знака? Ведь в конструкции if такие вещи в любом случае конвертируются в Boolean.</p>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/sergiusd.zip' title=''>SergiusD</a></h3>
<p>Хорошая работа с массивами.</p>
<p>Есть проверка существования класса error.</p>
<p>Извращение:</p>
<pre lang="javascript">
arr[ind] = null;
</pre>
<p>Для таких вещей есть функция splice.</p>
<p>Неоправданное решение относительно поиска в className, путём создания прототипа indexOf. Даже если использовать этот вариант, то лучше было бы разбивать строку в массив уже в indexOf. А возвращать и проверять в этом случае правильнее не -1 и ещё какое-то число, а true и false.</p>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/andrej.zip' title=''>Андрей</a></h3>
<p>Сделано не совсем универсально. При убирании фокуса возвращается первоначальный класс как первый. А если их там несколько?</p>
<p>Примитивный и неоптимизированный вывод данных в showAll. Гораздо лучше можно было бы сделать и не использовать лишние переменные.</p>
<p>Такие вещи нужно объединять в единое регулярное выражение:</p>
<pre lang="javascript">
.replace(/^\s/, '')
.replace(/\s$/, '')
</pre>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/nikolaj.zip' title=''>Николай</a></h3>
<p>Хороший вариант обращения к объектам по id или напрямую. Любят такие вещи во фреймворках.</p>
<pre lang="javascript">
var $ = function(id) {
    return typeof id == 'string' ? document.getElementById(id) : id;
};
</pre>
<p>Смысла особого нет в том, чтобы обращаться к объекту не на прямую, а через $, но ради единообразия&#8230;</p>
<p>Изящный вариант проверки существования класса:</p>
<pre lang="javascript">
return !!el.className.match(new RegExp('(^|\\s)' + className + '(\\s|$)'));
</pre>
<p>Мусор в цикле:</p>
<pre lang="javascript">
l = inputs.length; i < l
</pre>
<p>Это зачем?</p>
<pre lang="javascript">
})(inputs[i]);
</pre>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/igor-istochnik.zip' title=''>Игорь Источник</a></h3>
<p>Параноидально концептуальный подход. Годен для больших проектов. В пору писать свой фреймворк.</p>
<p>Хорошая прописка прототипов, особенно ifEmpty.</p>
<p>В конце вывода лишний перенос строки.</p>
<p>Если удалить текст, то поле становится красным. Если дать ему фокус, то класс будет: read error edit.</p>
<pre lang="javascript">
element.className = element.className + " "  + className;
</pre>
<p>для таких вещей есть оператор «+=»:</p>
<pre lang="javascript">
element.className += " "  + className;
</pre>
<p>Тяжеловатый для восприятия стиль.</p>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/fx-poster.zip' title=''>FX Poster</a></h3>
<p>Да, с классами лучше всего работать как с масивом, а не как со строкой. Правильно. </p>
<p>С пробелами так работать нельзя:</p>
<pre lang="javascript">
this.value = this.value.replace(/^ +| +$/g, '').replace(/ +/g, ' ');
</pre>
<p>Нужно искать пробельный символ а не пробел.</p>
<p>Зачем столько строгих проверок (===, !==)?</p>
<p>В конце вывода будет лишний перенос строки.</p>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/artem-gluvchynskyj.zip' title=''>Артём Глувчинский</a></h3>
<p>Тоже хороший вариант проверки существования класса</p>
<pre lang="javascript">
if (this.className.indexOf(errorClass) >= 0)
</pre>
<p>В задании сказано «очистить содержимое поля от лишних пробелов». Значение поля очистил, но не заменил содержимое на очищенное значение.</p>
<p>В функции getResults после вывода сообщения об ошибке можно просто написать return а не return false?</p>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/artyom-makarov.zip' title=''>Артём Макаров</a></h3>
<p>Не убирается последний пробел в поле ввода.</p>
<p>В регулярном выражении указан пробел, а не пробельный символ.</p>
<p>Некрасивая обработка классов удалением слов и пробелов.</p>
<p>Хитро:</p>
<pre lang="javascript">
response += (response.length ? "\n" : '') + v + " = " + inputData[v];
</pre>
<p>но запись в массив и объединение с помощью метода join() — умнее.</p>
<p>Плюс в том, что когда необходимо быстро написать код, такое последовательное решение наиболее удобно в восприятии.</p>
<h3><a href='http://seleckis.lv/wp-content/uploads/2008/06/dmytro-shteflyuk.zip' title=''>Dmytro-Shteflyuk</a></h3>
<p>Чем больше щёлкаешь по полю, стираешь и вписываешь текст в поле, тем больше пробелов у поля ввода между read и edit.</p>
<p>Чем такой вариант:</p>
<pre lang="javascript">
results.push(name);
results.push('=');
results.push(inputData[name]);
results.push("\n");
</pre>
<p>лучше чем</p>
<pre lang="javascript">
results.push(name + '=' + inputData[name] + '\n');
</pre>
<p>?<br />
Преимуществ не вижу. Опять же в конце будет лишний перенос строки.</p>
<h3>Алик Кириллович</h3>
<p>Победитель, который не только правильно выполнил задание, но также исследовал поимку событий в случае динамического добавления полей, а так же переноса введённых данных из одного поля в другое (drag&#038;drop). Гостевой пост от победителя, в котором раскроются все секреты исследования ожидается в ближайшее время.</p>
<h3>И последнее</h3>
<p>Господа программисты, я задолбался конвертировать эти каракули:<br />
<code><br />
Ýòà ôóíêöèÿ óñòàíàâëèâàåò îáðàáîò÷èê fncAction ñîáûòèÿ txtType äëÿ óçëà, óäîâëåòâîðÿþùåãî óñëîâèþ fncCondition.<br />
</code><br />
Выучите наизусть, раз и на всегда!</p>
<p style="font-size: 100px; text-align: center">UTF-8</p>
<p>Я очень рад, что мои читатели откликнулись на предложение и приняли участие в конкурсе, но я никак не думал, что их будет так много! Проверять одному достаточно сложно, поскольку со временем глаз замыливается и можно пропустить очевидные ошибки, а в других работах они могут броситься в глаза. Нужно было бы собрать целую комиссию для объективной оценки работ. Поэтому прошу быть снисходительными к результатам конкурса. Думаю, что мои замечания для вас будут только полезными и не вызовут агрессивного настроя: «Ууу, докопался!»</p>
<p>Спасибо всем за участие!</p>
<p><a href='http://seleckis.lv/wp-content/uploads/2008/06/js-guru-konkurs.zip' title=''>Все работы в одном архиве</a></p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/fun/publichnaya-porka-js-guru/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Конкурс для javascript-гуру!</title>
		<link>http://seleckis.lv/journal/fun/konkurs-dlya-javascript-guru</link>
		<comments>http://seleckis.lv/journal/fun/konkurs-dlya-javascript-guru#comments</comments>
		<pubDate>Sat, 17 May 2008 20:30:14 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Развлекуха]]></category>

		<guid isPermaLink="false">http://seleckis.lv/journal/fun/konkurs-dlya-javascript-guru</guid>
		<description><![CDATA[Объявляю конкурс среди javascript-программистов!
В качестве конкурсной задачи предлагаю выполнить зачётное задание по javascript, которое выполняли в этом году студенты web-курсов на которых я преподаю.
Итак, задание:
Дана форма. Нужно:

При щелчке по лейблу и при помещении фокуса в поле нужно полю добавить класс «edit».
При убирании фокуса из поля нужно:

очистить содержимое поля от лишних пробелов слева и справа и [...]]]></description>
			<content:encoded><![CDATA[<p>Объявляю конкурс среди javascript-программистов!</p>
<p>В качестве конкурсной задачи предлагаю выполнить зачётное задание по javascript, которое выполняли в этом году студенты web-курсов на которых я преподаю.</p>
<p>Итак, задание:</p>
<p><a href='http://seleckis.lv/wp-content/uploads/2008/05/2008-exam-js-blog.zip' title=''>Дана форма</a>. Нужно:</p>
<ol>
<li>При щелчке по лейблу и при помещении фокуса в поле нужно полю добавить класс «edit».</li>
<li>При убирании фокуса из поля нужно:
<ol>
<li>очистить содержимое поля от лишних пробелов слева и справа и от дублированных пробелов;</li>
<li>записать содержимое поля в одноимённое свойство объекта inputData;</li>
<li>проверить:
<ol>
<li>если содержимое поля пустое, то нужно убрать класс «edit» и добавить класс «error»,</li>
<li>иначе — вернуть первоначальный класс.</li>
</ol>
</li>
</ol>
</li>
<li>При щелчке по кнопке «Show All» проверить, нет ли пустых свойств у объекта inputData.
<ol>
<li>Если есть — открыть окно «alert» с сообщением: «Please fill all fields!»,</li>
<li>иначе — записать содержимое объекта inputData в переменную и вывести в окно «alert» в таком виде:<br />
firstname = Vasily<br />
lastname = Pupkoff.</li>
</ol>
</li>
</ol>
<p>Задание достаточно простое. Проблем, думаю не будет, однако нужно соблюсти следующие условия:</p>
<ol>
<li>Кроссбраузерность.</li>
<li>Универсальность — должно быть применимо ко всем текстовым полям ввода (type=&#8221;text&#8221;). Даже если я захочу добавить ещё несколько полей и соответствующие свойства объекта inputData, скрипт должен работать и для них.</li>
<li>Не использовать фреймворки и библиотеки javascript.</li>
<li>Код должен быть только в файле script.js, ни html, ни css редактировать нельзя.</li>
</ol>
<h4>Конкурс закончился. Работы проверяются.</h4>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/fun/konkurs-dlya-javascript-guru/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Градиентный текст с помощью CSS</title>
		<link>http://seleckis.lv/journal/world-creative/gradientnyiy-tekst-s-pomoschyu-css</link>
		<comments>http://seleckis.lv/journal/world-creative/gradientnyiy-tekst-s-pomoschyu-css#comments</comments>
		<pubDate>Fri, 18 Jan 2008 20:32:07 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Веб‑дизайн]]></category>
		<category><![CDATA[Мировой креатив]]></category>

		<guid isPermaLink="false">http://www.seleckis.lv/journal/gradientnyiy-tekst-s-pomoschyu-css</guid>
		<description><![CDATA[Иногда бывают дни, когда не хватает времени, иногда бывают моменты, когда не хочется ничего выдумывать. Тогда приходят спасительный копи-пэйст!
В этом посте я не буду ничего исследовать, придумывать, обучать и выбирать. Просто поделюсь с вами ссылкой на замечательный пост  дизайнера Nick La. Nick получит на свой пост очередной трекбек, а расслаблюсь ещё на пару дней.
Итак, [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда бывают дни, когда не хватает времени, иногда бывают моменты, когда не хочется ничего выдумывать. Тогда приходят спасительный <strong>копи-пэйст</strong>!</p>
<p>В этом посте я не буду ничего исследовать, придумывать, обучать и выбирать. Просто поделюсь с вами <a href="http://www.webdesignerwall.com/tutorials/css-gradient-text-effect/">ссылкой на замечательный пост  дизайнера Nick La</a>. Nick получит на свой пост очередной трекбек, а расслаблюсь ещё на пару дней.</p>
<p>Итак, если вы хотите создать градиентный заголовок не заморациваясь с картинками в Photoshop, вам поможет очень простой CSS трюк использующий картинку в формате PNG (никаких Javascript или Flash, только чистый CSS). Всё что вам нужно — это пустой тэг &lt;span&gt; в заголовочном тэге, который будет накладываться на буквы с помощью свойства position:absolute.Тестировано на Firefox, Safari, Opera, и даже на Internet Explorer 6.</p>
<p>Пример:</p>
<style type="text/css"> h1 {  text-align: center; font: bold 330%/100% "Lucida Grande";   position: relative;   color: #464646; } h1 span {   background: url(http://www.seleckis.lv/wp-content/uploads/2008/01/gradient-white.png) repeat-x;   position: absolute;   display: block;   width: 100%;   height: 31px; } </style>
<p><!--[if lt IE 7]></p>
<style type="text/css"> h1 span {   background: none;  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\\'http://www.seleckis.lv/wp-content/uploads/2008/01/gradient-white.png\\', sizingMethod=\\'scale\\'); }</style>
<p><![endif]--></p>
<h1><span></span>ГРАДИЕНТ С ПОМОЩЬЮ CSS</h1>
<h3> Как же это работает?</h3>
<p>А очень просто. Рисуем в фотошопе градиент, в высоту шрифта и ширину 1-го пикселя, причём базовый цвет должен быть такой же как и фон у страницы, вверху прозрачность можно варьировать по своему усмотрению, внизу — полная прозрачность. С помощью CSS эта картинка множится по горизонтали и закрывает весь текст. А наложение происходит уже знакомым <a href="http://www.seleckis.lv/journal/css/metod-pixy">вам методом</a>, правда тэг &lt;span&gt; здесь должен уже писаться перед текстом, но это дело верстальщика — можно сделать и по-другому. Главное — идея:</p>
<p style="text-align: center"><img src="http://www.seleckis.lv/wp-content/uploads/2008/01/screen1.gif" /></p>
<h3>HTML</h3>
<p><code>&lt;h1&gt;&lt;span&gt;&lt;/span&gt;CSS Gradient Text&lt;/h1&gt;</code></p>
<h3> CSS</h3>
<pre lang="css">
h1 {
    font: bold 330%/100% "Lucida Grande";
    position: relative;
    color: #464646;
}
h1 span {
    background: url(gradient.png) repeat-x;
    position: absolute;
    display: block;
    width: 100%;
    height: 31px;
}</pre>
<p>Ну и поправка к Internet Explorer 6.<br />
<code>&lt;!--[if lt IE 7]&gt;<br />
&lt;style type="text/css"&gt;<br />
h1 span {<br />
background: none;<br />
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='gradient.png', sizingMethod='scale');<br />
}<br />
&lt;/style&gt;<br />
&lt;![endif]--&gt;</code><br />
Автор так же предлагает маньякам валидности использовать jquery функцию для вставки тэга &lt;span&gt; в заголовок.</p>
<pre lang="javascript">
$(document).ready(function(){
    $("h1").prepend("<span></span>");
});</pre>
<p><a href="http://www.webdesignerwall.com/demo/css-gradient-text/">Смотрите что ещё можно сделать</a></p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/world-creative/gradientnyiy-tekst-s-pomoschyu-css/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Иерархический список с помощью jQuery</title>
		<link>http://seleckis.lv/journal/css/ierarhicheskiy-spisok-s-pomoschyu-jquery</link>
		<comments>http://seleckis.lv/journal/css/ierarhicheskiy-spisok-s-pomoschyu-jquery#comments</comments>
		<pubDate>Wed, 02 Jan 2008 13:12:06 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.seleckis.lv/journal/css/ierarhicheskiy-spisok-s-pomoschyu-jquery</guid>
		<description><![CDATA[Написал очень простой и функциональный скрипт организации иерархического списка. Но смысл заключается не только в скрипте, но и в правильной вёрстке.
HTML
Вот из такого небольшого обычного списка мы сделаем раскрывающийся иерархический список.


Модель статусных групп (классов) Л. Уорнера

Высший класс

Верхний-высший класс, включал так называемые старые семьи.
Низший-высший класс, не включал старые родовые семьи.


Средний класс

Верхний-средний класс состоял из собственников и [...]]]></description>
			<content:encoded><![CDATA[<p>Написал очень простой и функциональный скрипт организации иерархического списка. Но смысл заключается не только в скрипте, но и в правильной вёрстке.</p>
<h3>HTML</h3>
<p>Вот из такого небольшого обычного списка мы сделаем раскрывающийся иерархический список.</p>
<pre lang="html4strict">
<ul class="ns_hierarchy">
<li>Модель статусных групп (классов) Л. Уорнера
<ul>
<li>Высший класс
<ul>
<li>Верхний-высший класс, включал так называемые старые семьи.</li>
<li>Низший-высший класс, не включал старые родовые семьи.</li>
</ul>
</li>
<li>Средний класс
<ul>
<li>Верхний-средний класс состоял из собственников и профессионалов.</li>
<li>Нижний-средний класс составляли низшие служащие, приказчики, клерки.</li>
</ul>
</li>
<li>Низший класс
<ul>
<li>Верхний-низший класс включал рабочих.</li>
<li>Нижний-низший класс &mdash; &laquo;социальное дно&raquo;.</li>
</ul>
</li>
</ul>
</li>
</ul>
</pre>
<p>Получится следующее:</p>
<ul class="ns_hierarchy">
<li>Модель статусных групп (классов) Л. Уорнера
<ul>
<li>Высший класс
<ul>
<li>Верхний-высший класс, включал так называемые старые семьи.</li>
<li>Низший-высший класс, не включал старые родовые семьи.</li>
</ul>
</li>
<li>Средний класс
<ul>
<li>Верхний-средний класс состоял из собственников и профессионалов.</li>
<li>Нижний-средний класс составляли низшие служащие, приказчики, клерки.</li>
</ul>
</li>
<li>Низший класс
<ul>
<li>Верхний-низший класс включал рабочих.</li>
<li>Нижний-низший класс &mdash; &laquo;социальное дно&raquo;.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Как видите, код лаконичный и логичный.</p>
<h3>Что нужно сделать?</h3>
<ul>
<li>Каждому элементу списка, который имеет внутренний список, с помощью JS добавим тэг &lt;span&gt;, который будет являться кнопкой раскрытия или закрытия списка. Эта кнопка будет текстовой, но нам бы хотелось, чтоб была возможность отображать её и графически. Поэтому для удобства, внутри поместим ещё один тэг, который будет содержать картинку, которую и наложим на текстовое отображение кнопки.</li>
<li>Скроем все внутренние списки, пропишем начальные классы.</li>
<li>Каждой кнопке напишем событие onclick, по которому будем изменять класс у элемента списка, и скрывать или показывать внутренний список</li>
</ul>
<h3>CSS</h3>
<pre lang="css">
ul.ns_hierarchy li{ /* Чтобы не было сдвига элементов списка из-за кнопки раскрытия/закрытия */
	clear: both;
}
ul.ns_hierarchy, ul.ns_hierarchy ul{
	list-style-type: none; /* Убираем маркер */
	margin: 0;
	padding-left: 0px;
}
/* наводим красоту */
ul.ns_hierarchy{
	padding-left: 18px;
}
ul.ns_hierarchy ul{
	padding-left: 22px;
}
li.nsh_closed span, li.nsh_opened span{ // тэг span, на который будем жать
	float: left;
	position: relative;
	width: 9px;
	height: 9px;
	margin: 6px 6px 0 -18px;
	cursor: pointer;
	overflow: hidden;
	font: normal 0.8em/0.8em sans-serif;
}
li.nsh_closed span em, li.nsh_opened span em{ // тэг em в тэгу span, который будет содержать картинку
	position: absolute;
	width: 9px;
	height: 9px;
	top: 0;
	left: 0;
	background: url(plus-min.gif) no-repeat;
}
li.nsh_closed span em{
	background-position: bottom;
}
</pre>
<p>Подготовительные работы провели, теперь за дело</p>
<h3>jQuery</h3>
<p>Не забываем подключить два файла: jquery библиотеку и наш скрипт</p>
<p>А скрипт будет такой:</p>
<pre lang="javascript">
$(document).ready(function() //загрузив документ,
{
	// добавляем тэг <em>span</em> с плюсиком и тэгом <em>em</em> во все элементы списка,
	// которые содержат внутренние списки
	$("ul.ns_hierarchy li:has(ul)").prepend("<span>+<em><!----></em></span>");
	$("ul.ns_hierarchy li:has(ul)").addClass("nsh_closed"); // им же добавляем класс по-умолчанию
	$("ul.ns_hierarchy li > ul").hide(); // скрываем все внутренние списки
	// при щелчке по кнопке меняем плюс на минус, или наоборот,
	// а так же скрываем или показываем внутренние списки
	$("ul.ns_hierarchy li > span").click(function()
	{
		if( $(this).parent("li").attr("class") == "nsh_closed" )
		{
			$(this).parent("li").attr("class", "nsh_opened");
			$(this).html("&minus;<em><!----></em>");
			$(this).next("ul").show();
		}
		else if( $(this).parent("li").attr("class") == "nsh_opened" )
		{
			$(this).parent("li").attr("class", "nsh_closed");
			$(this).html("+<em><!----></em>");
			$(this).next("ul").hide();
		}
	});
});
</pre>
<p>Вот и всё.</p>
<p>По желанию можно изменить внешний вид, заменить изображение кнопки, изменить скрипт так, чтобы он не скрывал/показывал списки напрямую, а менял классы, этим можно  добавить возможность прописывания классов перед загрузкой меню, чтобы с самого начала меню уже было открыто.</p>
<p>Скрипт кроссбраузерный, расширяемый, поключаемый, настраиваемый и прочее и прочее&#8230;<br />
Пользуйтесь!</p>
<p><a href='http://www.seleckis.lv/wp-content/themes/seleckis_v2/ns_hierarchy/index.html' title='Посмотреть пример ns_hierarchy'>Посмотреть пример</a></p>
<p><a href='http://www.seleckis.lv/wp-content/uploads/2008/01/ns_hierarchy.zip' title='Скачать исходник ns_hierarchy.zip'>Скачать исходник</a></p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/css/ierarhicheskiy-spisok-s-pomoschyu-jquery/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>JS-Imagemapping — исправленно.</title>
		<link>http://seleckis.lv/journal/javascript/js-imagemapping-ispravlenno</link>
		<comments>http://seleckis.lv/journal/javascript/js-imagemapping-ispravlenno#comments</comments>
		<pubDate>Fri, 07 Dec 2007 10:36:50 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.seleckis.lv/jquery/js-imagemapping-ispravlenno</guid>
		<description><![CDATA[В предыдущем посте я написал как делается активный imagemapping на jQuery.
Но по какой-то непонятной причине мой мозг в один момент глюканул и решил, что указывать абсолютное позиционирование относительно всего документа — единственный вариант. А ведь это не правда.
Исправляем

В CSS добавляем относительное позиционирование тэгу div с id=&#8221;map&#8221;:
#map{ 	position: relative; }
Теперь кружочки будут позиционироваться относительно этого дива, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.seleckis.lv/journal/javascript/aktivnyiy-imagemapping-na-jquery">В предыдущем посте</a> я написал как делается активный imagemapping на jQuery.</p>
<p>Но по какой-то непонятной причине мой мозг в один момент глюканул и решил, что указывать абсолютное позиционирование относительно всего документа — единственный вариант. А ведь это не правда.</p>
<h3>Исправляем</h3>
<ol>
<li>В CSS добавляем относительное позиционирование тэгу div с id=&#8221;map&#8221;:
<pre lang="css">#map{ 	position: relative; }</pre>
<p>Теперь кружочки будут позиционироваться относительно этого дива, а не относительно body.</li>
<li>В коде исправляем позиционирование удалив координаты карты и добавляя кружочки не в body а в #map.
<pre lang="javascript">
function add_numbers(){
	$("area").each(
		function(){
			var id = $(this).attr("href").substring(1);
			var coords = $(this).attr("coords").split(",");
			var max_l = 0, min_l = 9999, max_t = 0, min_t = 9999;
			for(i=0; i<coords.length; i++){
				if(i%2 == 0){
					max_l = (max_l < Number(coords[i]))?Number(coords[i]):max_l;
					min_l = (min_l > Number(coords[i]))?Number(coords[i]):min_l;
				}
				else {
					max_t = (max_t < Number(coords[i]))?Number(coords[i]):max_t;
					min_t = (min_t > Number(coords[i]))?Number(coords[i]):min_t;
				}
			}
			var left = Math.floor((max_l+min_l)/2) - 11;
			var top = Math.floor((max_t+min_t)/2) - 11;
			var div = '
<div class="overblock ' + $(this).attr("class")
			div += '" id="num_' + id + '">' + id.substring(2) + "</div>

"
			$("#map").append(div)
			$("#num_" + id).css({ "left": left, "top": top });
			$("#num_" + id).hover(
				function () {
					add_highlight(id);
				},
				function () {
					remove_highlight(id);
				}
			);
		}
	);
}
</pre>
</li>
<li>Можем удалить $(window).resize и функцию удаления кружочков</li>
</ol>
<p>В итоге, избавляемся от багов в Опере, от необходимости перепроверять позиционирование при изменении размеров окна и можем смело отключить расширение Dimensions.</p>
<p><a href='http://www.seleckis.lv/wp-content/uploads/2007/12/jsmapping.zip' title='jsmapping'>Качаем пример</a></p>
<p>Спасибо <a href="http://www.seleckis.lv/journal/javascript/aktivnyiy-imagemapping-na-jquery#comment-3094">Игорю</a>, что направил на путь истинный.</p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/javascript/js-imagemapping-ispravlenno/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Активный imagemapping на jQuery</title>
		<link>http://seleckis.lv/journal/javascript/aktivnyiy-imagemapping-na-jquery</link>
		<comments>http://seleckis.lv/journal/javascript/aktivnyiy-imagemapping-na-jquery#comments</comments>
		<pubDate>Thu, 06 Dec 2007 15:33:24 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.seleckis.lv/journal/javascript/aktivnyiy-imagemapping-na-jquery</guid>
		<description><![CDATA[Главная проблема стандартного способа создания карт в том, что тэг &#60;area&#62; не поддерживает никаких css свойств, т.е. при наведении курсором на активную область нельзя никак её подсветить. В этом случае Flash выигрывает (пример карты на flash реализован в проекте pludmales9.lv).
Я предлагаю такой вариант: подсвечиваются не сами активные области, а какие-то картинки расположенные по центру активной [...]]]></description>
			<content:encoded><![CDATA[<p>Главная проблема стандартного способа создания карт в том, что тэг &lt;area&gt; не поддерживает никаких css свойств, т.е. при наведении курсором на активную область нельзя никак её подсветить. В этом случае Flash выигрывает (пример карты на flash реализован в проекте <a href="http://pludmales9.lv">pludmales9.lv</a>).</p>
<p>Я предлагаю такой вариант: подсвечиваются не сами активные области, а какие-то картинки расположенные по центру активной области. Это могут быть кружочки, квадратики, и любые другие shape&#8217;ы. Проблема заключается в том, что если мы попробуем получить координаты &lt;area&gt; через offsetLeft и offsetTop, то будут возвращаться координаты всей картинки.</p>
<p>Слегка улучшить положение я предлагаю используя библиотеку <a href="http://jquery.com/">jQuery</a> (на голом JavaScript тоже можно написать, только дольше и больше). С её помощью найду все элементы &lt;area&gt;, узнаю координаты каждого из атрибута coords и найду среднее значение, размещу картинку по центру каждой области и добавлю события onmouseover и onmouseout, чтобы картинка менялась.</p>
<h3>За дело!</h3>
<p>Итак, чтобы сделать активный imagemapping <a href="http://jaunsapni.merapi.lv/plans.php">подобного плана участков</a> средствами javascript нужно:</p>
<ol>
<li>Взять картинку на которой будут размечены активные области;</li>
<li>Разметить области с помощью <a href="http://www.google.com/search?hl=en&amp;q=visual++imagemapper&amp;btnG=Search">визуальных инструментов</a> (если конечно вы не фанат ручной разметки и вам некуда девать своё время)</li>
<li>В итоге получим код такого плана:
<pre lang="html4strict">
<p id="#map">
<img src="images/map.png" alt="My Image Map" usemap="#map0" />
<map name="map0">
<area href="#id1" shape="poly" class="free" coords="240,38,295,38,295,100,365,100,365,144,240,144" />
<area href="#id2" shape="poly" class="sold" coords="364,144,364,287,294,287,294,144" />
<area href="#id3" shape="poly" class="free" coords="364,287,364,400,294,400,294,287" />
 ................................................................................................
</map>
</pre>
<p>Чтобы можно было менять кружочек в зависимости от того, продан ли участок или нет, добавляем каждому href значение #id1, #id2, #id3 и т. д., а class=&#8221;free&#8221; и class=&#8221;sold&#8221; будут указывать на то, продан ли участок или нет.</li>
<li>Рисуем картинки такого плана:<br />
<img src="http://www.seleckis.lv/wp-content/uploads/2007/12/r_free.gif" /> <img src="http://www.seleckis.lv/wp-content/uploads/2007/12/r_bought.gif" /><br />
показывать будем верхнюю половину, а при наведении — вторую.</li>
<li>Для этих кружочков напишем CSS:
<pre lang="css">
.overblock{
	width: 22px; /* это зависит от размера картинки */
	height: 22px; /* высоту ставим в половину меньше */
	position: absolute; /* естественно */
	overflow: hidden; /* фикс бага в IE7, а может надо было line-height маленький поставить */
	cursor: pointer; /* в IE не меняется курсор — исправляем */
	text-align: center;
	font: normal 11px sans-serif;
}
/* эти два класса создаём специально чтобы было удобно указывать, какой участок продан а какой — нет. */
div.free{
	background: url(images/r_free.gif) no-repeat top;
}
div.sold{
	background: url(images/r_bought.gif) no-repeat top;
}
/* добавляем класс, который будет изменять кружочек при наведении на активную область */
div.selected{
	background-position: bottom;
}</pre>
</li>
</ol>
<p>Подготовительные работы закончились, теперь самое интересное</p>
<h3>jQuery</h3>
<p>Для получения точных координат самой карты, нам нужно подключить расширение <a href="http://jquery.com/plugins/project/dimensions">Dimensions</a> (версии 1.1.2). Код, естественно будем писать отдельным файлом чтоб не засорять html.</p>
<h4>1. Сначала напишем функцию <var>add_numbers()</var>, которая каждому элементу &lt;area&gt; добавит кружочек</h4>
<pre lang="javascript">
function add_numbers(){
	$("area").each(
		function(){
			var mappos = {};
			// получаем координаты самой карты, здесь используется функция position расширения Dimensions
			$("#map").position(mappos);
			var id = $(this).attr("href").substring(1); // получаем id активной области обрезая #
			var coords = $(this).attr("coords").split(","); // записываем координаты в массив
			// поскольку координаты в атрибуте coords перечисляются поочерёдно (X1, Y1, X2, Y2...),
			// то нам нужно разделить иксы и игреки
			var max_l = 0, min_l = 9999, max_t = 0, min_t = 9999;
			for(i=0; i<coords.length; i++){
				// делаем это в цикле, распределяя по чётному и нечётному индексу
				if(i%2 == 0){
					// нахождение максимального и минимального числа методом перебора
					max_l = (max_l < Number(coords[i]))?Number(coords[i]):max_l;
					min_l = (min_l > Number(coords[i]))?Number(coords[i]):min_l;
				}
				else {
					max_t = (max_t < Number(coords[i]))?Number(coords[i]):max_t;
					min_t = (min_t > Number(coords[i]))?Number(coords[i]):min_t;
				}
			}
			// создаём переменные отвечающие за координаты кружочка,
			// записываем туда среднее значение координат
			// добавляем координаты самой карты и отнимаем половину размера кружочка
			var left = Math.floor((max_l+min_l)/2) + mappos["left"] - 11;
			var top = Math.floor((max_t+min_t)/2) + mappos["top"] - 11;
			// помещаем кружочек в документ, добавляем класс текущей активной области (free, sold)
			// прописываем id (хотя может это и лишнее) и записываем в кружочек номер участка
			var div = '
<div class="overblock ' + $(this).attr("class")
			var += '" id="num_' + id + '">' + id.substring(2) + "</div>

"
			$("body").append(div)
			$("#num_" + id).css({ "left": left, "top": top }); // прописываем координаты кружочку
			// добавляем события при наведении мышки на кружочек
			$("#num_" + id).hover(
				function () {
					add_highlight(id);
				},
				function () {
					remove_highlight(id);
				}
			);
		}
	);

}</pre>
<h4>2. Дополнительные функции</h4>
<h4> Пишем две очень простые функции добавления подсветки кружочкам</p>
<pre lang="javascript">
function add_highlight(id){
	$("#num_" + id).addClass("selected");
}
function remove_highlight(id){
	$("#num_" + id).removeClass("selected");
}</pre>
</h4>
<h4>Запуск документа. Добавление событий каждому &lt;area&gt;</h4>
<pre lang="javascript">
$(document).ready(
	function() {
		add_numbers(); // запускаем описанную выше функцию
		// каждому area добавляем событие rollover'а в котором добавляем подсветку кружочку
		// при наведении на всю область, а не только на кружочек
		$("area").hover(
			function () {
				var id = $(this).attr("href").substring(1);
				add_highlight(id);
			},
			function () {
				var id = $(this).attr("href").substring(1);
				remove_highlight(id);
			}
		);
	}
)</pre>
<p>Как видите, пришлось продублировать подсветку кружочка, при наведении на область и при наведении на сам кружочек.</p>
<h4>Изменение размеров окна</h4>
<p>Если у нас центрированная фиксированная вёрстка, то при изменении размеров окна кружочки сдвигаются. Чтобы этого не было, придётся дописать одну функцию удаляющую все кружочки, а так же написать событие resize в котором запустим функцию удаления кружочков и добавления их заново. Конечно это форменное читерство, но мне было лень переписывать получение координат &lt;area&gt; и добавление координат кружочкам в отдельную функцию. Поэтому я сделал так:</p>
<pre lang="javascript">
// функция удаления кружочков
function remove_numbers(){
	$("div[class*='overblock']").each(
		function() {
			$(this).remove();
		}
	);
}
// при изменении размеров окна удаляем и добавляем кружочки заново
$(window).resize(function(){
	remove_numbers();
	add_numbers();
});</pre>
<h3>Минусы</h3>
<ul>
<li>При изменении размеров окна передобавление кружочков тормозит в IE.</li>
<li>Подсвечивается не вся область, а только кружочки</li>
</ul>
<p>Функциональность можно расширить, например добавить подсветку данных в таблице, это сделано на <a href="http://jaunsapni.merapi.lv/plans.php">Jaunsapņi</a>.</p>
<p><a href="http://www.cssplay.co.uk/menu/old_master.html">Альтернативный вариант imagemapping&#8217;а предлагает CSSPlay</a>, сделать карту с помощью CSS, но там все координаты пишутся вручную и области могут быть только прямоугольными.</p>
<p>Исправляем и упрощаем <a href="http://www.seleckis.lv/journal/javascript/js-imagemapping-ispravlenno">в следующем посте.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/javascript/aktivnyiy-imagemapping-na-jquery/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Всплывающая подсказка v.2</title>
		<link>http://seleckis.lv/journal/javascript/vsplyvayushhaya-podskazka-v2</link>
		<comments>http://seleckis.lv/journal/javascript/vsplyvayushhaya-podskazka-v2#comments</comments>
		<pubDate>Mon, 17 Sep 2007 13:34:22 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.seleckis.lv/journal/javascript/vsplyvayushhaya-podskazka-v2</guid>
		<description><![CDATA[Вспоминаем мой давний пост про плавающую над объектами подсказку.
Феатурес:

Вторая версия написана с использованием библиотеки jQuery (кстати, очень рекомендую обратить внимание, не такая громоздкая как Prototype)
Запуск скрипта осуществялется средставми jQuery, в сам html-файл ничего не нужно вписывать
В настройках скрипта можно указать в каких тэгах будет работать подсказка
Подсказки прописываются в атрибут rel, хотя можно использовать любой другой [...]]]></description>
			<content:encoded><![CDATA[<p>Вспоминаем мой давний пост <a href="http://www.seleckis.lv/archive/scripting/tooltip-javascript">про плавающую над объектами подсказку</a>.</p>
<p><strong>Феатурес:</strong></p>
<ul>
<li>Вторая версия написана с использованием библиотеки <a href="http://jquery.com/">jQuery </a>(кстати, очень рекомендую обратить внимание, не такая громоздкая как <a href="http://www.prototypejs.org/">Prototype</a>)</li>
<li>Запуск скрипта осуществялется средставми jQuery, в сам html-файл ничего не нужно вписывать</li>
<li>В настройках скрипта можно указать в каких тэгах будет работать подсказка</li>
<li>Подсказки прописываются в атрибут <strong>rel</strong>, хотя можно использовать любой другой атрибут, например <strong>title</strong> или <strong>alt</strong>, достаточно прописать его в настройках скрипта. Проблема только в валидации кода</li>
<li>Добавлена функция простого парсинга, заменяющего знаки &#8220;[" на "&lt;" и "]&#8221; на &#8220;&gt;&#8221;, чтобы можно было добавлять в подсказки простые псевдо-тэги</li>
<li>Проверено в браузерах: <strong>Mozilla Firefox 2.0.0.6, Opera 9.23, Internet Explorer 5.5+, Safari 3.0.3, Swift 0.2 </strong></li>
</ul>
<p>Ну вот вроде и всё. <a target="_blank" href="http://www.seleckis.lv/wp-content/themes/seleckis_v2/NS_tooltip/ns_tooltip.html">Смотрим работающий пример.</a></p>
<p><a href='http://www.seleckis.lv/wp-content/uploads/2007/09/ns_tooltip_jquery.zip' title='ns_tooltip_jquery.zip'>Качаем исходник</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/javascript/vsplyvayushhaya-podskazka-v2/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Замена подстрок с помощью JavaScript v.2</title>
		<link>http://seleckis.lv/journal/javascript/zamena-podstrok-s-pomoshhyu-javascript-v2</link>
		<comments>http://seleckis.lv/journal/javascript/zamena-podstrok-s-pomoshhyu-javascript-v2#comments</comments>
		<pubDate>Thu, 06 Sep 2007 10:56:41 +0000</pubDate>
		<dc:creator>Никита</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.seleckis.lv/journal/javascript/zamena-podstrok-s-pomoshhyu-javascript-v2</guid>
		<description><![CDATA[Не string&#8217;ом единым&#8230;
Пересмотрел я скрипт написаный мною в прошлой статье и теперь с некоторыми изменениями выкладываю вновь.
Теперь в качестве поиска используется регулярное выражение игнорирующее вхождения подстроки между символами тэга (&#8220;&#8220;), что означает что замена не будет применяться к самим тэгам.
Кроме этого к объекту поиска добавил флаг (параметр &#8216;flag&#8217;), который может быть равен &#8220;i&#8221; &#8211; игнорировать [...]]]></description>
			<content:encoded><![CDATA[<p><em>Не string&#8217;ом единым&#8230;</em></p>
<p>Пересмотрел я скрипт написаный мною в прошлой статье и теперь с некоторыми изменениями выкладываю вновь.</p>
<p>Теперь в качестве поиска используется регулярное выражение игнорирующее вхождения подстроки между символами тэга (&#8220;<" и ">&#8220;), что означает что замена не будет применяться к самим тэгам.</p>
<p>Кроме этого к объекту поиска добавил флаг (параметр &#8216;flag&#8217;), который может быть равен &#8220;i&#8221; &#8211; игнорировать регистр. Это в рамках правил регулярных выражений. Логично что вы не будуте использовать параметр &#8220;i&#8221; если вам нужно поменять регистр у букв. Отмечу так же, что в поиске не используется флаг &#8220;g&#8221;. Глобальный поиск реализован с помощью цикла (см. цикл <strong>while</strong>).</p>
<h3>Код</h3>
<p><code><br />
symbols = new Array();<br />
symbols[1] = { 'search' : 'k', 'replace' : 'K', 'flag' : '' }<br />
symbols[2] = { 'search' : 'br', 'replace' : 'hr', 'flag' : 'i' }<br />
symbols[3] = { 'search' : 'block', 'replace' : 'inline', 'flag' : 'i' }<br />
</code><br />
<code><br />
function sym_Replace()<br />
{<br />
	for (sym in symbols)<br />
	{<br />
		expr = new Array()<br />
		expr = "([^(&lt;.*?)]*)(" + symbols[sym]['search'] + ")([^(.*?&gt;)]*)"<br />
		srch = new RegExp(expr, symbols[sym]['flag'])<br />
		replace = "$1" + symbols[sym]['replace'] + "$3";<br />
		block = document.getElementsByTagName("p")<br />
		for (i=0; i&lt;block.length; i++)<br />
		{<br />
			text = block[i].innerHTML<br />
			while(srch.test(text)){<br />
				text = text.replace(srch, replace);<br />
			}<br />
			block[i].innerHTML = text<br />
		}<br />
	}<br />
}<br />
</code></p>
<p>Запускается функция как обычно:</p>
<p><code>&lt;body onload="sym_Replace()"&gt;</code><br />
Прошу, кто может, сделайте дебаг.</p>
<h3>Плагин для Wordpress?</h3>
<p>Не думаю, что этот небольшой скриптик нужно оформлять как плагин для Wordpress. На самом деле, в <a target="_blank" href="http://wordpress.org/extend/plugins/search.php?q=replace">репозитории Wordpress&#8217;a</a> уже есть плагины выполняющие замену в тексте и постов и комментариев на уровне php.</p>
]]></content:encoded>
			<wfw:commentRss>http://seleckis.lv/journal/javascript/zamena-podstrok-s-pomoshhyu-javascript-v2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

