Clicky 0.3b для WordPress и проблемы с JavaScript
Исправляем ошибки JavaScript в Clicky 0.3b для WordPress
В Австралии и США большой популярностью пользуется плагин Clicky — Web Analytics 2.0. Как следует из названия, Clicky является еще одним сервисом для анализа статистики веб-сайта. Судя по приведённой на сайте таблице, Clicky, образно говоря, "затыкает за пояс" даже такого конкурента, как Google Analytics.
Себе на сайты я ставить Clicky не пытался, но наблюдал его в действии в проекте, над которым работаю. Могу сказать, что сервис действительно мощный и удобный, а плагин Clicky для WordPress относится к разряду "сконфигурировал и забыл".
Всё хорошо, но по традиции есть одно "но": если на странице используется, например, Prototype, то плагин начинает кидаться ошибками JavaScript.
А ошибка там банальная: при поиске cookies автор использовал конструкцию for ... in и предполагал, что все перебираемые свойства окажутся строковыми. Для "голого" браузера это справедливо. Но как только какой-либо скрипт (например, Prototype) расширит прототип Array своими методами, начинаются ошибки. А всё дело в том, что при добавлении новых свойств или методов в прототип объекта у нас нет возможности пометить их как неперечисляемые (non-enumerable), то есть такими, чтобы for ... in их пропускал.
Решение простое: использовать обычный for вместо for ... in. Что, собственно говоря, нижеприведённый патч и делает. А также добавляет секцию <![CDATA[ ... ]]> внутрь скрипта, чтобы не было проблем с XHTML-контентом.
--- clicky-original/clicky.php 2007-06-14 12:33:40.000000000 +0300
+++ clicky/clicky.php 2008-06-25 17:40:07.000000000 +0300
@@ -27,15 +27,17 @@
if( get_option('wpgc_visitornames')) {
echo "
- <script type='text/javascript'>
+ <script type='text/javascript'>/*<![CDATA[*/
function clicky_get_cookie( name ) {
var ca = document.cookie.split(';');
- for( var i in ca ) {
+ var len = ca.length;
+ for( var i=0; i<len; ++i ) {
if( ca[i].indexOf( name+'=' ) > -1 ) return decodeURIComponent( ca[i].split('=')[1] );
}
return '';
}
var clicky_custom_session = { username: clicky_get_cookie( 'comment_author_".md5( get_option( "siteurl" ))."' ) };
+ /*]]>*/
</script>\n";
}


[...] Источник [...]