<?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>Perlover&#039;s Blog &#187; javascript</title>
	<atom:link href="http://blog.perlover.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.perlover.com</link>
	<description>Blog about Unix, Perl, Firefox, JavaScript and other internet technologies</description>
	<lastBuildDate>Fri, 20 Jan 2012 15:23:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Несколько полезных jQuery модулей от Odyniec</title>
		<link>http://blog.perlover.com/2011/09/27/jquery-plugins-from-odyniec/</link>
		<comments>http://blog.perlover.com/2011/09/27/jquery-plugins-from-odyniec/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 11:02:12 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[CJ/TGP]]></category>
		<category><![CDATA[For AWMs]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Sony Ericsson]]></category>
		<category><![CDATA[tabs]]></category>
		<category><![CDATA[webmaster]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1416</guid>
		<description><![CDATA[Сегодня посмотрел страничку одного разработчика по ник &#8212; имени Odyniec. Очень понравились его разработки. Спешу поделиться с вами imgAreaSelect &#8212; jQuery плугин для кропинга (cropping images) картинок (точнее, выделение области &#8212; кропинг делайте сами ) &#8212; (пример) imgZoom &#8212; Красивое листание картинок с анимацией, ротацией и приближением из далека (пример) selectList &#8212; мультивыборочный select лист, [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня посмотрел страничку одного разработчика по ник &#8212; имени Odyniec. <strong>Очень понравились его разработки</strong>. Спешу поделиться с вами <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li><strong><a href="http://odyniec.net/projects/imgareaselect/" target="_blank">imgAreaSelect</a></strong> &#8212; jQuery плугин <strong>для кропинга</strong> (cropping images) картинок (точнее, выделение области &#8212; кропинг делайте сами <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ) &#8212; (<strong><a href="http://odyniec.net/projects/imgareaselect/examples.html" target="_blank">пример</a></strong>)<strong></strong></li>
<li><strong><a href="http://odyniec.net/projects/imgzoom/" target="_blank">imgZoom</a></strong> &#8212; Красивое <strong>листание картинок с анимацией</strong>, ротацией и приближением из далека (<strong><a href="http://odyniec.net/projects/imgzoom/" target="_blank">пример</a></strong>)<strong></strong></li>
<li><strong><a href="http://odyniec.net/projects/selectlist/" target="_blank">selectList</a></strong> &#8212; <strong>мультивыборочный select лист</strong>, показывающий выбранные опции отдельно с возможностью легкого их удаления (<strong><a href="http://odyniec.net/projects/selectlist/examples.html" target="_blank">пример</a></strong>)</li>
</ul>
<p>Также, автор написал <strong>несколько полезных статей</strong> по CSS (как создать &#171;деревья&#187;, &#171;табы&#187;)</p>
<p>Также, автор написал несколько модулей на perl для <strong><a href="http://search.cpan.org/dist/Dancer/" target="_blank">Dancer</a></strong> (его сайт также <strong>работает под Dancer</strong>): <strong><a href="http://search.cpan.org/dist/Dancer-Plugin-DebugToolbar/" target="_blank">Dancer::Plugin::DebugToolbar</a></strong>, <strong><a href="http://search.cpan.org/dist/Dancer-Plugin-DirectoryView/" target="_blank">Dancer::Plugin::DirectoryView</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/09/27/jquery-plugins-from-odyniec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Массивы JavaScript, Internet Explorer и запятые</title>
		<link>http://blog.perlover.com/2011/02/10/javascript-array-internet-explorer-comma-end/</link>
		<comments>http://blog.perlover.com/2011/02/10/javascript-array-internet-explorer-comma-end/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 13:53:06 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1208</guid>
		<description><![CDATA[Заметил такую особенность &#8212; если описывать массив как То в Firefox и Google Chrome &#8212; он будет иметь 3 элемента, а в Internet Explorer (тестировалось в 8-ой версии) &#8212; 4 элемента, причем 4-ый будет null. Это я все к тому, что некоторые программисты любят писать таким стилем, добавляя везде при этом запятую в конце каждой [...]]]></description>
			<content:encoded><![CDATA[<p>Заметил такую особенность &#8212; если описывать массив как</p>
<pre class="brush: jscript; title: ; notranslate">
var array = [
elem1,
elem2,
elem3,
];
</pre>
<p>То в Firefox и Google Chrome &#8212; он будет иметь 3 элемента, а в <strong>Internet Explorer</strong> (тестировалось в 8-ой версии) &#8212; <strong>4 элемента</strong>, причем <strong>4-ый будет null</strong>.</p>
<p>Это я все к тому, что некоторые программисты любят пис<strong>а</strong>ть таким стилем, добавляя везде при этом запятую в конце каждой строки (чтобы копировать и множить было удобнее).</p>
<p>Оказывается, <strong>такой стиль имеет скрытую угрозу</strong> &#8212; ошибки, когда &#171;прогулка&#187;  по массиву дает null элемент, тогда как такой программист предполагал, что будет три элемента и все &#8212; не null. Вообщем, программеры JavaScript &#8212; остерегайтесь <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><span id="more-1208"></span>На последок &#8212; тестовый HTML файл (сохраните код и откройте в броузере) &#8212; проверьте сами, что выдают броузеры <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: xml; title: ; notranslate">&lt;html&gt;
&lt;body&gt;
&lt;script&gt;var array = [1, 2, 3, ]; alert(array.length) &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/02/10/javascript-array-internet-explorer-comma-end/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Опять Cookies, только теперь Google Chrome</title>
		<link>http://blog.perlover.com/2011/02/08/cookies-google-chrome-quoted-path-bug/</link>
		<comments>http://blog.perlover.com/2011/02/08/cookies-google-chrome-quoted-path-bug/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 18:12:03 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[FireFox]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[RFC]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1192</guid>
		<description><![CDATA[Не успел написать программу, как опять наткнулся на неприятность, точнее, на баг. Смысл его в том, что Google Chrome некорректно ставит в JavaScript свойство document.cookie, если кука пришла от сайта с quoted path, то есть, если пришла такая: Дело в том, что путь, заключенный в кавычки &#8212; правило, определенное самим RFC 2109 (пункт 4.1). Firefox [...]]]></description>
			<content:encoded><![CDATA[<p>Не успел написать программу, как опять <strong>наткнулся </strong>на неприятность, точнее, <strong>на баг</strong>. Смысл его в том, что <strong>Google Chrome некорректно </strong>ставит в JavaScript свойство document.cookie, если кука пришла от сайта с quoted path, то есть, если пришла такая:</p>
<pre class="brush: plain; title: ; notranslate">
Set-Cookie: session=session_ID; path=&quot;/&quot;
</pre>
<p>Дело в том, что путь, заключенный в кавычки &#8212; правило, определенное самим <strong><a href="http://tools.ietf.org/html/rfc2109" target="_blank">RFC 2109</a></strong> (пункт 4.1). Firefox это обрабатывает корректно, а Google Chrome &#8212; глючит. То есть, чтобы в JavaScript от Chrome считывать куки, нужно их выставлять через path без кавычек. Но в любом случае, это некорректно, поэтому <strong><a href="http://www.google.com/support/forum/p/Chrome/thread?tid=75c29af24711fd01&amp;hl=en" target="_blank">отписал об этом</a></strong> на их форум. Посмотрим, как они исправят это <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2011/02/08/cookies-google-chrome-quoted-path-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Еще немного о Roboform и LastPass</title>
		<link>http://blog.perlover.com/2010/12/31/roboform-vs-lastpass-some-info/</link>
		<comments>http://blog.perlover.com/2010/12/31/roboform-vs-lastpass-some-info/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 15:11:57 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Add-ons]]></category>
		<category><![CDATA[For AWMs]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Мобильники]]></category>
		<category><![CDATA[FireFox]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[LastPass]]></category>
		<category><![CDATA[phones]]></category>
		<category><![CDATA[RoboForm]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[webmaster]]></category>
		<category><![CDATA[Автоматизация труда]]></category>
		<category><![CDATA[сисадминам]]></category>
		<category><![CDATA[Формы]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=1101</guid>
		<description><![CDATA[Написал мне недавно суппорт, что они таки устранили баг, о котором я так долго писал! Надо же&#8230; Предложили мне протестировать новую версию (7.1.2). Но я так долго ждал (реально баг есть более года, но последний штурм на саппорт я осуществлял в августе 2010), что это мне надоело, терпеть, пока Firefox тормозит и зависает на сайтах [...]]]></description>
			<content:encoded><![CDATA[<p>Написал мне недавно суппорт, что они таки устранили баг, о котором я так долго писал! Надо же&#8230; Предложили мне протестировать новую версию (7.1.2). Но я так долго ждал (реально баг есть более года, но последний штурм на саппорт я осуществлял в августе 2010), что это мне надоело, терпеть, пока Firefox тормозит и зависает на сайтах с JavaScript, что удалил я этот косячный плагин, тем более, что 7-ая версия (в которой и устранен этот баг) для пользователей 6-ой версии снова стала платной (тут кстати, если помыслить, становится понятно, почему они так тянули с исправлением и исправили во вновь ставшей платной версии&#8230;). Теперь я перешел на LastPass<span id="more-1101"></span>, почти к нему привык, и даже заплатил за Premium account. И далее, я сейчас расскажу о маленьких моих открытиях о LastPass. А Робоформ, я пожалуй, тестировать уже не буду. Если бы 7-ая версия осталась бы для купивших 6-ую &#8212; бесплатной, тогда может быть я попробовал бы вернуться обратно.</p>
<p>Итак, LastPass точно хранит все таки свою базу в одном файле на диске. То есть, в случае недоступности сайта LastPass, или для любителей резервировать свои пароли &#8212; доступ есть. Папка &#8212; &#171;C:\Documents and Settings\&lt;User&gt;\Local Settings\Application Data\LastPass\&#187; и там файл с расширением sxml. Также, хорошая новость еще в том, что на сайте LastPass есть программка, которая может читать этот файл локально, без работы с интернет &#8212; LastPass Pocket. Все это &#8212; очень хорошо <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Также, купив Премиум аккаунт, можно использовать LastPass на мобильных устройствах. Я использую под Android. Те, кто тоже юзают Android, вот наводки &#8212; LastPass можно поставить отдельно, но тогда ходить по сайтам через его же броузер, что не очень хочется (не выключить JavaScript, не понятно, как там обновляется сам броузер и т.п..), либо можно использовать стандартный броузер через букмарклеты (закладки, вместо URL-а которых &#8212; JavaScript код &#8212; вы кликаете в закладках закладки LastPass на нужном сайте для входа и он уже вставляет в страницу сайта логин-окно). Есть и еще способ &#8212; поставить броузер Delphin и к нему расширение LastPass (самый оптимальный вариант). Но повторюсь, все это платно, но не дорого &#8212; $11 в год за аккаунт (заметьте, не за комп, не за лицензию, а за аккаунт &#8212; то есть за $11 вы можете поставить на все свои компы и мобильники). Выгода от Premium на компе тоже есть &#8212; улучшенная защита &#8212; можно защитить вход кодовой таблицей (матрица букв) &#8212; тогда заход с новых компов  (IP адреса точно) будет запрашивать, помимо имени и пароля, еще буквы из таблицы. Минус такого подхода &#8212; мобильные версии не поддерживают такой таблицы. Но можно включить кодовую таблицу для компов, а для мобильников составить список разрешенных устройств через тот же аккаунт в компьютере. Но при кодовой таблице LastPass Pocket будет требовать коннекта к сайту для проверки кодов.</p>
<p>Вот вкратце те тонкости, которые я узнал, поработав с LastPass. С Наступающим Новым 2011 годом!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/12/31/roboform-vs-lastpass-some-info/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Copy Clipboard в Firefox методами JavaScript</title>
		<link>http://blog.perlover.com/2010/06/12/how-copy-clipboard-firefox/</link>
		<comments>http://blog.perlover.com/2010/06/12/how-copy-clipboard-firefox/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 15:36:17 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[FireFox]]></category>
		<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=771</guid>
		<description><![CDATA[Если вы программер под JavaScript, вы навярняка сталкивались с такой проблемой &#8212; как реализовать копирование в буфер обмена средствами JavaScript в Firefox. С Internet Explorer все понятно &#8212; Microsoft &#171;постаралась&#187;, чтобы все, кому не лень, могли читать и писать в буфер обмена средствами JavaScript (по правильному, это конечно же, не должен делать любой сайт &#8212; [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы программер под JavaScript, вы навярняка сталкивались с такой проблемой &#8212; как реализовать копирование в буфер обмена средствами JavaScript в Firefox. С Internet Explorer все понятно &#8212; Microsoft &#171;постаралась&#187;, чтобы все, кому не лень, могли читать и писать в буфер обмена средствами JavaScript (по правильному, это конечно же, не должен делать любой сайт &#8212; мало ли что у вас в буфере обмена на тот момент, например пароль&#8230;). А вот Firefox с его сильной защитой JavaScript, не позволяет любому сайту это делать. Как быть?</p>
<p><span id="more-771"></span>Маленький экскурс &#8212; Firefox позволяет делать копирование в буфер, но разрешает это выполнять либо в chrome приложениях (то есть установленным расширениям, или Add-ons, другими словами), либо подписанным цифровой подписью приложениям в jar архивах &#8212; но при этом, у вас в броузере должен быть установлен корневой сертификат того разработчика, кому вы доверили это делать. Поэтому, обычному сайтовому программеру, как может показаться, ничего не остается, как сгенерировать свой сертификат, попросить посетителя его скачать, а свои JavaScript скрипты упаковать в Jar архив и его подписать. При этом, конечно, при любом изменении кода надо заново будет проделывать: упаковка в Jar, подпись Jar архива (ведь код изменился, а значит и подпись надо менять)&#8230; Именно, по началу, я так и думал, и даже делал (ох и муторно это!). Но есть способ попроще и лучше, но он не такой правильный с точки зрения безопасности. Но он также, как и в случае сертификата, требует определенных действий со стороны пользователя &#8212; также, однократных (сделал и забыл). То есть, как никрути, а просто сделать сайт, который бы читал/писал в буфер Clipboard своего посетителя, не получиться &#8212; все равно потребуется участие посетителя сайта (оно и правильно &#8212; нефиг делать без спросу опасные вещи!).</p>
<p>Итак, все что нужно сделать пользователю сайта &#8212; однократно, и не только для вашего сайта, а в общем для всех сайтов &#8212; это разрешить броузеру &#171;спрашивать&#187; посетителя о том, можно ли исполнять расширенные действия такому то сайту или нет (по умолчанию &#8212; ничего не спрашивается и не исполняется). Если посетитель отвечает, что можно &#8212; броузер запоминает домен, для которого это разрешили, и затем, действует в соответствии с этим разрешением всегда. Если другой сайт захочет, например, поработать с вашим буфером обмена &#8212; броузер снова спросит вас и предупредит, но однократно для этого домена и так далее.</p>
<p>Итак, делаем в броузере: <strong>about:config</strong> в адресной строке, соглашаемся с предупреждением, если таковое есть и там ищем параметр <strong>signed.applets.codebase_principal_support</strong>, ставим его в <strong>true</strong>. Все! Теперь осталось написать JavaScript код, например, копирование текстового значения title ссылки в буфера обмена, например:</p>
<pre class="brush: jscript; title: ; notranslate">// Общая функция копирования - копирует текст переменной maintext в clipboard, рабоает для IE и Firefox
function copy_clip(maintext)
{
 maintext = String(maintext)
 if (window.clipboardData)
   window.clipboardData.setData(&quot;Text&quot;, maintext);
 else if (window.netscape)
  {
   try
    {
     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
     var gClipboardHelper = Components.classes[&quot;@mozilla.org/widget/clipboardhelper;1&quot;].
     getService(Components.interfaces.nsIClipboardHelper);
     gClipboardHelper.copyString(maintext);
    }
   catch(err)
    {
     alert (&quot;Clipboard copying error: &quot; + err); return false
    }
  }
 return true;
}
</pre>
<p>Затем, уже используем дополнительные функции для конкретных типов структуры DOM документа HTML:</p>
<pre class="brush: jscript; title: ; notranslate">function copyObjText(obj)
{
 copy_clip(document.all ? obj.innerText : obj.textContent)
 return false
}

function copyTitleInLink(obj)
{
 copy_clip(obj.title)
 return false
}</pre>
<p>А теперь, если нам надо скопировать в буфер значение поля title у ссылки типа <code>&lt;a title="что то" href="http://..."&gt;&lt;/a&gt;</code>, то делаем так:<code>&lt;a title="что то" onclick="return copyTitleInLink(this)" href="http://..."&gt;</code> Функция copyObjText может копировать текстовое поле тага textarea, например. Также, можно написать другой код для копирования любой информации из вашей страницы &#8212; очень удобно для автоматизации работы с ajax приложениями.</p>
<p>Вот, собственно и все! <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/06/12/how-copy-clipboard-firefox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Javascript &#8212; Middle Button Click</title>
		<link>http://blog.perlover.com/2010/03/14/javascript-middle-button-click/</link>
		<comments>http://blog.perlover.com/2010/03/14/javascript-middle-button-click/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 08:55:14 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Codes]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=648</guid>
		<description><![CDATA[Открываю тему программирования на JavaScript. Недавно решал проблему, казалось бы, тривиальной задачи отслеживания такого события, как middleclick mouse &#8212; клик колесиком мышки. Но на деле, такая задача далеко не тривиальная &#8212; об этом вы даже можете прочесть в хорошей и подробно описывающей статье на английском языке про события в разных броузерах. Итак, в самом JavaScript [...]]]></description>
			<content:encoded><![CDATA[<p>Открываю тему программирования на JavaScript. Недавно решал проблему, казалось бы, тривиальной задачи отслеживания такого события, как middleclick mouse &#8212; клик колесиком мышки. Но на деле, такая задача далеко не тривиальная &#8212; об этом вы даже можете прочесть в <a href="http://unixpapa.com/js/mouse.html" target="_blank">хорошей и подробно описывающей статье</a> на английском языке про события в разных броузерах.</p>
<p><span id="more-648"></span>Итак, в самом JavaScript есть такое событие клика мышки &#8212; тип &#8216;click&#8217;. Но данное событие вырабатывается только при клике левой кнопкой мыши (исключения &#8212; IE &amp; Safari). Стандарт W3C описывает событие click, но там не сказано про то, от какой кнопки мыши оно должно происходить. Видимо, от этого в броузерах наблюдается полная <a href="http://unixpapa.com/js/mouse.html" target="_blank">анархия</a> с этим делом.</p>
<p>Зачем мне понадобилось отслеживать событие middle click? Например, в броузере Firefox (в Chrome и Internet Explorer 7.0 и выше) клик колесиком мышки по ссылке приводит к ее открытию в новом табе в фоновом режиме, и страница, на которой кликают, продолжает &#171;висеть&#187; перед глазами пользователя. Мне лично нравиться так &#171;сёрфить&#187;, так как это удобно, и следовательно, подумал я, так делают многие (по моим последним данным, рассчитанным на основе 65 тыс. кликов &#8212; 2.5% из них &#8212; клик колесиком мышки). Но, к сожалению, такой удобный клик не генерирует событие &#8216;click&#8217; на уровне API разработчика. Мне нужно было отслеживать клики для сбора статистики, и для полноты картины я хотел учитывать даже эти клики. Но такого типа события в броузерах нет. Что делать?</p>
<p>Для начала, хочу сказать, что этот дурацкий Internet Explorer (ужасный броузер, особенно для программиста JavaScript) все таки генерирует событие &#8216;click&#8217; на клик колесиком (Safari также). То есть под IE можно не стараться отслеживать его, а просто отследить событие click (там также middleclick открывает ссылку в новом табе). А вот с Firefox и другими (Opera 8.x и новее, например) придется постараться. Они генерируют только события mousedown &amp; mouseup и все. Чтобы понять событие, надо отследить оба эти и еще одно событие &#8212; не ушла ли мышка на другой объект &#8212; ведь если между нажатием и отпусканием колесика пользователь двигал мышкой &#8212; событием клика это нельзя считать.</p>
<p>Я написал и использую два варианта кода &#8212; один для <a href="http://jquery.com/" target="_blank">jQuery</a>, другой в проектах, где jQuery не используется. Вот куски кодов:</p>
<h3>jQuery:</h3>
<pre class="brush: jscript; title: ; notranslate">jQuery.event.special.middleclick = {
    setup: function(data, namespaces) {
        var elem = this, $elem = jQuery(elem);
        $elem.bind('mousedown mouseup mouseout', jQuery.event.special.middleclick.handler);
    },

    teardown: function(namespaces) {
        var elem = this, $elem = jQuery(elem);
        $elem.unbind('mousedown mouseup mouseout', jQuery.event.special.middleclick.handler);
    },

    handler: function(event) {
        var elem = this, $elem = jQuery(elem);
        if (event.type == 'mousedown' &amp;&amp; event.which == 2)
          $elem.data('mouseTrigger', 1);
        else
          if (event.type == 'mouseout')
            $elem.data('mouseTrigger', 0);
          else
            if (event.type == 'mouseup')
             {
              if (event.which == 2 &amp;&amp; $elem.data('mouseTrigger'))
               {
                event.type = &quot;middleclick&quot;;
                jQuery.event.handle.apply(this, arguments)
               }
              $elem.data('mouseTrigger', 0);
             }
    }
};
</pre>
<h3>JavaScript без jQuery:</h3>
<pre class="brush: jscript; title: ; notranslate">mouseTrigger = function (elem, event)
{
 var nButton;

 if (document.all)
  {
   event = window.event;
   nButton = 4;
  }
 else
  {
   nButton = 1;
  }
 if (event.type == 'mousedown' &amp;&amp; event.button == nButton)
   elem.mouseTrigger = 1;
 else
   if (event.type == 'mouseout')
     elem.mouseTrigger = 0;
   else
     if (event.type == 'mouseup')
      {
       if (event.button == nButton &amp;&amp; elem.mouseTrigger)
         ourHandler(elem);
       elem.mouseTrigger = 0;
      }
 return true;
}</pre>
<p>Оба эти способа требуют установки обработчика событий &#8212; handler в виде функции function () {}. И тут есть важный момент. Поскольку оба моих предложенных варианта работают как под IE, так и под Firefox, возникает проблема в IE &#8212; сначала происходит моё событие и дергает ваш handler, затем IE производит событие click, которые, как правило, обрабатываются тем же обработчиком (я привожу в пример вариант, когда мы хотим отслеживать все клики по линкам &#8212; и обычные, и middleclick). То есть в IE на один клик колесиком мышки дергается два раза handler. Самым простым и эффективным решением лично я нашел способ исключения второго клика путем замерения времени &#8212; если наш handler на тот же элемент DOM дергают два раза с разницой менее 500 мс, значит это IE с его вторым click:</p>
<h3>jQuery:</h3>
<p>Для jQuery варианта наш handler должен выглядеть и устанавливаться так (для всех линков, которые залинкованы на картинки, например):</p>
<pre class="brush: jscript; title: ; notranslate">$('a &gt; img').bind('click middleclick', function (event)
   {
    var now = +new Date;
    if ($(this).data('lastClick') &amp;&amp; now - $(this).data('lastClick') &lt; 500)
      return; // Дубликат клика, например IE
    $(this).data('lastClick', now);

    // Здесь уже идет код нашего обработчика ...
   });
</pre>
<p>В этом примере, мы ищем все линки, которые линкуются на картинки, и ставим на них обработку двух событий &#8212; события &#8216;click&#8217; и своего события &#8216;middleclick&#8217;. Последнее событие реализовано через API jQuery как свой новый тип события &#8212; &#8216;middleclick&#8217;.</p>
<h3>JavaScript без jQuery:</h3>
<pre class="brush: jscript; title: ; notranslate">function ourHandler(elem)
{
var now = +new Date;
if (elem.lastClick &amp;&amp; now - elem.lastClick &lt; 500)
return;
elem.lastClick = now;

// Здесь уже идет код нашего обработчика ...
}
</pre>
<p>На этом я заканчиваю эту статейку. Надеюсь, эти примеры помогут вам лучше отслеживать клики на ваших страницах <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/03/14/javascript-middle-button-click/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Как избавиться от сообщения &#171;Unresponsive script&#187; в Firefox</title>
		<link>http://blog.perlover.com/2010/02/23/fix-unresponsive-script-firefox/</link>
		<comments>http://blog.perlover.com/2010/02/23/fix-unresponsive-script-firefox/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 20:48:47 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[FireFox]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=716</guid>
		<description><![CDATA[﻿﻿Если вы часто работаете с сайтами, где используются интенсивные JavaScript вычисления, то вы навярняка сталкивались с таким сообщением «Unresponsive script». Оно выскакивает в Firefox, когда JavaScript использует под себя долгое время все процессорное время вашего компьютера. Firefox это замечает, скрипт приостанавливает, а вас спрашивает &#8212; продолжать выполнение скрипта или нет. Это, с одной стороны, хорошая [...]]]></description>
			<content:encoded><![CDATA[<p>﻿﻿Если вы часто работаете с сайтами, где используются интенсивные JavaScript вычисления, то вы навярняка сталкивались с таким сообщением «Unresponsive script». Оно выскакивает в Firefox, когда JavaScript использует под себя долгое время все процессорное время вашего компьютера. Firefox это замечает, скрипт приостанавливает, а вас спрашивает &#8212; продолжать выполнение скрипта или нет. Это, с одной стороны, хорошая фича Файрфокса, с другой &#8212; весьма надоедливая и неприятная, когда ваша работа требует каждодневного использования скриптов с такими вычислениями (например, массивные обработки крупной статистики).</p>
<p>Но это сообщение можно либо отключить совсем, либо увеличить лимит срабатывания. Для этого, наберите в строке броузера &#171;<a href="http://kb.mozillazine.org/About:config" target="_blank">about:config</a>&#171;, если будет предупреждение об осторожности смены настроек, согласитесь с ним. Там в строке фильтра неберите &#171;dom.max_&#187;, Fire Fox отфильтрует вам настройки, в том числе такую &#8212; <a href="http://kb.mozillazine.org/Dom.max_script_run_time" target="_blank"><strong>dom.max_script_run_time</strong></a>. Кликнете по ней и установите значение либо в ноль &#8212; отключить предупреждение, либо более 10 &#8212; это количество секунд, сколько максимум может использовать скрипт под себя процессорного времени &#8212; в таком случае, предупреждение будет появляться реже и только в крайних случаях.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2010/02/23/fix-unresponsive-script-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Каков % пользователей с JavaScript?</title>
		<link>http://blog.perlover.com/2009/12/18/javascript-enabled-users/</link>
		<comments>http://blog.perlover.com/2009/12/18/javascript-enabled-users/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 08:50:55 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Для Webmasters]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[For AWMs]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=671</guid>
		<description><![CDATA[На своих нескольких проектах уже замечал неоднократно такую статистику &#8212; по моим данным, только 70-73% рядовых пользователей интернета имеют включеную поддержку JavaScript. Сразу хочу заметить, что не Java, а JavaScript! Делаю эту поправку потому, что некоторые ошибочно думают, смотря в Google Analytics или в данные некоторых других счетчиков в  колонку Java (там, как правило, цифры [...]]]></description>
			<content:encoded><![CDATA[<p>На своих нескольких проектах уже замечал неоднократно такую статистику &#8212; по моим данным, только 70-73% рядовых пользователей интернета имеют включеную поддержку <a href="http://ru.wikipedia.org/wiki/JavaScript" target="_blank">JavaScript</a>. Сразу хочу заметить, что не <a href="http://ru.wikipedia.org/wiki/Java" target="_blank">Java</a>, а JavaScript! Делаю эту поправку потому, что некоторые ошибочно думают, смотря в <a href="http://www.google.com/analytics/" target="_blank">Google Analytics</a> или в данные некоторых других счетчиков в  колонку Java (там, как правило, цифры за 90%). А ведь <strong>счетчики сами работают на JavaScript</strong>, и визит посетителя <strong>с отключенным JavaScript они просто не зафиксируют</strong>!</p>
<p><strong>Как я посчитал эти цифры?</strong> Возьмем, к примеру логи Apache сервера. Они показывают сколько реально было загрузок какой либо страницы. Берем данные о загрузке страницы из этих логов -V1, затем смотрим, сколько нам посчитал счетчик, например Google Analytics &#8212; V2 (я обсчитывал статистику даже своими JavaScript счетчиками на основе <a href="http://ru.wikipedia.org/wiki/Ajax" target="_blank">Ajax</a>). V1 &#8212; сколько всего смотрело людей, а V2 &#8212; у скольки включен скрипт. V2 всегда будет меньше V1, и если посчитать по формуле <strong>V2/V1*100%, то получится 70-73%</strong>. Проверьте сами! <img src='http://blog.perlover.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Конечно, могут возразить &#8212; боты и все такое… Но я замерял на разных проектах &#8212; на известных и нет, и из разных источников. Цифры всегда были примерно одинаковые. Не верю, что везде процент ботов одинаковый!</p>
<p>Так что <strong>помните об этом</strong>, когда создаете страницу, работающую только на чистом JavaScript коде!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/12/18/javascript-enabled-users/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

