<?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>hudson@work &#187; jquery</title>
	<atom:link href="http://hudson.su/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://hudson.su</link>
	<description>статьи о web-разработке, менеджменте IT проектов и контроле качества</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Symfony: прячем фильтры в админ-генераторе</title>
		<link>http://hudson.su/2010/09/09/symfony-hide-filters-in-admin-generator/</link>
		<comments>http://hudson.su/2010/09/09/symfony-hide-filters-in-admin-generator/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 12:08:55 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1602</guid>
		<description><![CDATA[Фильтры в админ-генераторе штука хорошая, но всегда думаешь куда бы их пристроить на странице. Если полей в модели больше чем 3-5 это становится проблемой. Предлагаю вашему вниманию небольшой трюк по этому поводу. Нам потребуется JQuery, любимый редактор и немного терпения: Для начала посмотрим как выглядит DOM для блока админ-генератора: И он же &#8220;вживую&#8221;: Что мы [...]]]></description>
			<content:encoded><![CDATA[<p>Фильтры в админ-генераторе штука хорошая, но всегда думаешь куда бы их пристроить на странице. Если полей в модели больше чем 3-5 это становится проблемой. Предлагаю вашему вниманию небольшой трюк по этому поводу. Нам потребуется JQuery, любимый редактор и немного терпения:</p>
<p><span id="more-1602"></span></p>
<p>Для начала посмотрим как выглядит DOM для блока админ-генератора:</p>
<p><a rel="lightbox" href="http://hudson.su/files/2010/09/admingeneratorarticle.png"><img class="alignnone size-medium wp-image-1603" src="http://hudson.su/files/2010/09/admingeneratorarticle-300x73.png" alt="" width="300" height="73" /></a></p>
<p>И он же &#8220;вживую&#8221;:</p>
<p><a rel="lightbox" href="http://hudson.su/files/2010/09/admingeneratorarticle02.png"><img class="alignnone size-medium wp-image-1607" src="http://hudson.su/files/2010/09/admingeneratorarticle02-300x112.png" alt="" width="300" height="112" /></a></p>
<p>Что мы хотим с этим сделать?</p>
<ul>
<li>Спрятать фильтры для этого и всех остальных админ-генераторов.</li>
<li>Для отображения заиметь ссылку или кнопку.</li>
<li>Потратить как можно меньше времени на это.</li>
</ul>
<p>Как мы это будем делать? Для начала скачаем и подключим к проекту JQuery. Я это сделаю при помощи плагина sfJqueryReloadedPlugin. Вы же можете поступать как вам нравится.</p>
<p>Далее создадим ссылку, кликая на которую можно будет показать/скрыть фильтры:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// прячем/показываем фильтры</span>
  <span style="color: #003366; font-weight: bold;">var</span> filter_show_hide <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;a&gt;'</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// создаем DOM элемент</span>
    .<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'href'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'#'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'id'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'filter-show-hide'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'toggle filters ∇'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fontWeight'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'bold'</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// немного стиля</span>
    .<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'margin'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'5px'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#sf_admin_bar'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toggle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#filter-show-hide&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'toggle filters ∇'</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// изменяем текст ссылки</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#filter-show-hide&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'toggle filters Δ'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">else</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#filter-show-hide&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;toggle filters ∇&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Обратите внимание на то что мы меняем html тело ссылки &#8211; дельта (свернуть) , набла (развернуть). Можно использовать картинки, стрелочки и все что вам нравится.</p>
<p>После этого нам остается добавить нашу кнопку-ссылку над фильтрами и скрыть фильтр по умолчанию:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// ...</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#sf_admin_bar'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">before</span><span style="color: #009900;">&#40;</span>filter_show_hide<span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// размещаем ссылку перед фильтром</span>
    .<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// скрываем фильтры</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>И добавить несколько стилей:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">&lt;style type<span style="color: #00AA00;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span><span style="color: #00AA00;">&gt;</span>
  <span style="color: #cc00cc;">#sf_admin_bar</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span><span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* чтобы блок не плавал справа - теперь он располагается над списком */</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* прячем фильтры средствами CSS - в принципе скриптом при загрузке можно и не прятать - это паранойя */</span>
  <span style="color: #00AA00;">&#125;</span>
  <span style="color: #cc00cc;">#sf_admin_bar</span> <span style="color: #6666ff;">.sf_admin_filter</span> form table <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">700px</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* делаем немного пошире таблицу с фильтрами */</span>
  <span style="color: #00AA00;">&#125;</span>
&lt;/style<span style="color: #00AA00;">&gt;</span></pre></div></div>

<p>И вуаля:</p>
<p><a rel="lightbox" href="http://hudson.su/files/2010/09/admingeneratorarticle03.png"><img class="alignnone size-medium wp-image-1612" src="http://hudson.su/files/2010/09/admingeneratorarticle03-300x162.png" alt="" width="300" height="162" /><br />
</a></p>
<p>Быстро, просто, не геморно. ))</p>
<p>Code with fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/09/09/symfony-hide-filters-in-admin-generator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JQueryUI accordion и checkbox</title>
		<link>http://hudson.su/2010/03/21/jqueryui-accordion-i-checkbox/</link>
		<comments>http://hudson.su/2010/03/21/jqueryui-accordion-i-checkbox/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 18:57:25 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1228</guid>
		<description><![CDATA[Пока нет времени на &#8220;большую&#8221; и &#8220;полезную&#8221; статью, публикую небольшой сниппет. Цель: в jquery ui аккордеоне в шапке блока требуется разместить чекбокс и повесить на его onclick некий хэндлер. &#60;div id="my-accordion"&#62; &#60;h3&#62; &#60;a href="#"&#62; &#60;input type="checkbox" onclick="someFunction();"&#62; Title &#60;/a&#62; &#60;/h3&#62; &#60;div id=""&#62; content &#60;/div&#62; &#60;/div&#62; Проблема: в чекбоксе не ставится галка при клике на нее [...]]]></description>
			<content:encoded><![CDATA[<p>Пока нет времени на &#8220;большую&#8221; и &#8220;полезную&#8221; статью, публикую небольшой сниппет.</p>
<p><strong>Цель</strong>:</p>
<p>в jquery ui аккордеоне в шапке блока требуется разместить чекбокс и повесить на его onclick некий хэндлер.</p>
<p><span id="more-1228"></span></p>
<pre>&lt;div id="my-accordion"&gt;
 &lt;h3&gt;
 &lt;a href="#"&gt;
 &lt;input type="checkbox" onclick="someFunction();"&gt;
 Title
 &lt;/a&gt;
 &lt;/h3&gt;
 &lt;div id=""&gt;
 content
 &lt;/div&gt;
&lt;/div&gt;</pre>
<p><strong>Проблема</strong>:</p>
<p>в чекбоксе не ставится галка при клике на нее (более того, добиться нормальной работы чекбокса даже программным способом не получается).</p>
<p><strong>Решение</strong>:</p>
<p>вставить перед аккордеоном или в onLoad блок следующий код:</p>
<pre>$("#my-accordion h3 input").click(function(evt) {
  evt.stopPropagation();
});
</pre>
<p>После этого с чекбоксом можно нормально работать.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/03/21/jqueryui-accordion-i-checkbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Асинхронный пул на jQuery</title>
		<link>http://hudson.su/2010/02/17/asynchronous-pool-on-jquery/</link>
		<comments>http://hudson.su/2010/02/17/asynchronous-pool-on-jquery/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 08:30:41 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[web разработка]]></category>
		<category><![CDATA[продвинутый]]></category>
		<category><![CDATA[урок]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=943</guid>
		<description><![CDATA[Приведенный ниже скрипт имеет скорее теоретический нежели практический интерес. Итак, постановка задачи: Есть скрипт получения некоего набора данных (JSON). Требуется на основе этого набора данных циклически вызывать асинхронный запрос, который выполняет действия на основе входных данных от первого скрипта. При этом требуется лимитировать число одновременно запущенных асинхронных процессов (чтобы не порождать десятки или даже сотни [...]]]></description>
			<content:encoded><![CDATA[<p>Приведенный ниже скрипт имеет скорее теоретический нежели практический интерес.</p>
<h3>Итак, постановка задачи:</h3>
<ul>
<li>Есть скрипт получения некоего набора данных (JSON).</li>
<li>Требуется на основе этого набора данных циклически вызывать асинхронный запрос, который выполняет действия на основе входных данных от первого скрипта.</li>
<li>При этом требуется лимитировать число одновременно запущенных асинхронных процессов (чтобы не порождать десятки или даже сотни запросов сразу).</li>
</ul>
<h3>Алгоритм решения:</h3>
<ul>
<li>Получить JSON с данными для последующей обработки.</li>
<li>Для каждого элемента в полученных данных:</li>
<li>&#8211; Если пул не заполнен &#8211; запустить асинхронный процесс.</li>
<li>&#8211; Если пул заполнен &#8211; ждать пока в пуле освободится слот.</li>
<li>По окончанию обработки данных очистить пул.</li>
</ul>
<h3>Проблема:</h3>
<ul>
<li>Если организовывать опрос пула циклически, съедается 100% одного ядра CPU, начинает дико тормозить интернет-обозреватель и в конце концов может аварийно завершить работу.</li>
</ul>
<p>Как можно реализовать скрипт для данной задачи &#8211; смотрите ниже:</p>
<p><span id="more-943"></span><br />
Начнем с приминания травы &#8211; заготовим каркас страницы:</p>
<pre>&lt;html&gt;
&lt;head&gt;
 &lt;title&gt;asynchronous pool on jquery demo&lt;/title&gt;
 &lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script&gt;
// тут будет наш скрипт
&lt;/script&gt;
&lt;div&gt;
 &lt;div id="stat"&gt;тут статистика&lt;/div&gt;
 &lt;div id="ajax-results"&gt;тут результаты&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Небольшая теоретическая вводная по эмуляции многопоточности в javascript: <a href="http://javascript.ru/blog/tenshi/mnogopotochnyi-yavaskript" target="_blank">http://javascript.ru/blog/tenshi/mnogopotochnyi-yavaskript</a>. Что дает эта статья? Способ избежать 100%-й загрузки CPU. Применяем:</p>
<pre>&lt;script&gt;
/**
 * Emulate mulithreading
 */
Function.prototype.process = function( state ){
  var process = function(){
  var args = arguments;
  var self = arguments.callee;
  setTimeout( function( ){
      self.handler.apply( self, args );
    }, 500 )
  }
  for( var i in state ) process[ i ]= state[ i ];
  process.handler= this;
  return process;
}</pre>
<p>Sleep позволяет добиться некоего подобия многопоточности, так как &#8220;форкает&#8221; таймер с callback-функцией, где переопределяется self.handler. Также нам понадобится менеджер пула:</p>
<pre>/**
 * Pool manager
 */
 $.poolManager = function( input, id, data ){
   switch( input.message ){
     case 'start':
       if( this.state !== 'wait' ) return this( input, id, data );
       this.state = 'run';
       this.iteration = 0;
     case 'next':
       if( this.state !== 'run' ) return;
       this.iteration++;
       if( !$.pushInPool( id, data ) ) return this( { message: 'next' }, id, data ); // no slot in pool
       return this( { message: 'finish' } );
     case 'finish':
       if( this.state !== 'run' ) return;
       this.state= 'wait';
       return;
     return;
   }
}.process({ state: 'wait' })</pre>
<p>Пока этот код нам ничего не дает. Добавим стартер процесса:</p>
<pre>/**
 * Main entry point
 */
 $.main = function(){
   $.results_container = $( "#ajax-results" );
   $.results_container.html( "" );
   $.results_container.append( $( "&lt;div&gt;" ).html( "Chunk size: " + $.pool_settings["chunk_size"] + "; Pool size: " + $.pool_settings["pool_size"] ) );

   // get data
   $.getJSON(
     "getData.php",
     {chunk_size: $.pool_settings["chunk_size"]},
     function( data ) {
       for( i in data ){
         $.poolManager( {message:"start"}, "i-"+i, data[i] );
       }
     }
   );
   // flush pool when finished
   $.threads_pool = [];
 }</pre>
<p>В данной функции получаем данные и запускаем цикли их обработки. Изначально вместо for(&#8230;) $.poolManager(&#8230;) была конструкция вида</p>
<ul>
<li>для каждого чанка</li>
<li>пока не добавлен в пул запусти таймер на N милисекунд</li>
</ul>
<p>Логичная вроде бы конструкция. Только вот она и съедала 100% CPU, приводила к подвисанию и даже крэшу браузера. Давайте теперь взглянем на вставку задачи в пул:</p>
<pre>/**
 * Push active work in pool
 */
 $.pushInPool = function( id, data ){
   if( $.sizeof( $.threads_pool ) &lt; this.pool_settings["pool_size"] ){
     $.threads_pool.push( id );
     $.workChunk( id, data );
     return true;
   }
   return false;
 }</pre>
<p>Тут все просто &#8211; если размер пула равен критическому, возвращаем &#8220;ложь&#8221;, если нет, то добавляем в массив значение с ID треда и запускаем воркер для текущего чанка. Воркер выглядит так:</p>
<pre>/**
 * Do one chunk of work
 */
 $.workChunk = function( id, data ){
   $.results_container
     .append( $( "&lt;div&gt;" )
     .html(
       "Iteration. Working with " + $.sizeof( data ) + " items"
       + "&lt;div id="+id+" style='display:inline;'&gt;&lt;img src='indicator.gif'&gt;"
   ));
   $.ajax({
     type: "POST",
     url: "doAction.php",
     data: {},
     success: function( data, textStatus, XMLHttpRequest ){
       $.success_threads++;
       $( "#"+id ).html( " - &lt;b style='color:green;'&gt;OK&lt;/b&gt;" );
     },
     complete: function( XMLHttpRequest, textStatus ){
       $.removeFromPool( id );
       $("#stat").html("").append("Success: " + $.success_threads + "&lt;br&gt;Failed: " + $.failed_threads + "&lt;br&gt;Success percentage: " + (($.success_threads)/($.success_threads+$.failed_threads))*100 );
     },
     error: function( XMLHttpRequest, textStatus, errorThrown ){
       $.failed_threads++;
       $( "#"+id ).html( " - &lt;b style='color:red;'&gt;FAILED&lt;/b&gt;" );
     }
 });
 }</pre>
<p>Самый главный тут &#8211; ajax запрос, он же, вне зависимости от того как отработает, удаляет процесс из пула:</p>
<pre>/**
 * Remove finished work from pool
 */
 $.removeFromPool = function( id ){
   for( i in $.threads_pool ){
     if( $.threads_pool[i] == id ){
       $.threads_pool.splice( i, 1 );
       return true;
     }
   }
   return false;
 }</pre>
<p>Для удаления делаем проход по пулу и ищем ID текущего чанка и если находим, вырезаем при помощи splice.</p>
<p>Вот в общем-то и все.</p>
<p><a href="http://hudson.su/wp-content/demo/2010/02/async-pool-demo/" target="_blank">Можете попробовать демо</a>.</p>
<p>Или <a href="http://hudson.su/?attachment_id=945" target="_blank">скачать пример себе</a>:</p>
<ul>
<li>распакуйте его в любой директории вашего веб-сервера, где выполнится PHP скрипт и запустите asynchronous-pool-on-jquery.php.</li>
<li>В комплект входят также:</li>
<li>getData.php &#8211; скрипт эмулирует отдачу JSON данных</li>
<li>doAction.php &#8211; воркер, который имеет случайную задержку (чтобы локально все отрабатывало не так быстро) и с вероятностью около 50% он возвращает error 500 &#8211; для того чтобы протестировать исключение чанка из пула при ошибке.</li>
</ul>
<p>Вот в общем-то и все. Надеюсь было интересно )</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/02/17/asynchronous-pool-on-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Иконки в jQuery UI. Небольшой хинт по смене классов ui-state-default/ui-state-hover.</title>
		<link>http://hudson.su/2010/02/02/jquery-ui-icons-hover-hint/</link>
		<comments>http://hudson.su/2010/02/02/jquery-ui-icons-hover-hint/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 23:33:13 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryui]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=801</guid>
		<description><![CDATA[Замечательный фреймворк jQuery имеет не менее замечательную библиотеку jQuery UI. С ними мне живется в общем-то хорошо, но иногда вылезают всякие забавные грабли. Об одних я расскажу двумя строчками ниже. Нынешние грабли связаны со стандартными иконками jQueryUI. В приложении ThemeRoller они отличненько регируют на наведение мыши: Обычно я этими иконками не пользуюсь, но вот прижало, [...]]]></description>
			<content:encoded><![CDATA[<p>Замечательный фреймворк jQuery имеет не менее замечательную библиотеку jQuery UI. С ними мне живется в общем-то хорошо, но иногда вылезают всякие забавные грабли. Об одних я расскажу двумя строчками ниже.</p>
<p><span id="more-801"></span>Нынешние грабли связаны со стандартными иконками jQueryUI. В приложении <a href="http://jqueryui.com/themeroller/" target="_blank">ThemeRoller</a> они отличненько регируют на наведение мыши:</p>
<p><a href="http://hudson.su/wp-content/blogs.dir/1/files/2010/02/ui-icon-hover.png"><img class="alignnone size-full wp-image-802" src="http://hudson.su/wp-content/blogs.dir/1/files/2010/02/ui-icon-hover.png" alt="" width="506" height="197" /></a></p>
<p>Обычно я этими иконками не пользуюсь, но вот прижало, потребовалось сделать &#8211; чтобы быстро и красиво. Иконки вставить по образу и подобию не сложно:</p>
<pre>&lt;ul id="icons" class="ui-widget ui-helper-clearfix"&gt;
   &lt;li class="ui-corner-all ui-state-default"&gt;
     &lt;span class="ui-icon ui-icon-circle-triangle-w"&gt;&lt;/span&gt;
   &lt;/li&gt;
 &lt;/ul&gt;
</pre>
<p>Кул. НО. Не сразу, но я заметил что на hover они не реагируют. Копание в кишках UI не помогло, классы которые я пытался выдрать из примера работали (если работали) некорректно. Однако, немного порывшись в подгружаемых скриптах обнаружил следующий код:</p>
<pre>$(function(){
 //...
 //hover states on the static widgets
 $('#dialog_link, ul#icons li').hover(
   function() { $(this).addClass('ui-state-hover'); },
   function() { $(this).removeClass('ui-state-hover'); }
 );
});</pre>
<p>Как говорится, ларчик просто открывался ) Hover класс биндится средствами jQuery после загрузки страницы. А еще у этих иконок плюс в том что они выполнены одним спрайтом и на hover не приходится подгружать отдельные картинки (теоретически туда можно и что-то свое дорисовать, но еще не пробовал).</p>
<p>Надеюсь вам этот совет поможет сэкономить 30-60 минут и потратить их на что-то полезное.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/02/02/jquery-ui-icons-hover-hint/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>jquery.maphilight.js &#8211; патч для IE8</title>
		<link>http://hudson.su/2009/09/30/jquery-maphilight-js-patch-ie8/</link>
		<comments>http://hudson.su/2009/09/30/jquery-maphilight-js-patch-ie8/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 23:31:00 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=98</guid>
		<description><![CDATA[Забавный плагин для подсветки AREA элементов в MAP &#8211; jquery.maphilight.js (http://plugins.jquery.com/project/maphilight). Как работает &#8211; лучше посмотреть официальную документацию. Все бы ничего, но последний апдейт датирован весной 2008 года, когда IE 8 еще не было. Соответственно в нем он и не работает: Недопустимый аргумент. jquery.maphilight.min.js, строка 1 символ 1166 (в несжатом файле jquery.maphilight.min.js, строка 63). Как [...]]]></description>
			<content:encoded><![CDATA[<p>Забавный плагин для подсветки AREA элементов в MAP &#8211; <strong>jquery.maphilight.js</strong> (<a href="http://plugins.jquery.com/project/maphilight">http://plugins.jquery.com/project/maphilight</a>). Как работает &#8211; лучше посмотреть официальную документацию. Все бы ничего, но последний апдейт датирован весной 2008 года, когда IE 8 еще не было. Соответственно в нем он и не работает:<br />
<span id="more-98"></span></p>
<pre>Недопустимый аргумент.  jquery.maphilight.min.js, строка 1 символ 1166</pre>
<p>(в несжатом файле <code>jquery.maphilight.min.js, строка 63</code>). Как оказалось, это дело поправимое. Строки 63 и 64 выглядят так:</p>
<pre>
document.createStyleSheet().addRule(&quot;v\:*&quot;, &quot;behavior: url(#default#VML); antialias: true;&quot;); //IE8 chokes on this line.
document.namespaces.add(&quot;v&quot;, &quot;urn:schemas-microsoft-com:vml&quot;);
</pre>
<p>Их нужно заменить на:</p>
<pre>
document.namespaces.add(&quot;v&quot;, &quot;urn:schemas-microsoft-com:vml&quot;);
var style = document.createStyleSheet();var shapes = ['shape','rect', 'oval', 'circ', 'fill', 'stroke', 'imagedata', 'group','textbox'];&nbsp;
$.each(shapes,&nbsp;&nbsp;&nbsp; function()
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.addRule('v\:' + this, &quot;behavior: url(#default#VML); antialias:true&quot;);
&nbsp;&nbsp;&nbsp; }
);
</pre>
<p>Это работает <img src='http://hudson.su/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Оригинал решения найден тут:&nbsp;<a href="http://stackoverflow.com/questions/1169162/any-alternatives-for-the-jquery-hilight-plugin">http://stackoverflow.com/questions/1169162/any-alternatives-for-the-jquery-hilight-plugin</a></p>
<p>По мотивам бага создан запрос разработчику. Будет ли исправлен неизвестно,&nbsp;но найти его можно тут:&nbsp;<a href="http://plugins.jquery.com/node/10552">http://plugins.jquery.com/node/10552</a></p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2009/09/30/jquery-maphilight-js-patch-ie8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cистемная ошибка: -1072896658 (system error: -1072896658)</title>
		<link>http://hudson.su/2008/05/17/system-error-1072896658/</link>
		<comments>http://hudson.su/2008/05/17/system-error-1072896658/#comments</comments>
		<pubDate>Sat, 17 May 2008 09:16:00 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=63</guid>
		<description><![CDATA[Отладка javascript-ов в IE обычно вызывает в сознании массу непечатных слов в адрес его разработчиков. Эта заметка посвящается тем, кто сталкивался с невразумительной ошибкой, выдаваемой Internet Explorer-ом при использовании Ajax с php-библиотекой xajax: Ошибка: системная ошибка: -1072896658 или Error: system error: -1072896658 &#160;Ошибка возникает из-за того, что в ответе серверверного скрипта в заголовках HTTP указана [...]]]></description>
			<content:encoded><![CDATA[<p>Отладка javascript-ов в IE обычно вызывает в сознании массу непечатных слов в адрес его разработчиков. Эта заметка посвящается тем, кто сталкивался с невразумительной ошибкой, выдаваемой Internet Explorer-ом при использовании Ajax с php-библиотекой xajax: </p>
<div><strong><em>Ошибка: системная ошибка: -1072896658</em></strong> или <em><strong>Error: system error: -1072896658 <br /></strong></em>&nbsp;<span id="more-63"></span><br />Ошибка возникает из-за того, что в ответе серверверного скрипта в заголовках HTTP указана кодировка, которую Internet Explorer не может распознать. Например, cp1251 (вместо windows-1251), или utf8 (вместо UTF-8). Названия кодировок должны быть в соответствии со стандартами IE, а не так, как можно было бы предположить. Посмотреть список поддерживаемых кодировок можно на msdn: <a href="http://msdn2.microsoft.com/en-us/library/aa752010.aspx">Character Set Recognition</a>.
<p>&nbsp;</p>
<div>Устранить проблему можно следующими способами: 
<ul>
<li>перед созданием объекта xajax задать константу XAJAX_DEFAULT_CHAR_ENCODING с кодировкой, которая будет выдаваться по умолчанию во всех заголовках, выдаваемых через xajaxResponse:</li>
</ul>
<p><em>define (&rsquo;XAJAX_DEFAULT_CHAR_ENCODING&rsquo;, &lsquo;windows-1251&prime;);</em> 
<ul>
<li>задать кодировку в самом объекте xajaxResponse перед его возвращением:</li>
</ul>
<p><em>$responseObject-&gt;setCharacterEncoding(&rsquo;windows-1251&prime;);</em> 
<ul>
<li>выдавать явно кодировку в http-заголовках ответа:</li>
</ul>
<p><em>header(&rsquo;Content-Type: text/html; charset=windows-1251&prime;);</em> </p>
<p>&nbsp;
<div>&mdash;</div>
<div>От себя добавлю что встречался с этой ошибкой когда хотел познакомиться с jQuery и в .htaccess имел неверно прописанную с точки зрения IE кодировку (UTF8 вместо UTF-8).</div>
</div>
<p>Взято <a target="_blank" href="http://lanceon.livejournal.com/7813.html?view=17029">здесь</a> (надеюсь Алекс не против <img src='http://hudson.su/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) <br />&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2008/05/17/system-error-1072896658/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

