<?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>Ars Longa, Vita Brevis &#187; JavaScript</title>
	<atom:link href="http://blog.sjinks.pro/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Sat, 19 May 2012 17:55:07 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Автоматическое добавление ссылки на источник при копировании текста с сайта</title>
		<link>http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/</link>
		<comments>http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 03:42:35 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=958</guid>
		<description><![CDATA[Навязчивое добавление ссылки на оригинал при копировании текста с сайта Идея: когда пользователь выделяет часть текста и копирует её в буфер обмена (например, чтобы выложить на своём сайте), автоматически добавлять к выделению ссылку на источник. Реализация: var source_link = &#039;&#60;p&#62;Подробнее: &#60;a href=&#34;&#039; + location.href + &#039;&#34;&#62;&#039; + location.href + &#039;&#60;/a&#62;&#60;/p&#62;&#039;; jQuery( function($) { if (window.getSelection) [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Навязчивое добавление ссылки на оригинал при копировании текста с сайта</em></h2>
<p><strong>Идея:</strong> когда пользователь выделяет часть текста и копирует её в буфер обмена (например, чтобы выложить на своём сайте), автоматически добавлять к выделению ссылку на источник.<span id="more-958"></span></p>
<p><strong>Реализация:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9582">
        <div class="code javascript" id="p958code2">
<span class="kw2">var</span> source_link <span class="sy0">=</span> <span class="st0">'&lt;p&gt;Подробнее: &lt;a href=&quot;'</span> <span class="sy0">+</span> location.<span class="me1">href</span> <span class="sy0">+</span> <span class="st0">'&quot;&gt;'</span> <span class="sy0">+</span> location.<span class="me1">href</span> <span class="sy0">+</span> <span class="st0">'&lt;/a&gt;&lt;/p&gt;'</span><span class="sy0">;</span><br />
jQuery<span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>$<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>window.<span class="me1">getSelection</span><span class="br0">&#41;</span> $<span class="br0">&#40;</span><span class="st0">'#content div.post'</span><span class="br0">&#41;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'copy'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> selection <span class="sy0">=</span> window.<span class="me1">getSelection</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> range <span class="sy0">=</span> selection.<span class="me1">getRangeAt</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> magic_div <span class="sy0">=</span> $<span class="br0">&#40;</span><span class="st0">'&lt;div&gt;'</span><span class="br0">&#41;</span>.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span> overflow <span class="sy0">:</span> <span class="st0">'hidden'</span><span class="sy0">,</span> width<span class="sy0">:</span> <span class="st0">'1px'</span><span class="sy0">,</span> height <span class="sy0">:</span> <span class="st0">'1px'</span><span class="sy0">,</span> position <span class="sy0">:</span> <span class="st0">'absolute'</span><span class="sy0">,</span> top<span class="sy0">:</span> <span class="st0">'-10000px'</span><span class="sy0">,</span> left <span class="sy0">:</span> <span class="st0">'-10000px'</span> <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; magic_div.<span class="me1">append</span><span class="br0">&#40;</span>range.<span class="me1">cloneContents</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> source_link<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">'body'</span><span class="br0">&#41;</span>.<span class="me1">append</span><span class="br0">&#40;</span>magic_div<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> cloned_range <span class="sy0">=</span> range.<span class="me1">cloneRange</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; selection.<span class="me1">removeAllRanges</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> new_range <span class="sy0">=</span> document.<span class="me1">createRange</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new_range.<span class="me1">selectNode</span><span class="br0">&#40;</span>magic_div.<span class="me1">get</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; selection.<span class="me1">addRange</span><span class="br0">&#40;</span>new_range<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.<span class="me1">setTimeout</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; selection.<span class="me1">removeAllRanges</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; selection.<span class="me1">addRange</span><span class="br0">&#40;</span>cloned_range<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; magic_div.<span class="me1">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span> 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p><strong>Настраиваемые параметры</strong>:</p>
<ul>
<li><code>source_link</code> — текст, который будет добавляться к копируемому фрагменту. В данном примере задаётся статически, но при желании генерацию ссылки можно усложнить (например, при копировании с текста с домашней страницы можно возвращать ссылку на статью, из которой взята данная цитата). Для этого в строке <code>magic_div.append(range.cloneContents(), source_link);</code> вместо <code>source_link</code> нужно использовать свою функцию, возвращающую <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a> для вставки в копируемый фрагмент.</li>
<li><code>'#content div.post'</code> — выражение, задающее один или более контейнер с текстом, при копировании которого нужно добавлять ссылку на оригинал. Идея в том, что добавлять ссылку на статью при копировании, скажем, части текста одного из комментариев к статье было бы нелогично. С помощью данного выражения можно задать требуемые защищаемые объекты.</li>
</ul>
<p><strong>Возможные улучшения:</strong> проверка длины копируемого текста. Например, если пользователь копирует меньше 20 слов, не добавлять ссылку. Получить выделенный текст можно через <code>range.cloneContents().textContent</code>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/958-link-to-source-on-copy-clipboard/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Изменение размера поля ввода запроса в PhpMyAdmin</title>
		<link>http://blog.sjinks.pro/javascript/489-resizing-sql-input-field-in-phpmyadmin/</link>
		<comments>http://blog.sjinks.pro/javascript/489-resizing-sql-input-field-in-phpmyadmin/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 14:05:49 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[PhpMyAdmin]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=489</guid>
		<description><![CDATA[Greasemonkey приходит на помощь Вещь, которая меня бесит больше всего в PhpMyAdmin&#160;&#8212;&#160;это то, что поле для ввода SQL-запроса очень маленькое (по умолчанию всего 6&#160;строк). К счастью, при помощи Greasemonkey всё очень легко исправляется. // ==UserScript== // @name PhpMyAdmin SQL Query textarea height fix // @namespace http://sjinks.org.ua/ // @include http://my-pma-site.com/* /* указать нужные */ // ==/UserScript== [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/489-resizing-sql-input-field-in-phpmyadmin/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em><a href="http://blog.sjinks.pro/tag/greasemonkey/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Greasemonkey">Greasemonkey</a> приходит на помощь</em></h2>
<p>Вещь, которая меня бесит больше всего в <a href="http://blog.sjinks.pro/tag/phpmyadmin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PhpMyAdmin">PhpMyAdmin</a>&nbsp;&mdash;&nbsp;это то, что поле для ввода SQL-запроса очень маленькое (по умолчанию всего 6&nbsp;строк). К счастью, при помощи Greasemonkey всё очень легко исправляется.<span id="more-489"></span></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4894">
        <div class="code javascript" id="p489code4">
<span class="co1">// ==UserScript==</span><br />
<span class="co1">// @name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PhpMyAdmin SQL Query textarea height fix</span><br />
<span class="co1">// @namespace &nbsp; &nbsp; http://sjinks.org.ua/</span><br />
<span class="co1">// @include &nbsp; &nbsp; &nbsp; http://my-pma-site.com/* &nbsp;/* указать нужные */</span><br />
<span class="co1">// ==/UserScript==</span><br />
<br />
<span class="kw2">var</span> e <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">'sqlquery'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>e <span class="sy0">&amp;&amp;</span> <span class="st0">'textarea'</span> <span class="sy0">==</span> e.<span class="me1">tagName</span>.<span class="me1">toLowerCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; e.<span class="me1">style</span>.<span class="me1">height</span> <span class="sy0">=</span> <span class="st0">'500px'</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/489-resizing-sql-input-field-in-phpmyadmin/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/489-resizing-sql-input-field-in-phpmyadmin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Создание отражения рисунка с помощью JavaScript</title>
		<link>http://blog.sjinks.pro/javascript/356-image-reflection-with-javascript/</link>
		<comments>http://blog.sjinks.pro/javascript/356-image-reflection-with-javascript/#comments</comments>
		<pubDate>Sun, 16 Nov 2008 22:12:36 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[эффекты]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=356</guid>
		<description><![CDATA[HTML 5 приходит на помощь Постановка задачи: из исходного изображения получить отраженное изображение: Дополнительное условие: генерировать изображение на стороне клиента (то есть без использования GD, ImageMagick и иже с ними). В черновике стандарта HTML&#160;5 пристутствует такой замечательный элемент как &#60;canvas&#62;. Если вкратце, то данный элемент предназначен для создания изображений при помощи JavaScript. Впервые элемент &#60;canvas&#62; [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/356-image-reflection-with-javascript/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em><a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a> 5 приходит на помощь</em></h2>
<p><strong>Постановка задачи:</strong> из исходного изображения </p>
<p><img src="http://static.sjinks.info/wp-content/uploads/2008/11/source.png" alt="Исходное изображение" title="Исходное изображение" width="363" height="240" class="alignnone size-full wp-image-357" /></p>
<p>получить отраженное изображение:</p>
<p><img src="http://static.sjinks.info/wp-content/uploads/2008/11/dest.png" alt="Исходное изображение с отражением" title="Исходное изображение с отражением" width="363" height="476" class="alignnone size-full wp-image-358" /></p>
<p><strong>Дополнительное условие:</strong> генерировать изображение на стороне клиента (то есть без использования GD, ImageMagick и иже с ними).<span id="more-356"></span></p>
<p>В черновике стандарта HTML&nbsp;5 пристутствует такой замечательный элемент как <span class="codebox"><code class="html"><span class="sc2">&lt;canvas&gt;</span></code></span>. Если вкратце, то данный элемент предназначен для создания  изображений при помощи <a href="http://blog.sjinks.pro/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  JavaScript">JavaScript</a>.</p>
<p>Впервые элемент <span class="codebox"><code class="html"><span class="sc2">&lt;canvas&gt;</span></code></span> был представлен компанией Apple и использовался как компонент WebKit для Mac&nbsp;OS&nbsp;X в таких приложениях как Dashboard и Safari.</p>
<p>Поддержка <span class="codebox"><code class="html"><span class="sc2">&lt;canvas&gt;</span></code></span> в Gecko появилась в версии 1.5, в Presto с версии 9.0 веб-браузера Opera. Текущие версии Internet Explorer (включая восьмую бету) не поддерживают <span class="codebox"><code class="html"><span class="sc2">&lt;canvas&gt;</span></code></span>. Несмотря на это, для поставленной задачи существует кросс-браузерное решение.</p>
<p>В Microsoft Internet Explorer отражения с прозрачностью можно достичь путём использования комбинации фильтров. В частности, для вертикального отражения используется фильтр <code>flipv</code>, для горизонтального&nbsp;&mdash;&nbsp;<code>fliph</code>. Про реализацию прозрачности в Internet Explorer, наверное, знает каждый: <code>progid:DXImageTransform.Microsoft.Alpha</code>. Тем не менее, не все знают, что можно задавать градиентную прозрачность.</p>
<p>Перейдём к решению. Пусть у нас имеется такая разметка:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p3568">
        <div class="code html" id="p356code8">
<span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;container&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">img</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;image&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;image.png&quot;</span> <span class="kw3">alt</span><span class="sy0">=</span><span class="st0">&quot;Image&quot;</span><span class="sy0">/</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span>
        </div>
    </div>
</div>

<p>Будем полагать, что ширина и высота контейнера заданы (если мы делаем отражение по вертикали, то ширина контейнера совпадает с шириной рисунка, а высота контейнера в два раза больше высоты рисунка; аналогично для горизонтального отражения).</p>
<p>Начнём с классики (MSIE).</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p3569">
        <div class="code javascript" id="p356code9">
<span class="coMULTI">/**<br />
&nbsp;* @param container &lt;div id=&quot;container&quot;&gt;<br />
&nbsp;* @param image &lt;img id=&quot;image&quot;&gt;<br />
&nbsp;* @param ratio Коэффициент сжатия/растягивания отражения<br />
&nbsp;* @param opacity_start Начальная (ближняя к отражаемому изображению) непрозрачность <br />
&nbsp;* @param opacity_end Конечная непрозрачность<br />
&nbsp;* @param horizontal 0 = вертикальное отражение, 1 = горизонтальное отражение<br />
&nbsp;*/</span><br />
<span class="kw2">function</span> reflect_image<span class="br0">&#40;</span>container<span class="sy0">,</span> image<span class="sy0">,</span> ratio<span class="sy0">,</span> opacity_start<span class="sy0">,</span> opacity_end<span class="sy0">,</span> horizontal<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> reflection &nbsp;<span class="sy0">=</span> document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'img'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; reflection.<span class="me1">src</span> <span class="sy0">=</span> image.<span class="me1">src</span><span class="sy0">;</span><br />
&nbsp; &nbsp; reflection.<span class="me1">style</span>.<span class="me1">width</span> <span class="sy0">=</span> image.<span class="me1">width</span> <span class="sy0">+</span> <span class="st0">'px'</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="nu0">0</span> <span class="sy0">==</span> horizontal<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; reflection.<span class="me1">style</span>.<span class="me1">filter</span> <span class="sy0">=</span> <span class="st0">'flipv progid:DXImageTransform.Microsoft.Alpha(opacity='</span><span class="sy0">+</span><span class="br0">&#40;</span>opacity_start<span class="sy0">*</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">', style=1, finishOpacity='</span><span class="sy0">+</span><span class="br0">&#40;</span>opacity_end<span class="sy0">*</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">', startx=0, starty=0, finishx=0, finishy='</span><span class="sy0">+</span><span class="br0">&#40;</span>ratio<span class="sy0">*</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">')'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; reflection.<span class="me1">style</span>.<span class="me1">filter</span> <span class="sy0">=</span> <span class="st0">'fliph progid:DXImageTransform.Microsoft.Alpha(opacity='</span><span class="sy0">+</span><span class="br0">&#40;</span>opacity_start<span class="sy0">*</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">', style=1, finishOpacity='</span><span class="sy0">+</span><span class="br0">&#40;</span>opacity_end<span class="sy0">*</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">', startx=0, starty=0, finishx='</span><span class="sy0">+</span><span class="br0">&#40;</span>ratio<span class="sy0">*</span><span class="nu0">100</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">', finishy=0)'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; container.<span class="me1">appendChild</span><span class="br0">&#40;</span>reflection<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>В случае с IE всё просто и сводится к заданию соответствующих фильтров. С браузерами, поддерживающими HTML&nbsp;5, всё гораздо сложнее (ad deliberandum: сколько строк занимает программа на C++, если она использует COM-технологию?)</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p35610">
        <div class="code javascript" id="p356code10">
<span class="coMULTI">/**<br />
&nbsp;* @param container &lt;div id=&quot;container&quot;&gt;<br />
&nbsp;* @param image &lt;img id=&quot;image&quot;&gt;<br />
&nbsp;* @param ratio Коэффициент сжатия/растягивания отражения<br />
&nbsp;* @param opacity_start Начальная (ближняя к отражаемому изображению) непрозрачность <br />
&nbsp;* @param opacity_end Конечная непрозрачность<br />
&nbsp;* @param horizontal 0 = вертикальное отражение, 1 = горизонтальное отражение<br />
&nbsp;*/</span><br />
<span class="kw2">function</span> reflect_image<span class="br0">&#40;</span>container<span class="sy0">,</span> image<span class="sy0">,</span> ratio<span class="sy0">,</span> opacity_start<span class="sy0">,</span> opacity_end<span class="sy0">,</span> horizontal<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> reflection <span class="sy0">=</span> document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'canvas'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> context &nbsp; <span class="sy0">=</span> reflection.<span class="me1">getContext</span><span class="br0">&#40;</span><span class="st0">'2d'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; reflection.<span class="me1">style</span>.<span class="me1">height</span> <span class="sy0">=</span> image.<span class="me1">height</span> <span class="sy0">+</span> <span class="st0">'px'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; reflection.<span class="me1">style</span>.<span class="me1">width</span> &nbsp;<span class="sy0">=</span> image.<span class="me1">width</span> <span class="sy0">+</span> <span class="st0">'px'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; reflection.<span class="me1">height</span> &nbsp; &nbsp; &nbsp; <span class="sy0">=</span> image.<span class="me1">height</span><span class="sy0">;</span><br />
&nbsp; &nbsp; reflection.<span class="me1">width</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> image.<span class="me1">width</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//Подводный камень: на canvas нельзя рисовать, если она не в DOM-дереве документа</span><br />
&nbsp; &nbsp; container.<span class="me1">appendChild</span><span class="br0">&#40;</span>reflection<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; context.<span class="me1">save</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> gradient<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="nu0">0</span> <span class="sy0">==</span> horizontal<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Задаём точку отсчёта, отражаем ось y и создаём вертикальный градиент</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; context.<span class="me1">translate</span><span class="br0">&#40;</span>0<span class="sy0">,</span> image.<span class="me1">height</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; context.<span class="me1">scale</span><span class="br0">&#40;</span>1<span class="sy0">,</span> <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; gradient <span class="sy0">=</span> context.<span class="me1">createLinearGradient</span><span class="br0">&#40;</span>0<span class="sy0">,</span> 0<span class="sy0">,</span> 0<span class="sy0">,</span> image.<span class="me1">height</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Задаём точку отсчёта, отражаем ось x и создаём горизонтальный градиент</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; context.<span class="me1">translate</span><span class="br0">&#40;</span>image.<span class="me1">width</span><span class="sy0">,</span> 0<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; context.<span class="me1">scale</span><span class="br0">&#40;</span><span class="sy0">-</span>1<span class="sy0">,</span> 1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; gradient <span class="sy0">=</span> context.<span class="me1">createLinearGradient</span><span class="br0">&#40;</span>0<span class="sy0">,</span> 0<span class="sy0">,</span> image.<span class="me1">width</span><span class="sy0">,</span> 0<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Рисуем исходное изображение (оно будет отражено по одной из осей)</span><br />
&nbsp; &nbsp; context.<span class="me1">drawImage</span><span class="br0">&#40;</span>image<span class="sy0">,</span> 0<span class="sy0">,</span> 0<span class="sy0">,</span> image.<span class="me1">width</span><span class="sy0">,</span> image.<span class="me1">height</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; context.<span class="me1">restore</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Задаём режим операции</span><br />
&nbsp; &nbsp; context.<span class="me1">globalCompositeOperation</span> <span class="sy0">=</span> <span class="st0">&quot;destination-out&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Параметры градинтной заливки (в параметрах передаётся НЕпрозрачность, нам нужна прозрачность)</span><br />
&nbsp; &nbsp; gradient.<span class="me1">addColorStop</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="st0">&quot;rgba(255, 255, 255, &quot;</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="nu0">1</span> <span class="sy0">-</span> opacity_end<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;)&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; gradient.<span class="me1">addColorStop</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span> <span class="st0">&quot;rgba(255, 255, 255, &quot;</span> <span class="sy0">+</span> <span class="br0">&#40;</span><span class="nu0">1</span> <span class="sy0">-</span> opacity_start<span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;)&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; context.<span class="me1">fillStyle</span> <span class="sy0">=</span> gradient<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// Заливаем</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">-</span><span class="nu0">1</span> <span class="sy0">!=</span> navigator.<span class="me1">appVersion</span>.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">'WebKit'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; context.<span class="me1">fill</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> <br />
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; context.<span class="me1">fillRect</span><span class="br0">&#40;</span>0<span class="sy0">,</span> 0<span class="sy0">,</span> image.<span class="me1">width</span><span class="sy0">,</span> image.<span class="me1">height</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p><strong><a href="http://blog.sjinks.pro/test/reflection/test.html" rel="nofollow">Тестовый пример</a>.</strong></p>
<p><strong><a href="https://developer.mozilla.org/En/Canvas_tutorial" rel="nofollow">Canvas Tutorial в Mozilla Developer Center</a></strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/356-image-reflection-with-javascript/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/356-image-reflection-with-javascript/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Убиваем рекламу на bash.org.ru, или, Greasemonkey в действии</title>
		<link>http://blog.sjinks.pro/javascript/217-killing-ads-on-bashorgru-greasemonkey-in-action/</link>
		<comments>http://blog.sjinks.pro/javascript/217-killing-ads-on-bashorgru-greasemonkey-in-action/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 00:41:00 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bash.org.ru]]></category>
		<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[XPath]]></category>
		<category><![CDATA[реклама]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=217</guid>
		<description><![CDATA[Убираем тупую рекламу с bash.org.ru при помощи GreaseMonkey Многие (если не все) знакомы с ресурсом bash.org.ru. И, хотя юмор там в последнее время очень тупой, старые шутки почитать временами можно. Помимо тупого юмора лично меня на bash.org.ru больше всего раздражает не менее тупая реклама И если со всякими iframe и иже с ним AdBlock может [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/217-killing-ads-on-bashorgru-greasemonkey-in-action/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Убираем тупую рекламу с <a href="http://blog.sjinks.pro/tag/bashorgru/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  bash.org.ru">bash.org.ru</a> при помощи <a href="http://blog.sjinks.pro/tag/greasemonkey/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Greasemonkey">GreaseMonkey</a></em></h2>
<p>Многие (если не все) знакомы с ресурсом bash.org.ru. И, хотя юмор там в последнее время очень тупой, старые шутки почитать временами можно. Помимо тупого юмора лично меня на bash.org.ru больше всего раздражает не менее тупая <a href="http://blog.sjinks.pro/tag/ads/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  реклама">реклама</a> <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  И если со всякими <code>iframe</code> и иже с ним AdBlock может бороться, то со вставками вида</p>
<blockquote>
Дэвид Блэйн раскукожил Firefox! Теперь в нём Яндекс!<br />
</blockquote>
<p>он уже не справляется (так как они вставляются в вывод на сервере). Достал меня Дэвид Блейн. И Яндекс меня достал. И еще много что меня достало. Наверное, надо отдохнуть. Но речь не об этом. В общем, если меня что-то раздражает, я от этого избавляюсь (если читать, то с комфортом). Задачка как раз для Greasemonkey.<span id="more-217"></span></p>
<p>Ранее я уже приводил <a href="http://blog.sjinks.pro/javascript/78-script-for-greasemonkey-to-extract-asin-from-amazon/">пример пользовательского скрипта для извлечения ASIN с amazon.com</a>. Здесь используется нечто похожее.</p>
<p>Идея состоит в том, что для нормальных цитат после <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">hr</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;iq&quot;</span>&gt;</span></code></span> сразу идет <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">language</span><span class="sy0">=</span><span class="st0">&quot;JavaScript&quot;</span>&gt;</span></code></span> и только потом <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;q&quot;</span>&gt;</span></code></span>, а в случае с рекламой <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">script</span>&gt;</span></code></span> отсутствует; всё показано на рисунке:<br />
<a href='http://static.sjinks.info/wp-content/uploads/2008/07/bashorgru.png' rel="lightbox"><img src="http://static.sjinks.info/wp-content/uploads/2008/07/bashorgru-300x240.png" alt="XML-дерево" title="XML-дерево" class="alignnone size-medium wp-image-216" /></a><script type="text/javascript">odl.register(initLightbox);</script></p>
<p>Переходим к коду.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p21712">
        <div class="code javascript" id="p217code12">
<span class="co1">// ==UserScript==</span><br />
<span class="co1">// @name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Bash.org.ru Ads Remover</span><br />
<span class="co1">// @namespace &nbsp; &nbsp; http://sjinks.org.ua/</span><br />
<span class="co1">// @include &nbsp; &nbsp; &nbsp; http://bash.org.ru/*</span><br />
<span class="co1">// @exclude &nbsp; &nbsp; &nbsp; http://bash.org.ru/abysstop</span><br />
<span class="co1">// @exclude &nbsp; &nbsp; &nbsp; http://bash.org.ru/abyssbest</span><br />
<span class="co1">// ==/UserScript==</span><br />
<br />
<span class="kw2">var</span> x <span class="sy0">=</span> document.<span class="me1">evaluate</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">'//div[@id=&quot;quotes&quot;]/hr[@class=&quot;iq&quot;]/following-sibling::*[position()=1][@class=&quot;q&quot;]'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; document<span class="sy0">,</span> <span class="kw2">null</span><span class="sy0">,</span> XPathResult.<span class="me1">UNORDERED_NODE_SNAPSHOT_TYPE</span><span class="sy0">,</span> <span class="kw2">null</span><br />
<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>x.<span class="me1">snapshotLength</span><span class="sy0">;</span> <span class="sy0">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> a <span class="sy0">=</span> x.<span class="me1">snapshotItem</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> b <span class="sy0">=</span> a.<span class="me1">nextSibling</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; a <span class="sy0">=</span> a.<span class="me1">parentNode</span>.<span class="me1">removeChild</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>b.<span class="me1">tagName</span> <span class="sy0">&amp;&amp;</span> <span class="st0">'div'</span> <span class="sy0">==</span> b.<span class="me1">tagName</span>.<span class="me1">toLowerCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a <span class="sy0">=</span> b<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
x <span class="sy0">=</span> document.<span class="me1">evaluate</span><span class="br0">&#40;</span><span class="st0">'//iframe'</span><span class="sy0">,</span> document<span class="sy0">,</span> <span class="kw2">null</span><span class="sy0">,</span> XPathResult.<span class="me1">UNORDERED_NODE_SNAPSHOT_TYPE</span><span class="sy0">,</span> <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>x.<span class="me1">snapshotLength</span><span class="sy0">;</span> <span class="sy0">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; a <span class="sy0">=</span> x.<span class="me1">snapshotItem</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; a.<span class="me1">parentNode</span>.<span class="me1">removeChild</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Устанавливаем, активируем и не смотрим на рекламу. Всё-таки <a href="http://blog.sjinks.pro/tag/xpath/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XPath">XPath</a>&nbsp;&mdash;&nbsp;это вещь!</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/217-killing-ads-on-bashorgru-greasemonkey-in-action/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/217-killing-ads-on-bashorgru-greasemonkey-in-action/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Парочка аккордеонов</title>
		<link>http://blog.sjinks.pro/javascript/91-couple-of-accordions/</link>
		<comments>http://blog.sjinks.pro/javascript/91-couple-of-accordions/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 18:19:53 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[WCAG]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[аккордеон]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=91</guid>
		<description><![CDATA[Несколько вариантов реализации меню-аккордеона с использованием библиотеки Prototype Недавно в одном из проектов появилась необходимость использовать аккордеон (подобный используемому на Desert Ridge Marketplace). Любят заказчики дешевые эффекты, ничего здесь не поделаешь Чем мне не понравился аккордеон на Desert Ridge&#160;&#8212;&#160;это полной зависимостью от JavaScript: если JavaScript выключен, навигация по сайту переставала работать. Это мне не понравилось, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/91-couple-of-accordions/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Несколько вариантов реализации меню-аккордеона с использованием библиотеки <a href="http://blog.sjinks.pro/tag/prototype/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Prototype">Prototype</a></em></h2>
<p>Недавно в одном из проектов появилась необходимость использовать <a href="http://blog.sjinks.pro/tag/accordion/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  аккордеон">аккордеон</a> (подобный используемому на Desert Ridge Marketplace). Любят заказчики дешевые <a href="http://blog.sjinks.pro/tag/effects/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  эффекты">эффекты</a>, ничего здесь не поделаешь <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Чем мне не понравился аккордеон на Desert Ridge&nbsp;&mdash;&nbsp;это полной зависимостью от <a href="http://blog.sjinks.pro/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  JavaScript">JavaScript</a>: если <a href="http://blog.sjinks.pro/tag/javascript/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  JavaScript">JavaScript</a> выключен, навигация по сайту переставала работать. Это мне не понравилось, и я решил написать свой. </p>
<p>Представляю два решения:</p>
<ol>
<li>Подменю сворачивается/разворачивается по щелчку, элементы меню не зависят друг от друга;</li>
<li>Подменю сворачивается/разворачивается по щелчку, при этом не может быть более одного развёрнутого подменю.</li>
</ol>
<p>При выключенном JavaScript оба аккордеона трансформируются в двухуровневый список.<span id="more-91"></span></p>
<p>Поехали. Будем использовать следующую разметку:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9118">
        <div class="code xhtml" id="p91code18">
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;accordion&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.3<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.4<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;active&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.3<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.4<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 3<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 3.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 3.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 4<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 4.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 4.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span>
        </div>
    </div>
</div>

<p>С разметкой всё просто: обычный двухуровневый список; предполагается, что меню Item2 активно (то есть должно быть развёрнуто).</p>
<p>Оформим аккордеон при помощи <a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9119">
        <div class="code css" id="p91code19">
a <span class="br0">&#123;</span> <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span> <span class="kw1">color</span><span class="sy0">:</span> <span class="re0">#00F</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
a<span class="re2">:hover </span><span class="br0">&#123;</span> <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">underline</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re0">#accordion</span> a <span class="br0">&#123;</span> <span class="kw1">outline</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
<span class="re0">#accordion</span><span class="sy0">,</span> <span class="re0">#accordion</span> ul<span class="sy0">,</span> <span class="re0">#accordion</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">list-style</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="re0">#CCC</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">150px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">40px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="sy0">&gt;</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="re0">#CCC</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">2px</span> <span class="re3">5px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="sy0">&gt;</span> li<span class="re2">:last-child </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> li<span class="re1">.active</span> <span class="sy0">&gt;</span> a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="kw2">red</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Покажем уродство <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a>, не понимающего CSS&nbsp;2.1:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9120">
        <div class="code css" id="p91code20">
<span class="sy0">*</span> html <span class="re0">#accordion</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="re0">#CCC</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">2px</span> <span class="re3">5px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li<span class="re1">.active</span> a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="kw2">red</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li<span class="re1">.active</span> ul a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="kw1">blue</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>За использование пяти лишних правил я и не люблю IE6 (и это мы еще используем простую разметку).</p>
<p>Переходим к JavaScript. В данных примерах я использую библиотеки Prototype и <a href="http://blog.sjinks.pro/tag/scriptaculous/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Scriptaculous">Scriptaculous</a> Effects (всё очень легко переводится на <a href="http://blog.sjinks.pro/tag/jquery/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  jQuery">jQuery</a>).<br />
<strong>Вариант 1: независимые элементы меню</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9121">
        <div class="code javascript" id="p91code21">
$$<span class="br0">&#40;</span><span class="st0">'#accordion &gt; li:not([class=&quot;active&quot;]) ul'</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'setStyle'</span><span class="sy0">,</span> <span class="br0">&#123;</span> display <span class="sy0">:</span> <span class="st0">'none'</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'addClassName'</span><span class="sy0">,</span> <span class="st0">'collapsed'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
$$<span class="br0">&#40;</span><span class="st0">'#accordion &gt; li[class=&quot;active&quot;] ul'</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'addClassName'</span><span class="sy0">,</span> <span class="st0">'expanded'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
$$<span class="br0">&#40;</span><span class="st0">'#accordion &gt; li &gt; a'</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'observe'</span><span class="sy0">,</span> <span class="st0">'click'</span><span class="sy0">,</span> <br />
&nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> ul <span class="sy0">=</span> e.<span class="me1">findElement</span><span class="br0">&#40;</span><span class="st0">'a'</span><span class="br0">&#41;</span>.<span class="me1">up</span><span class="br0">&#40;</span><span class="st0">'li'</span><span class="br0">&#41;</span>.<span class="me1">down</span><span class="br0">&#40;</span><span class="st0">'ul'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ul<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">new</span> Effect.<span class="me1">toggle</span><span class="br0">&#40;</span>ul.<span class="me1">toggleClassName</span><span class="br0">&#40;</span><span class="st0">'collapsed'</span><span class="br0">&#41;</span>.<span class="me1">toggleClassName</span><span class="br0">&#40;</span><span class="st0">'expanded'</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st0">'blind'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p><a href="http://blog.sjinks.pro/test/accordion/accordion1.html">Рабочий пример для первого варианта.</a></p>
<p><strong>Вариант 2: развёрнуто не более одного меню</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9122">
        <div class="code javascript" id="p91code22">
$$<span class="br0">&#40;</span><span class="st0">'#accordion &gt; li:not([class=&quot;active&quot;]) ul'</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'setStyle'</span><span class="sy0">,</span> <span class="br0">&#123;</span> display <span class="sy0">:</span> <span class="st0">'none'</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'addClassName'</span><span class="sy0">,</span> <span class="st0">'collapsed'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
$$<span class="br0">&#40;</span><span class="st0">'#accordion &gt; li[class=&quot;active&quot;] ul'</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'addClassName'</span><span class="sy0">,</span> <span class="st0">'expanded'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
$$<span class="br0">&#40;</span><span class="st0">'#accordion &gt; li &gt; a'</span><span class="br0">&#41;</span>.<span class="me1">invoke</span><span class="br0">&#40;</span><span class="st0">'observe'</span><span class="sy0">,</span> <span class="st0">'click'</span><span class="sy0">,</span> <br />
&nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> ul <span class="sy0">=</span> e.<span class="me1">findElement</span><span class="br0">&#40;</span><span class="st0">'a'</span><span class="br0">&#41;</span>.<span class="me1">up</span><span class="br0">&#40;</span><span class="st0">'li'</span><span class="br0">&#41;</span>.<span class="me1">down</span><span class="br0">&#40;</span><span class="st0">'ul'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ul<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ul.<span class="me1">hasClassName</span><span class="br0">&#40;</span><span class="st0">'collapsed'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> c <span class="sy0">=</span> $$<span class="br0">&#40;</span><span class="st0">'#accordion ul:not([class=&quot;collapsed&quot;])'</span><span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>c<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">new</span> Effect.<span class="me1">BlindUp</span><span class="br0">&#40;</span>c.<span class="me1">toggleClassName</span><span class="br0">&#40;</span><span class="st0">'collapsed'</span><span class="br0">&#41;</span>.<span class="me1">toggleClassName</span><span class="br0">&#40;</span><span class="st0">'expanded'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">new</span> Effect.<span class="me1">BlindDown</span><span class="br0">&#40;</span>ul.<span class="me1">toggleClassName</span><span class="br0">&#40;</span><span class="st0">'collapsed'</span><span class="br0">&#41;</span>.<span class="me1">toggleClassName</span><span class="br0">&#40;</span><span class="st0">'expanded'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p><a href="http://blog.sjinks.pro/test/accordion/accordion2.html">Рабочий пример для второго варианта.</a></p>
<p>Всё очень просто!</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/91-couple-of-accordions/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/91-couple-of-accordions/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Скрипт для Greasemonkey для извлечения ASIN с amazon.com</title>
		<link>http://blog.sjinks.pro/javascript/78-script-for-greasemonkey-to-extract-asin-from-amazon/</link>
		<comments>http://blog.sjinks.pro/javascript/78-script-for-greasemonkey-to-extract-asin-from-amazon/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 21:57:26 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[XPath]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=78</guid>
		<description><![CDATA[Работу можно получить, даже если часовая ставка в 4 раза превышает ту, что хочет заказчик Сегодня (вернее, уже вчера) мне попался заказчик, которому нужен был скрипт для Greasemonkey, который бы мог вытаскивать ASIN из URL'ов на amazon.com и отображать их. Задачка довольно простая, но подобный тип задач встречается довольно часто. Поэтому привожу готовое решение. // [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/78-script-for-greasemonkey-to-extract-asin-from-amazon/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Работу можно получить, даже если часовая ставка в 4 раза превышает ту, что хочет заказчик</em></h2>
<p>Сегодня (вернее, уже вчера) мне попался заказчик, которому нужен был скрипт для <a href="http://blog.sjinks.pro/tag/greasemonkey/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Greasemonkey">Greasemonkey</a>, который бы мог вытаскивать ASIN из URL'ов на amazon.com и отображать их.</p>
<p>Задачка довольно простая, но подобный тип задач встречается довольно часто. Поэтому привожу готовое решение.<span id="more-78"></span></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p7824">
        <div class="code javascript" id="p78code24">
<span class="co1">// ==UserScript==</span><br />
<span class="co1">// @name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Amazon ASIN Extractor</span><br />
<span class="co1">// @namespace &nbsp; &nbsp; http://sjinks.org.ua/</span><br />
<span class="co1">// @include &nbsp; &nbsp; &nbsp; http://www.amazon.com/*</span><br />
<span class="co1">// @include &nbsp; &nbsp; &nbsp; http://amazon.com/*</span><br />
<span class="co1">// ==/UserScript==</span><br />
<br />
<span class="kw2">var</span> links <span class="sy0">=</span> document.<span class="me1">evaluate</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; <span class="st0">'(//div[contains(@id, &quot;title_&quot;)]/a[contains(@href, &quot;/dp/&quot;)])|(//strong[@class=&quot;sans&quot;]/a[contains(@href, &quot;/dp/&quot;)])|(//td[@class=&quot;dataColumn&quot;]//td/a[contains(@href, &quot;/dp/&quot;)])'</span><span class="sy0">,</span> <br />
&nbsp; &nbsp; document<span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="kw2">null</span><span class="sy0">,</span><br />
&nbsp; &nbsp; XPathResult.<span class="me1">UNORDERED_NODE_SNAPSHOT_TYPE</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="kw2">null</span><br />
<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>links.<span class="me1">snapshotLength</span><span class="sy0">;</span> <span class="sy0">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> a &nbsp; &nbsp;<span class="sy0">=</span> links.<span class="me1">snapshotItem</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> href <span class="sy0">=</span> a.<span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st0">'href'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> t <span class="sy0">=</span> href.<span class="me1">match</span><span class="br0">&#40;</span><span class="co2">/\/dp\/([A-Z0-9]{10})\//</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">'undefined'</span> <span class="sy0">!=</span> <span class="kw1">typeof</span> t<span class="br0">&#91;</span>1<span class="br0">&#93;</span> <span class="sy0">&amp;&amp;</span> 10 <span class="sy0">==</span> t<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">length</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> div <span class="sy0">=</span> document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'div'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> strong <span class="sy0">=</span> document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">'strong'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; strong.<span class="me1">appendChild</span><span class="br0">&#40;</span>document.<span class="me1">createTextNode</span><span class="br0">&#40;</span><span class="st0">'ASIN: '</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; div.<span class="me1">appendChild</span><span class="br0">&#40;</span>strong<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; div.<span class="me1">appendChild</span><span class="br0">&#40;</span>document.<span class="me1">createTextNode</span><span class="br0">&#40;</span>t<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; a.<span class="me1">parentNode</span>.<span class="me1">insertBefore</span><span class="br0">&#40;</span>div<span class="sy0">,</span> a.<span class="me1">nextSibling</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Для модификации для другого сайта просто меняется <a href="http://blog.sjinks.pro/tag/xpath/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XPath">XPath</a> внутри <code>document.evaluate()</code>, <code>@include</code>, регулярное выражение в <code>href.match()</code> и проверка в <code>if</code>.</p>
<p><em>Verbum sapienti sat est&hellip;</em></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/78-script-for-greasemonkey-to-extract-asin-from-amazon/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/78-script-for-greasemonkey-to-extract-asin-from-amazon/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>IE6/7: слишком широкие кнопки</title>
		<link>http://blog.sjinks.pro/javascript/36-too-wide-button-in-ie-6-7/</link>
		<comments>http://blog.sjinks.pro/javascript/36-too-wide-button-in-ie-6-7/#comments</comments>
		<pubDate>Sun, 16 Mar 2008 08:57:51 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[IE7]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[хак]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/uncategorized/36-too-wide-button-in-ie-6-7/</guid>
		<description><![CDATA[Как исправить глюк IE6/7, связанный с расползанием кнопки с длинным текстом Читая один замечательный блог, я наткнулся на заметку о том, что в IE6/7 кнопки c "длинным текстом" становятся очень длинными. Я не удержался и проверил: действительно. Причем только в IE6 и IE7, в IE8 (на удивление) всё в порядке. Тестовая разметка (взята из исходной [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/36-too-wide-button-in-ie-6-7/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как исправить глюк <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a>/7, связанный с расползанием кнопки с длинным текстом</em></h2>
<p>Читая <a href="http://pokrovskii.com/" onclick="pageTracker._trackPageview('/outgoing/pokrovskii.com')">один замечательный блог</a>, я наткнулся на <a href="http://pokrovskii.com/mnogo-teksta-v-knopke-ie6-7/" onclick="pageTracker._trackPageview('/outgoing/pokrovskii.com/mnogo-teksta-v-knopke-ie6-7')">заметку</a> о том, что в IE6/7 кнопки c "длинным текстом" становятся очень длинными.<span id="more-36"></span></p>
<p>Я не удержался и проверил: действительно. Причем только в IE6 и <a href="http://blog.sjinks.pro/tag/ie7/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE7">IE7</a>, в IE8 (<a href="http://blog.sjinks.pro/css/27-why-microsoft-calls-alpha-beta-or-what-acid-tests-are-for/">на удивление</a>) всё в порядке.</p>
<p>Тестовая разметка (взята из исходной статьи):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p3628">
        <div class="code xhtml" id="p36code28">
<span class="sc2">&lt;<span class="kw2">form</span> <span class="kw3">action</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span> <span class="kw3">method</span><span class="sy0">=</span><span class="st0">&quot;get&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">input</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;В IE6-7 кнопку разносит как студента-интеллигента после рюмки абсента&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;test&quot;</span><span class="sy0">/</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">form</span>&gt;</span>
        </div>
    </div>
</div>

<p>Результат (IE7):<br />
<img src='http://static.sjinks.info/wp-content/uploads/2008/03/2008-03-16_095212.png' alt='Пример широкой кнопки' /></p>
<p>В IE6 аналогично.</p>
<p>Первым делом я стал грешить на стили по умолчанию (например, padding, заданный в процентах от ширины). Поэтому решил проверить очень простым скриптом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p3629">
        <div class="code javascript" id="p36code29">
<span class="kw2">var</span> b <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">'test'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw2">var</span> s <span class="sy0">=</span> <span class="br0">&#40;</span>b.<span class="me1">currentStyle</span><span class="br0">&#41;</span> <span class="sy0">?</span> b.<span class="me1">currentStyle</span> <span class="sy0">:</span> b.<span class="me1">ownerDocument</span>.<span class="me1">defaultView</span>.<span class="me1">getComputedStyle</span><span class="br0">&#40;</span>b<span class="sy0">,</span> <span class="st0">''</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> prop <span class="kw1">in</span> s<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; document.<span class="kw1">write</span><span class="br0">&#40;</span><span class="st0">'&lt;b&gt;'</span> <span class="sy0">+</span> prop <span class="sy0">+</span> <span class="st0">'&lt;/b&gt;: '</span> <span class="sy0">+</span> s<span class="br0">&#91;</span>prop<span class="br0">&#93;</span> <span class="sy0">+</span> <span class="st0">'&lt;br/&gt;'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Увы&hellip; Зато, кому интересно, получились такие дефолтные стили в разных браузерах:</p>
<table class="bordered" cellpadding="2" cellspacing="1">
<thead>
<tr>
<th>&nbsp;</th>
<th><abbr title="FireFox">FF</abbr>2</th>
<th><abbr title="Internet Explorer">IE</abbr>6</th>
<th><abbr title="Internet Explorer">IE</abbr>7</th>
<th><abbr title="Internet Explorer">IE</abbr>8</th>
<th>Opera&nbsp;9</th>
<th>Safari&nbsp;3</th>
</tr>
</thead>
<tbody align="center">
<tr>
<td align="right"><strong>background</strong></td>
<td>rgb(212, 208, 200)</td>
<td>rgb(212, 208, 200)</td>
<td>rgb(212, 208, 200)</td>
<td>rgb(212, 208, 200)</td>
<td>transparent (???)</td>
<td>rgb(192, 192, 192)</td>
</tr>
<tr>
<td align="right"><strong>border</strong></td>
<td>2px outset rgb(212, 208, 200)</td>
<td>2px outset rgb(0, 0, 0)</td>
<td>2px outset rgb(0, 0, 0)</td>
<td>3px outset rgb(0, 0, 0)</td>
<td>2 both transparent (???)</td>
<td>0 none rgb(0, 0, 0)</td>
</tr>
<tr>
<td align="right"><strong>display</strong></td>
<td>inline</td>
<td>inline</td>
<td>inline</td>
<td>inline-block</td>
<td>inline</td>
<td>inline-block</td>
</tr>
<tr>
<td align="right"><strong>font</strong></td>
<td>normal normal 400 13.3333px/normal "MS Shell Dlg"</td>
<td>normal normal 400 10pt/normal "MS Shell Dlg"</td>
<td>normal normal 400 10pt/normal "MS Shell Dlg"</td>
<td>normal normal 400 10pt/normal Arial</td>
<td>normal normal normal relative/normal Arial</td>
<td>normal normal normal 11px/normal "Lucida Grande"</td>
</tr>
<tr>
<td align="right"><strong>height</strong></td>
<td>18px</td>
<td>auto</td>
<td>auto</td>
<td>auto</td>
<td>auto</td>
<td>18px</td>
</tr>
<tr>
<td align="right"><strong>margin</strong></td>
<td>0</td>
<td>auto</td>
<td>auto</td>
<td>auto</td>
<td>0</td>
<td>2px</td>
</tr>
<tr>
<td align="right"><strong>overflow</strong></td>
<td>visible</td>
<td>hidden</td>
<td>hidden</td>
<td>hidden</td>
<td>visible</td>
<td>visible</td>
</tr>
<tr>
<td align="right"><strong>padding</strong></td>
<td>0 6px</td>
<td>0</td>
<td>0</td>
<td>1px 8px</td>
<td>1px 8px</td>
<td>0 8px</td>
</tr>
</tbody>
</table>
<p>Видим, что у всех браузеров, кроме IE, <code>overflow</code> установлено в <code>visible</code>. Хотя <code>overflow</code> не должно играть здесь никакой роли, интересно проверить, как IE себя поведёт при дефолтных стилях FireFox. Меняем разметку:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p3630">
        <div class="code xhtml" id="p36code30">
<span class="sc2">&lt;<span class="kw2">form</span> <span class="kw3">action</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span> <span class="kw3">method</span><span class="sy0">=</span><span class="st0">&quot;get&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">input</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;В IE6-7 кнопку разносит как студента-интеллигента после рюмки абсента&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;test&quot;</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;overflow: visible;&quot;</span><span class="sy0">/</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">form</span>&gt;</span>
        </div>
    </div>
</div>

<p>Сработало! Вот они, чудеса:<br />
<img src='http://static.sjinks.info/wp-content/uploads/2008/03/2008-03-16_105142.png' alt='Теперь всё нормально' /></p>
<p>Я не берусь объяснять, почему такое вот исправление сработало. Как говорил классик,</p>
<blockquote cite="http://www.positioniseverything.net/explorer/doubled-margin.html">Why is this happening? Don't ask such silly questions! This is IE, remember? Conformance with the specs is only to be hoped for, not expected. The simple fact is it does happen.</blockquote>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/36-too-wide-button-in-ie-6-7/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/36-too-wide-button-in-ie-6-7/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ProtoBox: LightBox 2 reloaded :-)</title>
		<link>http://blog.sjinks.pro/javascript/4-protobox-lightbox-reloaded/</link>
		<comments>http://blog.sjinks.pro/javascript/4-protobox-lightbox-reloaded/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 01:28:28 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[LightBox]]></category>
		<category><![CDATA[LightBox 2]]></category>
		<category><![CDATA[ProtoBox]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/javascript/4-protobox-lightbox-reloaded/</guid>
		<description><![CDATA[Новая версия известного LightBox 2 с большими возможностями Я думаю, что многие видели LightBox 2 в действии. Но вот парадокс: заказчикам/пользователям он нравится (ох уж эти дешевые эффекты ), а вот многие программисты терпеть его не могут. Мне пришлось несколько раз столкнуться с LightBox (просто интегрировать его в приложение, написанное индусами). Но один раз мне [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/4-protobox-lightbox-reloaded/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Новая версия известного <a href="http://blog.sjinks.pro/tag/lightbox/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  LightBox">LightBox</a> 2 с большими возможностями</em></h2>
<p>Я думаю, что многие видели <a href="http://www.huddletogether.com/projects/lightbox2/" rel="nofollow">LightBox 2</a> в действии. Но вот парадокс: заказчикам/пользователям он нравится (ох уж эти дешевые <a href="http://blog.sjinks.pro/tag/effects/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  эффекты">эффекты</a> <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ), а вот многие программисты терпеть его не могут. Мне пришлось несколько раз столкнуться с LightBox (просто интегрировать его в приложение, написанное индусами). Но один раз мне понадобилось модифицировать кое-какое поведение скрипта, и я залез внутрь…<span id="more-4"></span><br />
Из того, что мне ужасно не понравилось: LightBox использует библиотеку <a href="http://prototypejs.org/">Prototype</a>, но написан совершенно не в ее стиле — больше напоминает хаотичный набор функций. Вторая неприятная особенность — повторное изобретение велосипеда: многие функции, существующие в <a href="http://blog.sjinks.pro/tag/prototype/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Prototype">Prototype</a>, зачем-то были написаны заново. Я, конечно, понимаю, что в предыдущих версиях <a href="http://blog.sjinks.pro/tag/prototype/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Prototype">Prototype</a> таких функций, возможно, не было, но ведь прогресс не стоит на месте. Разметка, которую генерирует LightBox, тоже очень несовершенна — видимо, Lokesh Dhakar не очень дружит с <a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a>. Но самое неприятное: использование обработчиков событий из DOM0 (например, <span class="codebox"><code class="javascript">element.<span class="me1">onclick</span> <span class="sy0">=</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></code></span>). Интересно, для чего Prototype реализует <span class="codebox"><code class="javascript">Event.<span class="me1">observe</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>/<span class="codebox"><code class="javascript">Event.<span class="me1">stopObserving</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>? Ведь использование методов DOM2 для работы с событиями более удобно (и в плане расширяемости скрипта)!</p>
<p>Есть и мелкие баги: известно, что в Internet Explorer 6 не очень просто перекрыть <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">select</span>&gt;</span></code></span> каким-нибудь <a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a>-элементом (по умолчанию <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">select</span>&gt;</span></code></span> все равно будет сверху). Для этого в LightBox реализованы функции <span class="codebox"><code class="javascript">hideSelectBoxes<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>/<span class="codebox"><code class="javascript">showSelectBoxes<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> (и аналогичные для элементов <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">object</span>&gt;</span></code></span> и <span class="codebox"><code class="html"><span class="sc2">&lt;embed&gt;</span></code></span>). Казалось бы, все хорошо, но… проблемы появились, когда на странице присутствовали элементы <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">select</span>&gt;</span></code></span> с <span class="codebox"><code class="css"><span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">hidden</span></code></span>. LightBox их открыл. Аналогично со скрытыми элементами <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">object</span>&gt;</span></code></span>.</p>
<p>Казалось бы, что это всё мелочи… Согласен, но когда таких мелочей очень много, и для добавления простой функциональности приходится переписывать большие куски кода, это очень раздражает. Пришлось переписать <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Из новой функциональности:</p>
<ul>
<li>возможность перетаскивания окна с картинкой (из разряда «дешевые эффекты»; для этого требуется наличие <code>dragdrop.js</code> из <a href="http://script.aculo.us">Scriptaculous</a>);</li>
<li>возможность просмотра изображений по кольцу (после последнего изображения идёт первое);</li>
<li>возможность использования существующего оверлея (тот самый затемнённый экран);</li>
<li>возможность задания максимальной высоты и ширины изображения (пока в пикселях);</li>
<li>возможность защиты изображения путём наложения прозрачного GIF&#8217;а сверху (ну очень уж заказчик настаивал);</li>
<li>сокрытие <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">object</span>&gt;</span></code></span>/<span class="codebox"><code class="html"><span class="sc2">&lt;embed&gt;</span></code></span> стало опциональным;</li>
<li>добавлена возможность полного отключения анимации (чтобы избежать зависимости от <a href="http://blog.sjinks.pro/tag/scriptaculous/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Scriptaculous">scriptaculous</a>; тщательно не тестировалось).</li>
</ul>
<p>Улучшения по сравнению с оригиналом:</p>
<ul>
<li>упрощена разметка;</li>
<li>код полностью переписан;</li>
<li>вместо ID используются классы;</li>
<li>отпала необходимость скрывать <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">select</span>&gt;</span></code></span> для <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a>.</li>
</ul>
<p>Еще одно достоинство — код полностью совместим с оригинальным LightBox 2.</p>
<p>Пример использования:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p432">
        <div class="code xhtml" id="p4code32">
<span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">html</span> xmlns<span class="sy0">=</span><span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span><span class="sy0">=</span><span class="st0">&quot;en&quot;</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">head</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">title</span>&gt;</span>Usage Example<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">title</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">meta</span> <span class="kw3">http-equiv</span><span class="sy0">=</span><span class="st0">&quot;Content-Type&quot;</span> <span class="kw3">content</span><span class="sy0">=</span><span class="st0">&quot;text/html; charset=utf-8&quot;</span><span class="sy0">/</span>&gt;</span><br />
<span class="sc-2">&lt;!--[if IE]&gt;</span><br />
<span class="sc-2"> &nbsp; &nbsp;&lt;script type=&quot;text/javascript&quot; defer=&quot;true&quot; id=&quot;init_js&quot; src=&quot;javascript://&quot;&gt;&lt;/script&gt;</span><br />
<span class="sc-2">&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">link</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;protobox.css&quot;</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span> <span class="sy0">/</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;prototype.js&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;effects.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;builder.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;dragdrop.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;odl.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;protobox.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
<span class="sc-2">&lt;!--[if lte IE 6]&gt;</span><br />
<span class="sc-2"> &nbsp; &nbsp;&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;iefixes.css&quot;/&gt;</span><br />
<span class="sc-2">&lt;![endif]--&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">style</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span>&gt;</span>/*<span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span>*<span class="sy0">/</span></span><br />
<span class="sc2"> &nbsp; &nbsp;html, body <span class="br0">&#123;</span> margin: <span class="nu0">0</span>; padding: <span class="nu0">0</span>; <span class="kw3">border</span>: 0<span class="br0">&#125;</span></span><br />
<span class="sc2"> &nbsp; &nbsp;a img <span class="br0">&#123;</span> <span class="kw3">border</span>: <span class="nu0">0</span> <span class="br0">&#125;</span></span><br />
<span class="sc2"> &nbsp; &nbsp;<span class="sy0">/</span>*<span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;</span>*/<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">style</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">head</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;photos/photo1.jpg&quot;</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">&quot;lightbox&quot;</span>&gt;&lt;<span class="kw2">img</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;photos/thumb1.jpg&quot;</span> <span class="kw3">alt</span><span class="sy0">=</span><span class="st0">&quot;&quot;</span> <span class="sy0">/</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;photos/photo2.jpg&quot;</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">&quot;lightbox&quot;</span>&gt;&lt;<span class="kw2">img</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;photos/thumb2.jpg&quot;</span> <span class="kw3">alt</span><span class="sy0">=</span><span class="st0">&quot;&quot;</span> <span class="sy0">/</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;photos/fphoto1.jpg&quot;</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">&quot;lightbox[gallery]&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;Image 1&quot;</span>&gt;&lt;<span class="kw2">img</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;photos/fthumb1.jpg&quot;</span> <span class="kw3">alt</span><span class="sy0">=</span><span class="st0">&quot;&quot;</span> <span class="sy0">/</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;photos/fphoto2.jpg&quot;</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">&quot;lightbox[gallery]&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;Image 2&quot;</span>&gt;&lt;<span class="kw2">img</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;photos/fthumb2.jpg&quot;</span> <span class="kw3">alt</span><span class="sy0">=</span><span class="st0">&quot;&quot;</span> <span class="sy0">/</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
<br />
<span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span>//<span class="sc2">&lt;!<span class="br0">&#91;</span>CDATA<span class="br0">&#91;</span></span><br />
<span class="sc2"> &nbsp; &nbsp;function onDomLoaded<span class="br0">&#40;</span><span class="br0">&#41;</span></span><br />
<span class="sc2"> &nbsp; &nbsp;<span class="br0">&#123;</span></span><br />
<span class="sc2"> &nbsp; &nbsp; &nbsp; &nbsp;initLightbox<span class="br0">&#40;</span></span><br />
<span class="sc2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></span><br />
<span class="sc2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ring &nbsp; &nbsp;: true,</span><br />
<span class="sc2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;protect : true</span><br />
<span class="sc2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="sc2"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span>;</span><br />
<span class="sc2"> &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<br />
<span class="sc2"> &nbsp; &nbsp;odl.register<span class="br0">&#40;</span>onDomLoaded<span class="br0">&#41;</span>;</span><br />
<span class="sc2"><span class="sy0">//</span><span class="br0">&#93;</span><span class="br0">&#93;</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">html</span>&gt;</span>
        </div>
    </div>
</div>

<p><a href="http://blog.sjinks.pro/protobox.zip">Скачать ProtoBox</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/4-protobox-lightbox-reloaded/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/4-protobox-lightbox-reloaded/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>IE6, Sortable и whatever:hover</title>
		<link>http://blog.sjinks.pro/javascript/5-ie6-sortable-whatever-hover/</link>
		<comments>http://blog.sjinks.pro/javascript/5-ie6-sortable-whatever-hover/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 04:20:42 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Draggables]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Sortable]]></category>
		<category><![CDATA[whatever:hover]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/javascript/5-ie6-sortable-whatever-hover/</guid>
		<description><![CDATA[Как подружить whatever:hover и Scriptaculous Работая над одним сайтом, столкнулся с одной проблемой: в IE6 при использовании whatever:hover для выпадающего меню, построенного чисто на CSS, и Scriptaculous (а именно, Sortable, причем для элемента, не имеющего никакого отношения к меню) возникало непонятное мерцание. Страница, на которой проявляется мерцание (только IE6). То, что «виноват» именно Scriptaculous, доказывается [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/5-ie6-sortable-whatever-hover/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как подружить <a href="http://blog.sjinks.pro/tag/whateverhover/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  whatever:hover">whatever:hover</a> и <a href="http://blog.sjinks.pro/tag/scriptaculous/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Scriptaculous">Scriptaculous</a></em></h2>
<p>Работая над одним сайтом, столкнулся с одной проблемой: в <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a> при использовании <a href="http://www.xs4all.nl/~peterned/csshover.html" rel="nofollow">whatever:hover</a> для выпадающего меню, построенного чисто на <a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a>, и <a href="http://script.aculo.us/">Scriptaculous</a> (а именно, <a href="http://blog.sjinks.pro/tag/sortable/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Sortable">Sortable</a>, причем для элемента, не имеющего никакого отношения к меню) возникало непонятное мерцание.<span id="more-5"></span></p>
<p><a href="http://blog.sjinks.pro/test/hover/test.html">Страница, на которой проявляется мерцание</a> (только IE6).<br />
То, что «виноват» именно Scriptaculous, доказывается очень легко: в исходном тексте <code>test.<a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">html</a></code> комментируется строка, создающая Draggable:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p537">
        <div class="code javascript" id="p5code37">
&nbsp; &nbsp; <span class="kw2">var</span> user_id <span class="sy0">=</span> <span class="nu0">5060</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> id <span class="sy0">=</span> <span class="st0">'user_'</span> <span class="sy0">+</span> user_id<span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>$<span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Sortable.<span class="me1">create</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Результат можно увидеть <a href="http://blog.sjinks.pro/test/hover/test2.html">здесь</a> — мерцание исчезло.</p>
<p>Путём долгих и нудных экспериментов были найдены строки, вызывающие такое поведение:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p538">
        <div class="code javascript" id="p5code38">
<span class="kw2">var</span> Draggables <span class="sy0">=</span> <span class="br0">&#123;</span><br />
&nbsp; drags<span class="sy0">:</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">,</span><br />
&nbsp; observers<span class="sy0">:</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">,</span><br />
<br />
&nbsp; register<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">drags</span>.<span class="me1">length</span> <span class="sy0">==</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventMouseUp</span> &nbsp; <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">endDrag</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventMouseMove</span> <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">updateDrag</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventKeypress</span> &nbsp;<span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">keyPress</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mouseup&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseUp</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// &lt;---</span><br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;keypress&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventKeypress</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">drags</span>.<span class="me1">push</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
<span class="co1">//...</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Таким образом, если мы уберём <span class="codebox"><code class="javascript">Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span></code></span>, то мерцание исчезнет. Естественно, это не выход, так как весь код, который прямо или косвенно использует <code><a href="http://blog.sjinks.pro/tag/draggables/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Draggables">Draggables</a></code>, перестанет работать.</p>
<p>Попытаемся решить проблему (лезть в чужой код ой как не хочется). Одно ясно: вызов <span class="codebox"><code class="javascript">Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span></code></span> придется закомментировать. Добавлять обработчик события придется при активации <code>draggable</code> (в функции <span class="codebox"><code class="javascript">Draggables.<span class="me1">activate</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>), а убирать — в <span class="codebox"><code class="javascript">Draggables.<span class="me1">deactivate</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> и <span class="codebox"><code class="javascript">Draggables.<span class="me1">endDrag</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>. Возможно, хватит просто <code>endDrag()</code>, но ничего плохого не случится, если для подстраховки изменим оба метода.</p>
<p>Исходный код:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p539">
        <div class="code javascript" id="p5code39">
&nbsp; register<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">drags</span>.<span class="me1">length</span> <span class="sy0">==</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventMouseUp</span> &nbsp; <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">endDrag</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventMouseMove</span> <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">updateDrag</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventKeypress</span> &nbsp;<span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">keyPress</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mouseup&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseUp</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//&lt;-- нужно закомментировать</span><br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;keypress&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventKeypress</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">drags</span>.<span class="me1">push</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
<br />
&nbsp; activate<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>draggable.<span class="me1">options</span>.<span class="me1">delay</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>._timeout <span class="sy0">=</span> setTimeout<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; Draggables._timeout <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; window.<span class="kw3">focus</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">//&lt;-- здесь нужно повесить обработчик события</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Draggables.<span class="me1">activeDraggable</span> <span class="sy0">=</span> draggable<span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">,</span> draggable.<span class="me1">options</span>.<span class="me1">delay</span><span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; window.<span class="kw3">focus</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// allows keypress events if window isn't currently focused, fails for Safari</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&lt;-- здесь нужно повесить обработчик события</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span> <span class="sy0">=</span> draggable<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
<br />
&nbsp; deactivate<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span> <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span> <span class="co1">//&lt;-- здесь нужно убрать обработчик события</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
<br />
&nbsp; endDrag<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>._timeout<span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; clearTimeout<span class="br0">&#40;</span><span class="kw1">this</span>._timeout<span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>._timeout <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">this</span>.<span class="me1">activeDraggable</span><span class="br0">&#41;</span> <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>._lastPointer <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span>.<span class="me1">endDrag</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span> <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span> <span class="co1">//&lt;-- здесь нужно убрать обработчик события</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span>
        </div>
    </div>
</div>

<p>Окончательный результат:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p540">
        <div class="code javascript" id="p5code40">
&nbsp; register<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">drags</span>.<span class="me1">length</span> <span class="sy0">==</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventMouseUp</span> &nbsp; <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">endDrag</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventMouseMove</span> <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">updateDrag</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">eventKeypress</span> &nbsp;<span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">keyPress</span>.<span class="me1">bindAsEventListener</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mouseup&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseUp</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;keypress&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventKeypress</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">drags</span>.<span class="me1">push</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
<br />
&nbsp; activate<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>draggable<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>draggable.<span class="me1">options</span>.<span class="me1">delay</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>._timeout <span class="sy0">=</span> setTimeout<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; Draggables._timeout <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; window.<span class="kw3">focus</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Draggables.<span class="me1">activeDraggable</span> <span class="sy0">=</span> draggable<span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>.<span class="me1">bind</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span><span class="sy0">,</span> draggable.<span class="me1">options</span>.<span class="me1">delay</span><span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; window.<span class="kw3">focus</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// allows keypress events if window isn't currently focused, fails for Safari</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>draggable<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Event.<span class="me1">observe</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span> <span class="sy0">=</span> draggable<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
<br />
&nbsp; deactivate<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span> <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; Event.<span class="me1">stopObserving</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
<br />
&nbsp; endDrag<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw1">this</span>._timeout<span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; clearTimeout<span class="br0">&#40;</span><span class="kw1">this</span>._timeout<span class="br0">&#41;</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; &nbsp; <span class="kw1">this</span>._timeout <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">this</span>.<span class="me1">activeDraggable</span><span class="br0">&#41;</span> <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>._lastPointer <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span>.<span class="me1">endDrag</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">activeDraggable</span> <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; Event.<span class="me1">stopObserving</span><span class="br0">&#40;</span>document<span class="sy0">,</span> <span class="st0">&quot;mousemove&quot;</span><span class="sy0">,</span> <span class="kw1">this</span>.<span class="me1">eventMouseMove</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><span class="sy0">,</span>
        </div>
    </div>
</div>

<p><a href="http://blog.sjinks.pro/test/hover/test3.html">Всё работает!</a><br />
<a href="http://blog.sjinks.pro/test/hover/patch.diff">Патч в формате unified diff</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/javascript/5-ie6-sortable-whatever-hover/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/javascript/5-ie6-sortable-whatever-hover/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

