<?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>jQuery и другое... &#187; jQuery UI</title>
	<atom:link href="http://www.linkexchanger.su/category/jquery-ui/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Tue, 25 May 2010 08:13:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>jqGrid Часть III: Расширенные возможности</title>
		<link>http://www.linkexchanger.su/2010/523.html</link>
		<comments>http://www.linkexchanger.su/2010/523.html#comments</comments>
		<pubDate>Sun, 23 May 2010 15:26:04 +0000</pubDate>
		<dc:creator>TRAHOMOTO</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/?p=523</guid>
		<description><![CDATA[Введение
Я рад приветствовать вас, дорогие читатели в третьей статье цикла, посвященного плагину jqGrid. Прошу прощения за столь долгое отсутствие, сейчас все свободное время отдаю изучению и освоению другого монстра &#8211; ExtJS.
Напомню, что в предыдущей статье (jqGrid Часть II: Базовые возможности) мы перешли от basic к advanced уровню использования этого замечательного плагина. Но прежде чем мы [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Введение</strong><br />
Я рад приветствовать вас, дорогие читатели в третьей статье цикла, посвященного плагину jqGrid. Прошу прощения за столь долгое отсутствие, сейчас все свободное время отдаю изучению и освоению другого монстра &#8211; ExtJS.<br />
Напомню, что в предыдущей статье (<a href="http://www.linkexchanger.su/2010/486.html">jqGrid Часть II: Базовые возможности</a>) мы перешли от basic к advanced уровню использования этого замечательного плагина. Но прежде чем мы начнем я хотел бы сообщить, что jqGrid обновилась до версии 3.6.5 и соответственно и мы будем использовать новую версию.</p>
<p>Итак план работ на эту статью:</p>
<ul>
<li><strong><a href="http://www.linkexchanger.su/2010/523.html#p1">jqGrid и &laquo;деревья&raquo;</a></strong>
<ul>
<li><a href="http://www.linkexchanger.su/2010/523.html#p1.1">Общие сведения о деревьях</a></li>
<li><a href="http://www.linkexchanger.su/2010/523.html#p1.2">jqGrid и SQL деревья</a></li>
<li><a href="http://www.linkexchanger.su/2010/523.html#p1.3">jqGrid и статические деревья</a></li>
</ul>
</li>
<li><strong><a href="http://www.linkexchanger.su/2010/523.html#p2">Связывание данных в jqGrid</a></strong>
<ul>
<li><a href="http://www.linkexchanger.su/2010/523.html#p2.1">Простая подтаблица (subgrid)</a></li>
<li><a href="http://www.linkexchanger.su/2010/523.html#p2.2">jqGrid как subgrid</a></li>
<li><a href="http://www.linkexchanger.su/2010/523.html#p2.3">Ведущая и ведомая jqGrid</a></li>
</ul>
</li>
</ul>
<p><span id="more-523"></span><br />
<a title="p1" name="p1"></a><strong>I.jqGrid и &laquo;деревья&raquo;</strong></p>
<p><a title="p1.1" name="p1.1"></a><strong>1) Краткие сведения о деревьях</strong><br />
Конечно здесь речь пойдет не о садово-огородных работах, а об представлении древовидных структур данных. В очередной раз обратимся за определением к Википедии:</p>
<p><strong>Древовидная структура</strong> является одним из способов представления иерархической структуры в графическом виде. <strong>Древовидной структурой</strong> называется благодаря тому, что граф выглядит как перевернутое дерево. По этой же причине говорят, что корневой узел (корень) находится на самом верху, а листья — внизу.</p>
<p>В принципе более или менее сносное определение, несмотря на то, что оно навивает академическую скуку я все же настоятельно рекомендую ознакомиться с материалом по древовидным структурам. Поверьте моему не большому опыту, абсолютно каждый программист рано или поздно станет перед необходимостью использовать дерево, и тут одним из помошников может стать jqGrid. Плагин может работать с двумя самыми распространенными в вычислительной технике типами деревьев: на основе &laquo;вложенных множеств&raquo; (Nested Sets) и &laquo;матрицы смежностей&raquo; (adjacency matrix). Вообще говоря тема деревьев очень серьезна, это один из разделов теории графов на изучение которых отводится не одна лекция в ВУЗах, но от себя посоветую те материалы которые мне в свое время очень помогли. Столкнувшись впервые с проблемой хранения деревьев я наткнулся на материал по подходу вложенных множеств (<a href="http://phpclub.ru/detail/article/db_tree">Хранение древовидных структур в Базах данных</a>) и сразу же остановился на нем, наверное потому что для работы с таким деревом существует готовый PHP класс. Но в процессе написания статьи я все же прочел статью <a href="http://phpclub.ru/detail/article/2002-06-03">Работа с &laquo;MySQL. Деревья&raquo;</a> в которой рассматривается подход матрицы смежностей.</p>
<p>Думаю здесь общие сведения следует закончить и перейти к практическому рассмотрению. </p>
<p><a title="p1.2" name="p1.2"></a><strong>2) jqGrid и SQL деревья</strong><br />
Для того, чтобы jqGrid могла работать с древовидными структурами, она должна быть загружена с модулем <strong>Tree Grid</strong>. Плагин может работать с обоими типами деревьев, упомянутых в предыдущем пункте. При этом jqGrid может работать с деревьями подгрузив все дерево за один раз или же подгружая ветви и листья по мере необходимости. Собственно загрузку дерева за один раз я рассматривать не буду, не интересно, а вот автоподгрузку мы разберем детально. И на этой ноте давайте перейдем к просмотру <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/p3e1.html">ДЕМО3.1</a>, <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/files/demo3.1.zip">ссылка для скачивания</a> </p>
<pre class="brush: jscript;">
$(function(){
     $('#table_nested').jqGrid({
                     treeGrid: true,
                     treeGridModel: 'nested',
                     ExpandColumn: 'title',
                     ExpandColClick: true,
                     url: 'p3e1_n.php',
                     datatype: &quot;json&quot;,
                     mtype: &quot;POST&quot;,
                     colNames:[&quot;id&quot;,&quot;Раздел&quot;],
                     colModel:[
                                   {name:'cid',index:'cid', width:1, hidden:true, key:true},
                                   {name:'title',index:'title', width:180}
                                  ],
                     treeIcons: {plus:'ui-icon-folder-collapsed',minus:'ui-icon-folder-open',leaf:'ui-icon-document'},
                     height: 'auto',
                     caption: 'вложенныe множества',
                     hidegrid: false
     });

     $('#table_adjacency').jqGrid({
                     treeGrid: true,
                     treeGridModel: 'adjacency',
                     ExpandColumn: 'title',
                     ExpandColClick: true,
                     url: 'p3e1_a.php',
                     datatype: &quot;json&quot;,
                     mtype: &quot;POST&quot;,
                     colNames:[&quot;cid&quot;,&quot;Раздел&quot;],
                     colModel:[
                                   {name:'cid',index:'cid', width:1, hidden:true, key:true},
                                   {name:'title',index:'title', width:180}
                                   ],
                     treeIcons: {plus:'ui-icon-circle-plus',minus:'ui-icon-circle-minus',leaf:'ui-icon-person'},
                     height: 'auto',
                     caption:'матрица смежностей',
                     hidegrid: false
    });
});
</pre>
<p>Настройки обоих таблиц идентичны, но имеется ряд свойств, отличающих эти экземпляры от рассмотренных в предыдущих статьях.</p>
<ul>
<li><strong>treeGrid: true</strong> &#8211; самый главный параметр, указывает что jqGrig будет работать с древовидной структурой, а не с простыми табличными данными</li>
<li><strong>treeGridModel: &#8216;adjacency&#8217; / &#8216;nested&#8217;</strong> &#8211; это свойство определяет какой алгоритм дерева использовать</li>
<li><strong>ExpandColumn: &#8216;title&#8217;</strong> &#8211; определяет при клике по какому столбцу происходит открытие и(или) загрузка ветви</li>
<li><strong>ExpandColClick: true</strong> &#8211; необходимо, чтобы открытие ветви происходило при клике на колонку, а не на иконку</li>
<li><strong>colModel:[... key:true},...]</strong> &#8211; свойство <strong>key</strong> в массиве colModel позволяет указать данные какого столбца следует использовать как уникальный идентификатор записи при запросе данных с сервера. Т.е. благодаря этому свойству, можно переопределить идентификатор. Но только в одном столбце может быть указан <strong>key</strong>. Плагин будет использовать первый, найденный столбец как ключевой.</li>
<li><strong>treeIcons:</strong> &#8211; позволяет переопределить стандартные (<em>{plus:&#8217;ui-icon-triangle-1-e&#8217;,minus:&#8217;ui-icon-triangle-1-s&#8217;,leaf:&#8217;ui-icon-radio-off&#8217;}</em>) иконки листьев и ветвей.</li>
</ul>
<p>С не описанными свойства мы знакомы из предыдущих статей, а другие свойства и методы, характерные только для работы с jqGrid в качестве дерева можно посмотреть на странице <a href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:treegrid">TreeGrid</a>. </p>
<p>Прежде чем перейдем к рассмотрению серверных скриптов давайте немного разберемся как работает плагин. Сразу после инициализации, таблица отправляет запрос к серверу, при этом передает следующие данные и ждет ответа сервера:</p>
<blockquote><p><strong>В режиме &#8216;nested&#8217; (на примере метода POST)</strong></p>
<ul>
<li><strong>POST['nodeid']</strong> &#8211; идентификатор узла (ветви)</li>
<li><strong>POST['n_left']</strong> &#8211; позиция узла &laquo;слева&raquo;</li>
<li><strong>POST['n_right']</strong> &#8211; позиция узла &laquo;справа&raquo;</li>
<li><strong>POST['n_level']</strong> &#8211; уровень вложенности узла</li>
</ul>
</blockquote>
<p></p>
<blockquote><p><strong>В режиме &#8216;adjacency&#8217; (на примере метода POST)</strong></p>
<ul>
<li><strong>POST['nodeid']</strong> &#8211; идентификатор узла (ветви)</li>
<li><strong>POST['parentid']</strong> &#8211; идентификатор родительского узла</li>
<li><strong>POST['n_level']</strong> &#8211; уровень вложенности узла</li>
</ul>
</blockquote>
<p></p>
<blockquote><p><strong>кроме этого, на сервер также передаются стандартные для jqGrid параметры (на примере метода POST)</strong></p>
<li><strong>POST['page']</strong> &#8211; номер страницы, для &laquo;листалки&raquo;</li>
<li><strong>POST['rows']</strong> &#8211; количество записей, для ограничения при выборке данных</li>
<li><strong>POST['sidx']</strong> &#8211; значение <strong>index:</strong> в<strong> colModel</strong>, имя столбца по которому необходимо отсортировать результат</li>
<li><strong>POST['sord']</strong> &#8211; направление сортировки</li>
</blockquote>
<p>
После получения данных, серверный скрипт выполняет запрос данных из БД и сроит и  выводит результат в следующих форматах. </p>
<blockquote><p><strong>В режиме &#8216;nested&#8217; (на примере XML ответа)</strong></p>
<ul>
<li><strong>пользовательские столбцы</strong></li>
<li><strong>level</strong> &#8211; уровень узла в иерархии</li>
<li><strong>lft</strong> &#8211; позиция узла &laquo;слева&raquo;</li>
<li><strong>rgt</strong> &#8211; позиция узла &laquo;справа&raquo;</li>
<li><strong>isLeaf</strong> &#8211; логический признак (true/false), определяет этот узел является &laquo;веткой&raquo;(есть подузлы) или &laquo;листом&raquo;(нет подузлов)</li>
<li><strong>expanded</strong> &#8211; логический признак (true/false), нужно ли показывать подузлы если этот узел является веткой, т.е. загрузить &laquo;открытым&raquo; или &laquo;закрытым&raquo;</li>
</ul>
</blockquote>
<p></p>
<blockquote><p><strong>В режиме &#8216;adjacency&#8217; (на примере XML ответа)</strong></p>
<ul>
<li><strong>пользовательские столбцы</strong></li>
<li><strong>level</strong> &#8211; уровень узла в иерархии</li>
<li><strong>parent</strong> &#8211; идентификатор родительского узла</li>
<li><strong>isLeaf</strong> &#8211; логический признак (true/false), определяет этот узел является &laquo;веткой&raquo;(есть подузлы) или &laquo;листом&raquo;(нет подузлов)</li>
<li><strong>expanded</strong> &#8211; логический признак (true/false), нужно ли показывать подузлы если этот узел является веткой, т.е. загрузить &laquo;открытым&raquo; или &laquo;закрытым&raquo;</li>
</ul>
</blockquote>
<p>
Ядро (<a href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data">ридеры</a>) jqGrid разбирают ответ и вставляют данные в таблицу. Вот теперь серверные скрипты будут более-менее понятны. </p>
<p><strong>Вложенные множества (<em>p3e1_n.php</em>)</strong>(опущены подключение к БД и вывод результата)</p>
<pre class="brush: php;">
// Получаем параметры от таблицы
    # ВНИМАНИЕ!!!
    # Данный код не имеет проверок запрашиваемых данных
    # что может стать причиной взлома! Обязательно проверяйте все данные
    # поступающие от клиента

    $node  = intval($_POST['nodeid']);
    $left  = intval($_POST['n_left']);
    $right = intval($_POST['n_right']);
    $level = intval($_POST['n_level']);

// Настраиваем условие для выбора ветки
    $WHERE = '';
    if($node &gt; 0) {
       $level = $level + 1;  // нужно выбрать следующий уровень
       $WHERE = &quot; AND cleft &gt; &quot;.$left.&quot; AND cright &lt; &quot;.$right.&quot; AND clevel = &quot;.$level;
    }else{
       $level = 0;
    }

// Выбираем подразделы
    $query = &quot;SELECT cid, title, clevel, cleft, cright FROM tree_nested_sets WHERE cleft BETWEEN cleft AND cright &quot;.$WHERE.&quot; GROUP BY title ORDER BY cleft;&quot;;
    $result = mysql_query($query);

// Формируем результат
    $response-&gt;page = 1;
    $response-&gt;total = 1;
    $response-&gt;records = 1;

    $i = 0;
    while($row = mysql_fetch_assoc($result)) {
        //-------------------------------------
        // Определяем является ли выбранный узел &quot;листом&quot;
        if($row['cright'] == $row['cleft']+1)
            $leaf = 'true';
        else
            $leaf='false';
        //-------------------------------------

        if($level == $row['clevel']){
            $response-&gt;rows[$i]['cell'] = array($row['cid'], $row['title'], $row['clevel'], $row['cleft'], $row['cright'], $leaf, 'false');
        }
        $i++;
    }
</pre>
<p><strong>Матрица смежностей(<em>p3e1_a.php</em>)</strong>(опущены подключение к БД и вывод результата)</p>
<pre class="brush: php;">
// Выбираем все разделы без подразделов (листья)
    $query_feafs = &quot;SELECT t1.cid FROM tree_adjacency_matrix AS t1 LEFT JOIN tree_adjacency_matrix AS t2 ON t1.cid = t2.id_parent WHERE t2.cid IS NULL&quot;;
    $sql_leafs = mysql_query($query_feafs);

    while($row = mysql_fetch_assoc($sql_leafs)) {
       $leafs[] = $row['cid']; // Массив для хранения &quot;листьев&quot;
    }
    unset($row);

// Получаем параметры от таблицы
    # ВНИМАНИЕ!!!
    # Данный код не имеет проверок запрашиваемых данных
    # что может стать причиной взлома! Обязательно проверяйте все данные
    # поступающие от клиента

    $level  = intval($_POST['n_level']);
    $node   = intval($_POST['nodeid']);

// Настраиваем условие для выбора ветки
    if($node &gt; 0) {
       $level = $level + 1;            // нужно выбрать следующий уровень
       $WHERE = 'id_parent ='.$node;
    } else {
       $WHERE = 'id_parent IS NULL';   // выбрать корень(ни)
    } 

// Выбираем подразделы
    $query  = &quot;SELECT cid, title, id_parent FROM tree_adjacency_matrix WHERE &quot;.$WHERE;
    $result = mysql_query($query);

// Формируем результат
    $response-&gt;page      = 1;
    $response-&gt;total     = 1;
    $response-&gt;records   = 1;

    $i = 0;
    while($row = mysql_fetch_assoc($result)) {
       //-------------------------------------
       // Определяем ID родителя этого узла
       if(!$row['id_parent'])
           $parent = 'NULL';
       else
          $parent = $row['id_parent'];
       //-------------------------------------
       // Определяем является ли выбранный узел &quot;листом&quot;
       if(in_array($row['cid'], $leafs))
           $is_leaf = 'true';
       else
           $is_leaf = 'false';
       //--------------------------------------

       $response-&gt;rows[$i]['cell'] = array($row['cid'], $row['title'], $level, $parent, $is_leaf, FALSE);

       $i++;
    }</pre>
<p>Я считаю комментировать в этих листингах особо нечего, кроме того что данные поступающие с сервера не ограничиваются по кол-ву записей и не сортируются. А практически все остальное является повторением примеров из предыдущих статей или специфическими вещами при работе с деревьями, описанными в статьях приложенных выше. Также обращу ваше внимание на то, что пример работы с <a href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:nested_set_model">Nested Set Model</a> описанный в документации разработчиком не хотел работать, пришлось его доводить, за что мне большое спасибо <img src='http://www.linkexchanger.su/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><a title="p1.3" name="p1.3"></a><strong>3)jqGrid и статические деревья</strong><br />
Название <em>статические деревья</em> оносительно, того что мы делали немного ранее. Безусловно данные &laquo;загруженные&raquo; таким способом могут быть построены и скриптом динамически, но все же бывают такие задачи, когда дерево уже есть необходимо лишь вывести его в дружественной для пользователя форме как в <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/p3e2.html">ДЕМО3.2</a> . Не правда ли что-то напоминает? Да! это меню из демо jqGrid от разработчика. </p>
<p>Листинг клиентской части:</p>
<pre class="brush: jscript;">
  $('#table').jqGrid({
            url: &quot;tree.xml&quot;,
            datatype: &quot;xml&quot;,
            height: &quot;auto&quot;,
            pager: false,
            loadui: &quot;disable&quot;,
            colNames: [&quot;id&quot;,&quot;Items&quot;,&quot;url&quot;],
            colModel: [
                {name: &quot;id&quot;,width:1,hidden:true, key:true},
                {name: &quot;menu&quot;, width:150, resizable: false, sortable:false},
                {name: &quot;url&quot;,width:1,hidden:true}
            ],
            treeGrid: true,
                    caption: &quot;jqGrid Demos&quot;,
            ExpandColumn: &quot;menu&quot;,
            width: 200,
            rowNum: 200,
            ExpandColClick: true,
            treeIcons: {leaf:'ui-icon-document-b'}
 });
</pre>
<p>Полностью идентичные параметры плагина, за исключением того, что я отключил обработчик события <strong>onSelectRow</strong>.<br />
Из листига должно стать понятно, что таблица запрашивает статичный(оносительно) файл <em>tree.xml</em>, который выглядит так</p>
<pre class="brush: xml;">&lt;?xml version='1.0' encoding=&quot;utf-8&quot;?&gt;
&lt;rows&gt;
    &lt;page&gt;1&lt;/page&gt;
    &lt;total&gt;1&lt;/total&gt;
    &lt;records&gt;1&lt;/records&gt;
    &lt;row&gt;&lt;cell&gt;1&lt;/cell&gt;&lt;cell&gt;Loading Data&lt;/cell&gt;&lt;cell&gt;&lt;/cell&gt;&lt;cell&gt;0&lt;/cell&gt;&lt;cell&gt;1&lt;/cell&gt;&lt;cell&gt;10&lt;/cell&gt;&lt;cell&gt;false&lt;/cell&gt;&lt;cell&gt;false&lt;/cell&gt;&lt;/row&gt;
    &lt;row&gt;&lt;cell&gt;2&lt;/cell&gt;&lt;cell&gt;XML Data&lt;/cell&gt;&lt;cell&gt;xmlex.html&lt;/cell&gt;&lt;cell&gt;1&lt;/cell&gt;&lt;cell&gt;2&lt;/cell&gt;&lt;cell&gt;3&lt;/cell&gt;&lt;cell&gt;true&lt;/cell&gt;&lt;cell&gt;true&lt;/cell&gt;&lt;/row&gt;
    &lt;row&gt;&lt;cell&gt;3&lt;/cell&gt;&lt;cell&gt;JSON Data&lt;/cell&gt;&lt;cell&gt;jsonex.html&lt;/cell&gt;&lt;cell&gt;1&lt;/cell&gt;&lt;cell&gt;4&lt;/cell&gt;&lt;cell&gt;5&lt;/cell&gt;&lt;cell&gt;true&lt;/cell&gt;&lt;cell&gt;true&lt;/cell&gt;&lt;/row&gt;

...

&lt;/rows&gt;
</pre>
<p>Т.е. jqGrid просто разбирает данные из этого файла и строит TreeGrid.</p>
<p><a title="p2" name="p2"></a><strong>II. Связывание данных в jqGrid</strong></p>
<p>Иногда при построении какого либо приложения необходимо как то сгруппировать данные для экономии визуального пространства на странице и при этом иметь возможность как можно быстрее и комфортнее получить доступ к более детальной информации или связанной с текущей. Немного сумбурно получилось <img src='http://www.linkexchanger.su/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , но надеюсь вы меня поняли, а если не поняли то примеры разложат все по полочкам.</p>
<p><a title="p2.1" name="p2.1"></a><strong>1)Простая подтаблица (subgrid)</strong></p>
<p>Это весьма полезная опция у этого плагина. На <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/p3e3.html">ДЕМО3.3</a> обратите внимание на крестик в крайнем правом столбце таблицы. При клике на нем под выбранной строкой распахивается &laquo;карман&raquo; в котором находится небольшая табличка с названиями городов и прочей &laquo;рыбой&raquo;.  Вот пример группировки. Теперь давайте перейдем к листингам.</p>
<pre class="brush: jscript;">
$('#table').jqGrid({
       url:'p3e3.php',
       datatype: 'json',
       mtype: 'POST',
       colNames:['Код страны','Cтрана',''],
       colModel :[
          {name:'country_code', index:'country_code', width:80, hidden: true},
          {name:'country_name', index:'country_name', width:60},
          {name:'description', width:200, sortable: false}
          ],
       pager: $('#tablePager'),
       rowNum: 100,
       scroll: true,
       viewrecords: true,
       sortname: 'country_name',
       sortorder: 'asc',
       width: 700,
       height: 400,
       subGrid: true,
         subGridUrl: 'p3e3.php?get=subgrid',
         subGridModel:[{
                     name :  ['&amp;nbsp;','Город', 'Широта', 'Долгота'],
                     width:  [40, 200, 150, 150],
                     align:  ['center','left','right','right'],
                     params: ['country_code','country_name']
                 }]
});
</pre>
<p>Как видите, абсолютно обыкновенный jqGrid, но в &laquo;настройках&raquo; есть несколько интересных моментов:</p>
<ul>
<li><strong>subGrid:</strong> &#8211; в строке 19. Эта опция позволяет использовать подтаблицу.</li>
<li><strong>subGridUrl:</strong> &#8211; указывает путь к скрипту, который должен вернуть данные для построения подтаблицы. В данном случае происходит запрос к тому же скрипту, который &laquo;обслуживает&raquo; и таблицу-родителя при этом передав ему параметр <em>get</em> со значением <em>subgrid</em></li>
<li><strong>subGridModel:</strong> &#8211; свойство которое задает параметры подтаблицы. Аналогично <strong>colModel</strong> таблицы-родителя</li>
</ul>
<p><strong>subGridModel:</strong> &#8211; представляет из себя массив с объектом, у которого есть свои параметры. <strong>name</strong>, <strong>width</strong> и <strong>align</strong> уверен их имена говорят сами за себя, это тексты заголовков столбцов, ширины соответствующих столбцов и выравнивание в них соответственно. Более интересным будет свойство <strong>params</strong>. Оно позволяет передать значения из каких то ячеек родительской таблицы на сервер при запросе подтаблицы. Иными словами, когда вы нажмете на крестик , открывающий подтаблицу, происходит запрос к серверу которому передается  клоч (id) записи (в нашем случае это <em>country_code</em>) и плос к этим данным можно передать дополнительные (в нашем случае серверу будет передан еще и <strong>country_name</strong>). А вот на сервере получив значения нужных параметров (в этом примере серверный скрипт просто игнорирует значение параметра <strong>country_name</strong>) вы выполняем запрос к БД и выводим JSON объект с данными.</p>
<pre class="brush: php;">
...
$get = $_REQUEST['get'];  // Параметр указывающий на то
                                    //  что мы запросили информацию для подтаблицы
...
switch ($get){
    case 'subgrid':
        // Выбрать города запрошенной страны
        $id =$_REQUEST['id'];

        // Запрос данных
        $query = &quot;SELECT id, country_code, region_code, city, latitude, longitude, nbip FROM cities  WHERE country_code LIKE '&quot;.$id.&quot;'&quot;;

        $result = mysql_query($query);
        if(mysql_num_rows($result) &gt;= 1){
            // Строки данных для таблицы
            $i = 0;
            while($row = mysql_fetch_assoc($result)) {
                $data-&gt;rows[$i]['cell'] = array($i+1,'&lt;strong&gt;&lt;em&gt;'.$row['city'].'&lt;/em&gt;&lt;/strong&gt;',$row['latitude'],$row['longitude']);
                $i++;
            }
        }
        break;

    default:
        // Выбрать названия стран и сосчетать города
        ...

}
// Вывести результат
...
</pre>
<p>Серверный скрипт особо ничем не отличается от рассмотренных в предыдущих примерах. При этом он разбит на две части оператором <strong>switch</strong>. Который по умолчанию выполняет &laquo;стандартную&raquo; обработку и вывод данных для главной таблицы. А вот если этот скрипт запустить передав ему  параметр <em>get</em> (я выбрал такое имя только ради наглядности) тогда будет выполнена выборка данных для подтаблицы. Ну и если у вас чешутся руки поковырять пример, вы можете <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/files/demo3.3.zip">скачать его</a>.</p>
<p>Подтаблицы это замечательный инструмент, который позволяет очень элегантно организавать данные, но при этом имеет один существенный недостаток &#8211; подтаблица &laquo;не живая&raquo;. Т.е. данные в подтаблице не могут сортироваться, нет возморжности реализовать поиск и т.д. А это очень критично если в подтаблице будет выводиться много записей. Однако это ограничение отпадает само собой при использовании jqGrid как подтаблицы.</p>
<p><a title="p2.2" name="p2.2"></a><strong>2)jqGrid как subgrid</strong><br />
Итак начнем с промотра <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/p3e4.html">ДЕМО3.4</a>. Как видите все тот же &laquo;родной&raquo; jqGrid с названиями стран, и кол-вом городов в этой стране, но при этом подтаблица теперь представляет из себя самую настоящую jqGrid со всеми свойствами и методами. Согласитесь, что так работать намного приятнее и удобнее. </p>
<p>А вот здесь самое интересное &#8211; клиентский код (в листинге опущены все настройки родительской таблицы, кроме одного свойства):</p>
<pre class="brush: jscript;">
...
subGrid: true,
subGridRowExpanded: function(subgrid_id, row_id) {
    var subgrid_table_id;
    subgrid_table_id = subgrid_id+'_t';

    $('#'+subgrid_id).html('&lt;table id=&quot;'+subgrid_table_id+'&quot;&gt;&lt;/table&gt;&lt;div id=&quot;'+subgrid_table_id+'_pager&quot;&gt;&lt;/div&gt;');
    $('#'+subgrid_table_id).jqGrid({
        url: 'p3e4.php',
        datatype: 'json',
        mtype: 'POST',
        postData: {'get':'subgrid', 'id':row_id},
        colNames: ['Город', 'Широта', 'Долгота'],
        colModel: [
            {name: 'city', index: 'city', width:130},
            {name: 'latitude', index: 'latitude', width:80, align: 'right'},
            {name: 'longitude', index: 'longitude', width:80, align: 'right'}
            ],
        height: 'auto',
        autowidth: true,
        rownumbers: true,
        rownumWidth: 40,
        rowNum: 10,
        sortname: 'city',
        sortorder: 'asc',
        pager: $('#'+subgrid_table_id+'_pager'),
        rowNum:10,
        rowList:[10,20,50,100]
    });
}
...
</pre>
<p>Настройки таблицы-родителя идентичные предыдущему примеру, но при этом появилось новое свойство <strong>subGridRowExpanded</strong>. Думаю самые догадливые поняли, а самые любопытные прочли в документации в секции <a href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:subgrid">Subgrid</a>, что <strong>subGridRowExpanded</strong> не просто свойство, а событие. </p>
<blockquote><p>
<strong>subGridRowExpanded</strong> &#8211; это событие возникает когда пользователь кликает на крестик раскрытия подтаблицы и выполняет определенную функцию при распахивании &laquo;кармана&raquo; для подтаблицы. При этом в функцию обработчик будут переданы 2 параметра:</p>
<ul>
<li><strong>pID</strong> &#8211; уникальный идентификатор &laquo;кармана&raquo; (контейнера, если хотите) который открывается под выбранной строкой</li>
<li><strong>id</strong> &#8211; идентификатор записи под которой открылся &laquo;карман&raquo;</li>
</ul>
</blockquote>
<p>Безусловно существуют еще события, о которых вы можете узнать из документации. А мы пока пробежимся по листингу. Итак когда пользователь &laquo;тыцнул&raquo; на крестик, открывается контейнер и выполняется функция. Которая получает 2 параметра <em>subgrid_id</em> и <em>row_id</em>. Далее в строке 5 создаем строковое значение для атрибута id и в 6й строке используем метод jQuery, который вставляет в &laquo;карман&raquo; (кстати сказать что это обыкновенный DIV) html разметку таблицы и DIV&#8217;a. А далее идет бональная инициализация jqGrid для только что созданной разметки. Т.е. фактически мы просто напросто динамически создали разметку и создали jqGrid! В этот момент я воскликнул &laquo;Тааак!&raquo; и потер руки. Почему? Да потому, что зная id объекта (&lt;div id=&quot;someid&quot;&gt;&#8230;&lt;/div&gt;) с помощью jQuery можно сотворить с ним все что угодно. Но прежде чем мы перейдем к следующему примеру я приведу <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/files/demo3.4.zip">ссылку на раздаточный материал</a> по теме &#8211; это пример который только что расмотрели.<br />
А теперь зная id контейнера давайте, еще добавим наглядности нашему примеру со странами и городами, например как на <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/p3e5.html">ДЕМО3.5</a>. Как видите все эта же, скучная таблица со странами, но теперь при клике на крестик открывается подробная информация и флаг выбранной строки. Под которой свернутая jqGrid таблица с перечнем городов. Этот пример вы можете скачать перейдя по <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/files/demo3.5.zip">этой ссылке</a>. Внутри архива все скрипты, но наибольший интерес представляет клиентский код. Я условно разделю его на 2 части, первая (нижняя) часть:</p>
<pre class="brush: jscript;">
$('#table').jqGrid({
          ...
          subGrid: true,
          subGridRowExpanded: function(subgrid_id, row_id) {
                       getCountryDetails(subgrid_id, row_id);
                   }

});
</pre>
<p>Это таблица из предыдущего примера, но теперь при возникновении события <strong>subGridRowExpanded</strong> будет выполнена пользовательская функция <strong>getCountryDetails()</strong>, которая и является 2 половиной клиентского скрипта:</p>
<pre class="brush: jscript;">
function getCountryDetails(container, countryCode){
    $.ajax({
            type: 'post',
            url: 'p3e5.php',
            data: ({'id': countryCode, 'get': 'details'}),
            dataType: 'json',
            success: function(server){
                $('#'+container).html('&lt;div class=&quot;c_detail&quot;&gt;&lt;img src=&quot;files/images/'+server.flag+'&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Столица:&lt;/strong&gt; '+server.capital+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Дата независимости:&lt;/strong&gt; '+server.independence_date+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Официальные языки:&lt;/strong&gt; '+server.off_lng+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Форма правления:&lt;/strong&gt; '+server.government+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Глава правительства:&lt;/strong&gt; '+server.president+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Валюта:&lt;/strong&gt; '+server.currency+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Интернет-домены:&lt;/strong&gt; '+server.domains+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Телефонный код:&lt;/strong&gt; '+server.dialing_code+'&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Часовой пояс:&lt;/strong&gt; '+server.time_zone+'&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;');

                var subgrid_table_id = container+'_t';

                $('#'+container).append('&lt;table id=&quot;'+subgrid_table_id+'&quot;&gt;&lt;/table&gt;&lt;div id=&quot;'+subgrid_table_id+'_pager&quot;&gt;&lt;/div&gt;');
                $('#'+subgrid_table_id).jqGrid({
                          caption: 'Города',
                          hiddengrid: true,
                          url: 'p3e4.php',
                          datatype: 'json',
                          mtype: 'POST',
                          postData: {'get':'subgrid', 'id':countryCode},
                          colNames: ['Город', 'Широта', 'Долгота'],
                          colModel: [
                            {name: 'city', index: 'city', width:130},
                            {name: 'latitude', index: 'latitude', width:80, align: 'right'},
                            {name: 'longitude', index: 'longitude', width:80, align: 'right'}
                          ],
                          height: 'auto',
                          autowidth: true,
                          rownumbers: true,
                          rownumWidth: 40,
                          rowNum: 10,
                          sortname: 'city',
                          sortorder: 'asc',
                          pager: $('#'+subgrid_table_id+'_pager'),
                          rowNum:10,
                          rowList:[10,20,50,100]
                });
            }
    });
}
</pre>
<p>В теле этой функции выполняется AJAX запрос, передающий серверному скрипту 2 параметра методом POST:</p>
<ul>
<li><strong>id</strong> &#8211; идентификатор записи, в нашем случае это сокращенный код страны</li>
<li><strong>get</strong> &#8211; этот параметр указывает, что мы хотим получить с сервера детальную информацию по выбранной стране</li>
</ul>
<p>После того как запрос будет успешно выполнен (см. строку 8), в открывшийся под выбранной строкой контейнер будет помещена какая-то HTML разметка с полученными с сервера данными. В данном примере такая разметка представлена не нумированным списком в картинкой &#8211; флагом страны. После этого в этот же контейнер помещается разметка для дочерней таблицы и производится инициализация дочерней таблицы.</p>
<p>В принципе логика работы достаточно проста, главное не забывать что работать с полученными от сервера данными можно только после окончания AJAX запроса или производя синхронные запросы. </p>
<p>Как вы понимаете в контейнер для подтаблицы можно помещать не только какую-то примитивную разметку, но и формы, флеш, другие &laquo;вкусные&raquo; и полезные вещи.</p>
<p><a title="p2.3" name="p2.3"></a><strong>3)Ведущая и ведомая jqGrid</strong></p>
<p>Однако не всегда можно сгруппировать данные и засунуть их в подтаблицу. Иногда данные могут быть полностью самостоятельными и при этом иметь некую связь. Например однажды передо мной стала задача вывести пользователю перечень счетов и платежей по этим счетам, и при этом обеспечить возможность просмотра счетов, платежей и платежей по выбранному счету. И тут то мне очень помогла методика &laquo;ведущий-ведомый&raquo;. Работа которой проиллюстрирована в <a href="http://trahomoto.dlinkddns.com/works/linkexchanger/articles/jqgrid/p3e6.html">ДЕМО5.6</a>.</p>
<p>Имеется две jqGrid, отображающие страны и города, которые можно менять местами благодаря плагину <em>sortable</em>. Также в верхней части документа есть checkbox который включает функцию фильтрации содержимого ведомой (нижней) таблицы, на основе выбранной записи в ведущей (верхней) таблице. При этом вся фильтровка осуществляется на стороне сервера, с этого и начнем разбор примера. Для удобства две таблицы запрашивают данные у двух отдельных серверных скриптов, один для городов, другой для стран.<br />
<strong>Скрипт для таблицы &laquo;Города&raquo;</strong> (т.к. основная структура скрипта &laquo;стандартна&raquo; я привожу лишь основные моменты):</p>
<pre class="brush: php;">
// Получение параметров page, rows и т.д.
...
if($_REQUEST['filterBy'] != 'null')  // Фильтр
    $WHERE = &quot; WHERE country_code = '&quot;.$_REQUEST['filterBy'].&quot;' &quot;;
else
    $WHERE = '';
...
// Запрос подсчета суммарного кол-ва записей
$result = mysql_query(&quot;SELECT COUNT(*)AS count FROM cities&quot;.$WHERE);
...
// Запрос выборки данных
$result = mysql_query(&quot;SELECT city, latitude, longitude FROM cities &quot;.$WHERE.&quot; ORDER BY &quot;.$sidx.&quot; &quot;.$sord.&quot; LIMIT &quot;.$start.&quot;, &quot;.$limit);
</pre>
<p>В данном случае клиентский код при запросе данных с сервера помимо &laquo;стандартных&raquo; параметров, отправляет еще и дополнительный параметр <strong>filterBy</strong>, который по сути и определяет критерий по которому нужно выбрать записи из БД и вернуть клиенту. Что и проиллюстрировано в последующих запросах.</p>
<p><strong>Скрипт для таблицы &laquo;Страны&raquo;:</strong></p>
<pre class="brush: php;">
// Получение параметров page, rows и т.д.
...
if($_REQUEST['filterBy'] != 'null'){
     $country = @mysql_fetch_array(mysql_query(&quot;SELECT country_code FROM cities WHERE id = &quot;.$_REQUEST['filterBy']));
     $WHERE = &quot; WHERE country_code = '&quot;.$country['country_code'].&quot;' &quot;;
}else{
     $WHERE = '';
}
...
// Запрос подсчета суммарного кол-ва записей
$result = mysql_query(&quot;SELECT COUNT(*)AS count FROM countries &quot;.$WHERE);
...
// Запрос выборки данных
$result = mysql_query(&quot;SELECT * FROM countries &quot;.$WHERE.&quot; ORDER BY &quot;.$sidx.&quot; &quot;.$sord.&quot; LIMIT &quot;.$start.&quot;, &quot;.$limit);
</pre>
<p>Как видите полная аналогия предыдущего листинга, но теперь если передано определенное значение фильтра, происходит дополнительный запрос для уточнения кода страны.<br />
На этом все премудрости серверной стороны заканчиваются и начинается клиентский код, но прежде чем перейти к его рассмотрению <strong>пара слов о разметке страницы</strong>:</p>
<pre class="brush: xml;">
&lt;input type=&quot;checkbox&quot; id=&quot;link&quot;&gt;
&lt;label for=&quot;link&quot;&gt;Связать таблицы&lt;/label&gt;

&lt;div id=&quot;interfaceBody&quot; style=&quot;margin: 10px 10px 10px 10px; padding: 0px 10px 10px 10px; border: 2px solid gray&quot;&gt;
&lt;div class=&quot;grid&quot; id=&quot;countries&quot; style=&quot;padding: 10px 10px 10px 10px; margin-top: 10px; border: 2px solid red&quot;&gt;
    &lt;table id=&quot;table_countries&quot;&gt;&lt;/table&gt;
    &lt;div id=&quot;table_countriesPager&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;grid&quot; id=&quot;cities&quot; style=&quot;padding: 10px 10px 10px 10px; margin-top: 10px; border: 2px solid green&quot;&gt;
    &lt;table id=&quot;table_cities&quot;&gt;&lt;/table&gt;
    &lt;div id=&quot;table_citiesPager&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Если не обращать внимание на ужасно длинные inline-стили, то разметка достаточно проста. Сначала идет код checkbox&#8217;a с меткой, а следом контейнер всего интерфейса, внутри которого два дочерних контейнера, по одному для каждой таблицы. </p>
<p>И наконец <strong>клиентский скрипт:</strong></p>
<pre class="brush: jscript;">
//-------------------------------------------------------------------
// Функция-обработчик
function stickTogether(){
    if($('#link').is(':checked')){
        // Флаг &quot;Связать таблицы&quot; утановлен
        var masterId        = $('#interfaceBody &gt; DIV:first').attr('id');                //Определяем ID контейнера &quot;ведущей таблицы&quot;
        var masterPostData  = $('#table_'+masterId).jqGrid('getGridParam','postData');   //Получаем весь объект postData &quot;ведущей таблицы&quot;
        var selId    = $('#table_'+masterId).jqGrid('getGridParam','selrow');            //Получаем id записи в выделенной строке
                                                                                         //не путайте с rowIndex
        // Проверяем какое текущее значение фильтра ведущей таблицы, он должен быть сброшен (например null)
        if(masterPostData.filterBy){
            $('#table_'+masterId).jqGrid('setGridParam',{'postData':{'filterBy':null}}); //Сбрасываем значение фильтра
            $('#table_'+masterId).trigger('reloadGrid');                                 //Перезагружаем данные в таблицу
        }

        var slaveId  = $('#interfaceBody &gt; DIV:last').attr('id');                        //Определяем ID контейнера &quot;ведомой таблицы&quot;
        $('#table_'+slaveId).jqGrid('setGridParam',{'postData':{'filterBy':selId}});     //Применяем в качестве фильтра ведомой таблицы
                                                                                         //id выбранной записи в ведущей таблице
        $('#table_'+slaveId).trigger('reloadGrid');                                      //Перезагружаем данные в таблицу
    }else{
        // Флаг &quot;Связать таблицы&quot; не утановлен
        var coutriesT       = $('#table_countries');
        var countriesPost   = coutriesT.jqGrid('getGridParam','postData');

        if(countriesPost.filterBy){ //Сбрасываем фильтр т.к. ничего не нужно фильтровать
            coutriesT.jqGrid('setGridParam',{'postData':{'filterBy':null}})
            coutriesT.trigger('reloadGrid');
        }
        //-----------------------
        var citiesT       = $('#table_cities');
        var citiesPost    = citiesT.jqGrid('getGridParam','postData');

        if(citiesPost.filterBy){ //Сбрасываем фильтр т.к. ничего не нужно фильтровать
            citiesT.jqGrid('setGridParam',{'postData':{'filterBy':null}})
            citiesT.trigger('reloadGrid');
        }
    }
}
//-------------------------------------------------------------------
// Настройка плагинов
var tcountries = $('#table_countries').jqGrid({
                          caption: 'Страны',
                          hidegrid: false,
                          url:'p3e6_countries.php',
                          postData: {'filterBy':null},
                          datatype: 'json',
                          mtype: 'POST',
                          colNames:['Код страны','Cтрана','Столица','Домены'],
                          colModel :[
                                    {name:'country_code', index:'country_code', width:80, hidden: true},
                                    {name:'country_name', index:'country_name', width:60},
                                    {name:'capital', index:'capital', width:60},
                                    {name:'domains', index:'domains', width:60}
                                    ],
                          pager: $('#table_countriesPager'),
                          rowNum: 100,
                          scroll: true,
                          viewrecords: true,
                          sortname: 'country_name',
                          sortorder: 'asc',
                          height: 200,
                          autowidth: true,
                          onSelectRow: stickTogether
                });

var tcities = $('#table_cities').jqGrid({
                          caption: 'Города',
                          hidegrid: false,
                          url: 'p3e6_cities.php',
                          postData: {'filterBy':null},
                          datatype: 'json',
                          mtype: 'POST',
                          colNames: ['Город', 'Широта', 'Долгота'],
                          colModel: [
                            {name: 'city', index: 'city', width:130},
                            {name: 'latitude', index: 'latitude', width:80, align: 'right'},
                            {name: 'longitude', index: 'longitude', width:80, align: 'right'}
                          ],
                          height: 200,
                          autowidth: true,
                          rownumbers: true,
                          rownumWidth: 40,
                          rowNum: 100,
                          sortname: 'city',
                          sortorder: 'asc',
                          pager: $('#table_citiesPager'),
                          scroll: true,
                          viewrecords: true,
                          onSelectRow: stickTogether
                });

$(&quot;#interfaceBody&quot;).sortable({
        connectWith: '.grid',
        placeholder: 'ui-state-error',
        opacity: 0.7,
        stop: stickTogether
});

//-------------------------------------------------------------------
// Назначаем обработчик на событие
$('#link').change(stickTogether);
</pre>
<p>При всем своем объеме код достаточно груб и прост. Начнем пожалуй с назначения обработчика на изменение checkbox&#8217;a, самая последняя строка в листинге. Как видите при изменении checkbox&#8217;a будет вызвана функция <strong>stickTogether</strong>. В теле которой происходит проверка состояния флажка и если он не установлен, то произойдет сброс всех &laquo;фильтров&raquo; таблиц и перезагрузка данных в таблице.<br />
Но самое интересное это код в &laquo;положительной&raquo; ветке if&#8217;а, когда флажок установлен. Мы знаем, что ведущая таблица расположена вверху, значит для начала узнаем какая же таблица в данный момент находится там. Для этого получаем значение атрибута <em>id</em> первого контейнера (строка 6).  Теперь зная какая таблица ведущая &#8211; получаем объект <strong>postData</strong>, который, напомню, содержит все параметры и их значения для отправки серверу. В 7й строке получим Id записи в выделенной строке ведущей таблицы. Далее проверив значение фильтра ведущей таблицы, при необходимости сбросим его. Это необходимо если пользователь поменял таблицы местами.<br />
В строке 16 узнаем id контейнера ведомой таблицы. И применяем фильтр, записав id выделенной строки в ведущей таблице, и перезагружаем данные.<br />
У данного скрипта есть один недостаток &#8211; расплата за универсальность. Из-за того что на событие <strong>onSelectRow:</strong> в обоих таблицах определен один и тот же обработчик <strong>stickTogether</strong>, при выделении строки в ведомой таблице, происходит постоянное обновление ее записей. Но уверен что те кому потребуется такой функционал jqGrid без труда смогут это исправить. </p>
<p><strong>Заключение</strong><br />
Подведя итоги проделанной работы можно сказать, что в данной статье мы рассмотрели практически все варианты расширенного использования плагина. Научились работать с древовидными данными и подтаблицами, а также попробовали управлять содержимым ведомой таблицы посредством данных из ведущей. В следующей части я рассмотрю еще одну экзотическую интересную опцию jqGrid &#8211; &laquo;drag&#8217;n'drop записей между jqGrid&#8217;ами&raquo;.<br />
Ну и как всегда если у вас возникли вопросы задавайте их на <a href="http://www.linkexchanger.su/forum/">форуме</a> ну а комментарии используйте для предложений и пожеланий.</p>
<p>Итак приблизительный план работ на следующий выпуск:</p>
<ul>
<li><strong>Расширенные возможности jqGrid</strong>
<ul>
<li>drag&#8217;n'drop записей между jqGrid&#8217;ами</li>
</ul>
</li>
<li><strong>Поиск данных в jqGrid</strong>
<ul>
<li>&laquo;inline&raquo; поиск</li>
<li>поиск с использованием встроенной формы</li>
<li>расширенный поиск с использованием встроенной формы</li>
<li>поиск с использованием внешней формы</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2010/523.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; плагин Sortable</title>
		<link>http://www.linkexchanger.su/2009/111.html</link>
		<comments>http://www.linkexchanger.su/2009/111.html#comments</comments>
		<pubDate>Fri, 09 Oct 2009 05:07:24 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sortable]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/111.html</guid>
		<description><![CDATA[Плагин Sortable &#8211; один из нескольких плагинов, входящих в состав jQuery UI, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Sortable предоставляет возможность организовать сортировку элементов, перемещая их с помощью указателя мыши.

Читаем, и пробуем проделать все это самостоятельно.
Для начала посетим страницу настраиваемой закачки на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин <strong>Sortable</strong> &#8211; один из нескольких плагинов, входящих в состав <strong>jQuery UI</strong>, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Sortable предоставляет возможность организовать сортировку элементов, перемещая их с помощью указателя мыши.<br />
<iframe src="http://www.linkexchanger.su/examples_2009/ui_sortable/example-one.html" style="border: 1px solid #6699cc; overflow: hidden" height="320" width="418"></iframe><br />
Читаем, и пробуем проделать все это самостоятельно.<span id="more-111"></span></p>
<p>Для начала посетим страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong>, чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Sortable</strong> и видим, что вместе с ним отметились <strong>чекбоксы UI Core и Draggable</strong>. Работа плагина Sortable зависит от них, поэтому они необходимы.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив.</p>
<p>Сначала в разделе HEAD подключаем несколько файлов, которые есть в архиве:</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/sunny/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Здесь мы подключили файл стилей css/sunny/jquery-ui-1.7.2.custom.css одной из многочисленных тем оформления. Хотите использовать Ваше собственное оформление &#8211; пожалуйста, но в примере мы используем готовое. Кроме этого мы подключили файл библиотеки – js/jquery-1.3.2.min.js и файл js/jquery-ui-1.7.2.custom.min.js, в котором объединена функциональность ядра UI и плагинов Sortable и Draggable.</p>
<p>Смотрим HTML-разметку. Пусть у нас она будет выглядеть так:</p>
<pre class="brush: xml;">&lt;ul id=&quot;sortable&quot;&gt;
  &lt;li class=&quot;ui-state-default&quot;&gt;Item 1&lt;/li&gt;
  &lt;li class=&quot;ui-state-default&quot;&gt;Item 2&lt;/li&gt;
  &lt;li class=&quot;ui-state-default&quot;&gt;Item 3&lt;/li&gt;
  &lt;li class=&quot;ui-state-default&quot;&gt;Item 4&lt;/li&gt;
  &lt;li class=&quot;ui-state-default&quot;&gt;Item 5&lt;/li&gt;
  &lt;li class=&quot;ui-state-default&quot;&gt;Item 6&lt;/li&gt;
  &lt;li class=&quot;ui-state-default&quot;&gt;Item 7&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>и следующий javascript-код, который применит к выбранному элементу функциональность плагина Sortable.</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#sortable&quot;).sortable();
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_sortable/example-one.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>В этом примере мы использовали плагин с настройками по умолчанию, но поскольку его можно очень гибко настраивать с помощью большого количества различных опций, то обязательно надо познакомиться с тем, как это делается. В следующем примере мы передадим плагину пару опций.</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#sortable&quot;).sortable({
  	placeholder: &quot;ui-state-highlight&quot;,
  	opacity: 0.6
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_sortable/example-two.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Опция placeholder передает плагину имя css-класса, который будет применен к той позиции, откуда элемент начал перемещение (или куда он может быть помещен), а опция opacity устанавливает прозрачность элемента во время перемещения. Значения остальных опций передаются плагину подобным образом.</p>
<p><strong>appendTo</strong> &#8211; по умолчанию эта опция имеет значение &#8216;parent&#8217;. В ней можно передать селектор jQuery или элемент, который будет использован в качестве контейнера для объекта, представляющего сортируемый элемент во время его перемещения.<br />
<strong>axis</strong> &#8211; в качестве значения используется строка. Доступные значения &#8216;x&#8217; или &#8216;y&#8217;. По умолчанию установлено false. Если определить эту опцию, сортируемые элементы смогут перемещаться только по вертикали или горизонтали.<br />
<strong>cancel</strong> &#8211; в качестве значения используется селектор jQuery. Предотвращает сортировку, если она начинается на элементе, указанном в это опции. По умолчанию используется значение &#8216;:input,button&#8217;.<br />
<strong>connectWith</strong> &#8211; в качестве значения принимает селектор jQuery, где можно указать другой сортируемый список, в который можно будет перемещать сортируемые элементы, таким образом, что они станут частью другого сортируемого списка.<br />
<strong>containment</strong> &#8211; ограничивает перемещение внутри определенного элемента или области. В качестве значения может принимать селектор jQuery, элемент или строку. Примеры возможных значений: &#8216;parent&#8217;, &#8216;document&#8217;, &#8216;window&#8217;. По умолчанию – false.<br />
<strong>cursor</strong> &#8211; строка, определяющая вид курсора в процессе перемещения элемента. По умолчанию установлено значение &#8216;auto&#8217;.<br />
<strong>cursorAt</strong> &#8211; объект, который определяет положение указателя мыши во время перемещения элемента. Для задания координат используется комбинация одного или двух свойств из четырех возможных &#8211; &#8216;top&#8217;, &#8216;right&#8217;, &#8216;bottom&#8217; и &#8216;left&#8217;. Например: {top: 10, left: 20} или {bottom: 5}. По умолчанию – false.<br />
<strong>delay</strong> &#8211; число, указанное в этой опции, определяет отсрочку начала перемещения элемента. Указывается в миллисекундах. Опция помогает предотвратить нежелательное перемещение элемента во время случайного щелчка мышью. По умолчанию используется значение 0.<br />
<strong>distance</strong> &#8211; число в пикселах, определяющее расстояние, которое должен пройти указатель мыши (с одновременно нажатой левой клавишей), чтобы начался процесс перемещения элемента. Опция помогает предотвратить нежелательное перемещение элемента во время случайного щелчка мышью. По умолчанию используется значение 1.<br />
<strong>dropOnEmpty</strong> &#8211; по умолчанию используется значение true. В этом случае, если один из связанных списков пустой, в него можно перемещать элементы из другого списка. Если установить значение false, эта возможность будет запрещена.<br />
<strong>grid</strong> &#8211; по умолчанию – false. Значением может быть массив из двух чисел, определяющий шаг сетки, по которой будет перемещаться сортируемый элемент. Например: grid: [20,20]<br />
<strong>handle</strong> &#8211; по умолчанию установлено значение false. В качестве значения можно указать селектор jQuery или элемент. В этом случае процесс сортировки можно будет начать только в том случае, если левая клавиша мыши нажата в момент нахождения указателя мыши над элементом, определенным в этой опции.<br />
<strong>helper</strong> &#8211; по умолчанию используется значение &#8216;original&#8217;. В этом случае, при сортировке, перемещаемый элемент представлен самим элементом. Другое возможное значение &#8216;clone&#8217;. В этом случае элемент при перемещении представлен своей копией.<br />
<strong>items</strong> &#8211; в качестве значения используется селектор jQuery. По умолчанию установлено значение &#8216;&gt; *&#8217;. Опция определяет, какие элементы, являющиеся элементами-потомками того элемента, с которым связана функциональность плагина, могут быть сортируемыми.<br />
<strong>opacity</strong> &#8211; значение опции может изменяться от 0.01 до 1 и определяет прозрачность перемещаемого элемента. По умолчанию – false.<br />
<strong>placeholder</strong> &#8211; имя css-класса, который будет применен к той позиции, откуда элемент начал перемещение. Если значение опции не определено «пустая» позиция никак не оформляется.<br />
<strong>revert</strong> &#8211; по умолчанию используется значение false. Если использовать значение true, то при перемещении элемента, после того, как будет отпущена клавиша мыши, элемент переместится на свою новую позицию с использованием плавного анимационного эффекта.<br />
<strong>scroll</strong> &#8211; по умолчанию установлено значение true – при перемещении элемента к краю области просмотра, она автоматически прокручивается бесконечно. Если установить значение false, эта возможность будет запрещена.<br />
<strong>scrollSensitivity</strong> &#8211; число, определяющее расстояние в пикселах от края области просмотра, после которого она начинает прокручиваться. Расстояние определяется относительно указателя мыши, а не перемещаемого элемента. По умолчанию установлено значение 20.<br />
<strong>scrollSpeed</strong> &#8211; число, определяющее скорость, с которой прокручивается область просмотра при приближении указателя мыши к ее краю на расстояние определенное в опции scrollSensitivity. По умолчанию установлено значение 20.<br />
<strong>tolerance</strong> &#8211; по умолчанию эта опция имеет значение &#8216;intersect&#8217;. При этом элемент, перемещаемый во время сортировки должен перекрыть любой другой сортируемый элемент как минимум на 50%, чтобы тот «освободил» занимаемое место. Другое возможное значение &#8211; &#8216;pointer&#8217;. При этом над сортируемым элементом должен оказаться только указатель мыши.<br />
<strong>zIndex</strong> &#8211; число, которое определяет значение css-свойства z-index для элемента в момент его сортировки.</p>
<p>Настало время познакомиться с событиями, на которые умеет реагировать плагин Sortable. Пример использования одного из возможных событий плагина приведен в следующем примере:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#sortable&quot;).sortable({
  	placeholder: &quot;ui-state-highlight&quot;,
  	opacity: 0.6,
  	stop: function(event, ui) {
  	  alert(event.type);
  	}
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_sortable/example-three.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Здесь мы использовали только опцию stop, в которой определили функцию, которая будет вызвана в момент окончания сортировки. Функция может принимать два аргумента. Первый аргумент – объект события, второй – специальный объект ui, в свойствах которого можно обнаружить разнообразную полезную информацию. Но в приведенном примере мы используем только свойство type объекта события, чтобы вывести в окне предупреждения название события, вызвавшего нашу функцию.</p>
<p>А вот пример того, как можно использовать специальный объект ui:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#sortable&quot;).sortable({
    placeholder: &quot;ui-state-highlight&quot;,
    opacity: 0.6,
    helper: &quot;clone&quot;,
    change: function(event, ui) {
      ui.helper.css(&quot;color&quot;,&quot;#f00&quot;);
    }
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_sortable/example-four.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Мы использовали опцию change, чтобы вызвать функцию в момент изменения положения сортируемого элемента. Внутри функции мы обращаемся к одному из свойств объекта ui – к свойству helper. Это свойство является объектом, который представляет перемещаемый элемент во время сортировки. Используя метод css(name,value) мы устанавливаем красный цвет шрифта на перемещаемом элементе. Но, как только этот элемент займет свое новое место в списке, цвет шрифта вернется к исходному значению. Догадались почему? Если нет, то обратите внимание на опцию helper. Установив значение clone в этой опции, мы использовали во время перемещения не сам исходный объект, а его копию.<br />
Кстати, helper – это не единственное полезное свойство объекта ui, есть и другие:</p>
<p><strong>ui.helper</strong> – объект, характеризующий элемент, находящийся в процессе перемещения;<br />
<strong>ui.position</strong> – объект, в свойствах top и left которого содержится информация о положении перемещаемого элемента относительно родительского элемента;<br />
<strong>ui.offset</strong> – объект, в свойствах top и left которого содержится информация об абсолютном положении перемещаемого элемента;<br />
<strong>ui.item</strong> – объект, представляющий сортируемый элемент;<br />
<strong>ui.placeholder</strong> – объект, представляющий место, откуда был перемещен сортируемый элемент (или куда он будет перемещен);<br />
<strong>ui.sender</strong> – объект, который представляет элемент-контейнер для сортируемых элементов, откуда сортируемый элемент был перемещен (при использовании связанных списков);</p>
<p>Ниже перечислены опции, связанные с событиями плагина Sortable, их довольно много:<br />
Опция <strong>start</strong> &#8211; событие <em>sortstart</em> наступает в момент начала сортировки.<br />
Опция <strong>sort</strong> &#8211; событие <em>sort</em> наступает постоянно в течение сортировки.<br />
Опция <strong>change</strong> &#8211; событие <em>sortchange</em> наступает во время сортировки, но только в том случае, если изменилось положение сортируемого элемента в объектной модели документа.<br />
Опция <strong>beforeStop</strong> &#8211; событие <em>sortbeforeStop</em> наступает в момент сортировки, перед ее окончанием (когда отпущена левая клавиша мыши).<br />
Опция <strong>stop</strong> &#8211; событие <em>sortstop</em> наступает в момент окончания сортировки.<br />
Опция <strong>update</strong> &#8211; событие <em>sortupdate</em> наступает в момент окончания сортировки, но только в том случае, если порядок сортируемых элементов был изменен.<br />
Опция <strong>receive</strong> &#8211; событие <em>sortreceive</em> наступает, когда связанный сортируемый список принимает элемент из другого списка.<br />
Опция <strong>remove</strong> &#8211; событие <em>sortremove</em> наступает, когда элемент покидает один связанный список, и перемещается в другой.<br />
Опция <strong>over</strong> &#8211; событие <em>sortover</em> наступает, когда сортируемый элемент перемещен в связанный список.<br />
Опция <strong>out</strong> &#8211; событие <em>sortout</em> наступает, когда сортируемый элемент перемещен из связанного списка.<br />
Опция <strong>activate</strong> &#8211; событие <em>sortactivate</em> наступает при использовании связанных списков, для каждого связанного списка при начале процесса сортировки.<br />
Опция <strong>deactivate</strong> &#8211; событие <em>sortdeactivate</em> наступает при использовании связанных списков, для каждого связанного списка при окончании процесса сортировки.</p>
<p>А теперь &#8211; методы плагина. С помощью методов можно управлять плагином после инициализации. Сначала добавим кнопочку в HTML-разметку:</p>
<pre class="brush: xml;">&lt;button id=&quot;cancelSort&quot;&gt;Cancel Sort&lt;/button&gt;</pre>
<p>и небольшой пример:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#sortable&quot;).sortable({
  	placeholder: &quot;ui-state-highlight&quot;,
  	opacity: 0.6
  });
  $(&quot;#cancelSort&quot;).click(function(){
  	$(&quot;#sortable&quot;).sortable(&quot;cancel&quot;);
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_sortable/example-five.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Метод .sortable(&laquo;cancel&raquo;) использованный в примере, один из самых полезных методов плагина. Он позволяет отменить результат последней операции сортировки и вернуть элементы к предшествующему состоянию.<br />
Обратите внимание на элемент button с идентификатором #cancelSort. С кнопкой связан обработчик события click, по которому и вызывается метод соответствующий метод.<br />
Если Вы попробуете переместить один из элементов с писка на новое место, а затем нажать на кнопку cancelSort, список вернется в предыдущее состояние.</p>
<p>Но конечно, этот метод не единственный. Вот другие:<br />
<strong>destroy</strong> &#8211; .sortable(&#8216;destroy&#8217;) полностью удаляет всю функциональность плагина Sortable. Возвращает элементы в состояние, предшествующее инициализации.<br />
<strong>disable</strong> &#8211; .sortable(&#8216;disable&#8217;) временно запрещает использование всей функциональности плагина. Вновь разрешить ее использование можно с помощью метода enable.<br />
<strong>enable</strong> &#8211; .sortable(&#8216;enable&#8217;) разрешает использование всей функциональности плагина, если ранее она была запрещена с использованием метода disable.<br />
<strong>option</strong> &#8211; .sortable(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции плагина после инициализации.<br />
<strong>serialize</strong> &#8211; .sortable(&#8217;serialize&#8217;, [option]) упорядочивает значение атрибутов id элементов сортируемого списка в строку, которую можно передать на сервер с помощью ajax-запроса. Предъявляет требования к формату записи значения атрибута id. Допустимые форматы: id=&#8217;name_number&#8217; или id=&#8217;name-number&#8217;. В этом случае вид строки получается &#8216;name[]=number&amp; name[]=number&#8217;. Вторым, необязательным параметром, можно передать объект. Возможные значения: &#8216;key&#8217; – заменит часть &#8216;name[]&#8216; на необходимую Вам, &#8216;attribute&#8217; – попробует получить значения из атрибута, отличного от id, &#8216;expression&#8217; – можно использовать свое регулярное выражение.<br />
<strong>toArray</strong> &#8211; .sortable(&#8216;toArray&#8217;) упорядочивает значение атрибутов id элементов сортируемого списка в массив.<br />
<strong>cancel</strong> &#8211; .sortable(&#8216;cancel&#8217;) отменяет результат последней операции сортировки и возвращает элемент в состояние, предшествующее этой операции. Метод полезен при использовании в callback-функциях, связанных с событиями stop или receive.</p>
<p>Ну, и &laquo;на сладкое&raquo; &#8211; конечно обязательно надо дать пример использования связанных списков.</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#sortable1, #sortable2&quot;).sortable({
  	connectWith: &quot;.connectedSortable&quot;,
  	tolerance: &quot;pointer&quot;
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_sortable/example-six.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Я привел пример только javascript-кода, поскольку в HTML-коде страницы ничего особенного нет – просто два ненумерованных списка #sortable1 и #sortable2. С помощью javascript-кода мы сделаем их сортируемыми, указав их идентификаторы в селекторе jQuery и связав с ними функциональность Sortable. Самое главное заключается в использовании опции connectWith. Здесь мы указываем имя класса для того списка, который хотим сделать связанным с другим списком.<br />
Обратите внимание, что атрибут class со значением connectedSortable мы присвоили обоим спискам и добились того, что элементы могут перемещаться не только из первого списка во второй, но и наоборот. Если бы мы захотели организовать только «одностороннее движение», скажем из первого списка во второй, мы бы присвоили класс connectedSortable только второму списку.</p>
<p>Теперь сортируемые элементы можно переносить из одного списка в другой и элемент, перемещенный из одного списка в другой, становится частью другого списка.</p>
<blockquote><p>Все примеры, использованные в статье, можно совершенно запросто получить в этом <a href="http://www.linkexchanger.su/examples_2009/ui_sortable/ui_sortable.zip">архиве</a>.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/111.html/feed</wfw:commentRss>
		<slash:comments>74</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; плагин Selectable</title>
		<link>http://www.linkexchanger.su/2009/110.html</link>
		<comments>http://www.linkexchanger.su/2009/110.html#comments</comments>
		<pubDate>Thu, 08 Oct 2009 05:23:17 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[selectable]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/110.html</guid>
		<description><![CDATA[Плагин Selectable &#8211; один из нескольких плагинов, входящих в состав jQuery UI, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Он дает возможность выбора элементов с помощью передвижения указателя мыши с удержанием в нажатом состоянии ее левой клавиши или комбинации щелчка мышью с нажатием и удержанием клавиши Ctrl (Meta), подобно тому, как это делается [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин <strong>Selectable</strong> &#8211; один из нескольких плагинов, входящих в состав <strong>jQuery UI</strong>, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Он дает возможность выбора элементов с помощью передвижения указателя мыши с удержанием в нажатом состоянии ее левой клавиши или комбинации щелчка мышью с нажатием и удержанием клавиши Ctrl (Meta), подобно тому, как это делается в традиционных приложениях.<br />
<iframe src="http://www.linkexchanger.su/examples_2009/ui_selectable/example-one.html" style="border: 1px solid #6699cc; overflow: hidden" height="320" width="418"></iframe><br />
Сделаем сами?<span id="more-110"></span></p>
<p>Идем на страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong>, чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Selectable</strong> и видим, что вместе с ним отметился <strong>чекбокс UI Core</strong>. Работа плагина Selectable зависит от него, поэтому он необходим.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив.</p>
<p>Сначала в разделе HEAD подключаем несколько файлов, которые есть в архиве.</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/le-frog/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Подключили файл стилей css/le-frog/jquery-ui-1.7.2.custom.css одной из многочисленных тем оформления. Конечно, свое собственное оформление лучше, но для изучения примеров воспользуемся готовым оформлением. Кроме этого мы подключили файл библиотеки – js/jquery-1.3.2.min.js и файл js/jquery-ui-1.7.2.custom.min.js, в котором объединена функциональность ядра UI и плагина Selectable.</p>
<p>Опыты будем ставить над списком ol, пункты которого нам предстоит сделать выделяемыми. Вот пример HTML-разметки:</p>
<pre class="brush: xml;">&lt;ol id=&quot;selectable&quot;&gt;
  &lt;li class=&quot;ui-widget-content&quot;&gt;Item 1&lt;/li&gt;
  &lt;li class=&quot;ui-widget-content&quot;&gt;Item 2&lt;/li&gt;
  &lt;li class=&quot;ui-widget-content&quot;&gt;Item 3&lt;/li&gt;
  &lt;li class=&quot;ui-widget-content&quot;&gt;Item 4&lt;/li&gt;
  &lt;li class=&quot;ui-widget-content&quot;&gt;Item 5&lt;/li&gt;
  &lt;li class=&quot;ui-widget-content&quot;&gt;Item 6&lt;/li&gt;
  &lt;li class=&quot;ui-widget-content&quot;&gt;Item 7&lt;/li&gt;
&lt;/ol&gt;</pre>
<p>и пример javascript-кода, который связывает с подопытным списком функциональность плагина:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#selectable&quot;).selectable();
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_selectable/example-one.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Это был пример, где все возможные настройки устанавливались по умолчанию. Не будем с этим мириться и попробуем передать какие-нибудь настройки самостоятельно.</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#selectable&quot;).selectable({
    distance: 30
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_selectable/example-two.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>В примере мы передали плагину значение 30 в опции distance, и этим определили расстояние в пикселах, которое должен пройти указатель мыши (с одновременно нажатой левой клавишей), прежде, чем начнется выделение указанных элементов. Значения для остальных опций можно передать плагину подобным образом. Опций у этого плагина немного, всего шесть:</p>
<p><strong>autoRefresh</strong> &#8211; по умолчанию установлено значение true, что определяет пересчет положения и размеров области выделения при попадании туда очередного элемента. Если таких элементов очень много, может понадобиться отключить пересчет. Для этого следует установить значение false. При необходимости можно будет использовать для пересчета метод .selectable(&#8216;refresh&#8217;).<br />
<strong>cancel</strong> &#8211; опция принимает в качестве значения селектор jQuery. Предотвращает начало выбора элементов, если при начале выбор указатель мыши находится над указанными элементами. По умолчанию установлено значение &#8216;:input,option&#8217;.<br />
<strong>delay</strong> &#8211; в опции указывается число, устанавливающее время в миллисекундах, определяющее задержку начала выбора элементов. По умолчанию – 0.<br />
<strong>distance</strong> &#8211; в опции указывается число, устанавливающее расстояние в пикселах, которое должен пройти указатель мыши до начала выбора элементов. По умолчанию – 0.<br />
<strong>filter</strong> &#8211; в качестве значения опции указывается селектор jQuery. По умолчанию используется значение &#8216;*&#8217;. В этой опции можно указывать элементы-потомки, которые будут сделаны выбранными (при условии, если они могут быть таковыми).<br />
<strong>tolerance</strong> &#8211; опция принимает в качестве значения строку. По умолчанию используется значение &#8216;touch&#8217;. Возможные значения <em>&#8216;touch&#8217;</em> и <em>&#8216;fit&#8217;</em>. При использовании значения <em>&#8216;touch&#8217;</em> выбор элемента производится, когда область выбора перекрывает элемент какой-либо частью. При использовании значения <em>&#8216;fit&#8217;</em> выбор элемента производится, только когда область выбора перекрывает элемент полностью.</p>
<p>Посмотрим теперь, на какие события может реагировать плагин Selectable. Таких событий всего шесть. Для начала разберем простенький пример:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#selectable&quot;).selectable({
    stop: function(event, ui) {
      alert(event.type);
    }
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_selectable/example-three.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Callback-функция, которую мы определили в опции stop, может принимать два аргумента. Первый аргумент – объект события. Мы используем его внутри функции, обращаясь к свойству type, чтобы вывести в окне предупреждения название события, вызвавшего функцию.</p>
<p>В следующем примере используем еще пару опций, связанных с событиями и заодно опробуем объект ui:</p>
<pre class="brush: jscript;">$(function(){
 $(&quot;#selectable&quot;).selectable({
  start: function(event) {
   $(&quot;#result&quot;).empty().append(&quot;Событие: &quot; +
   event.type);
  },
  selected: function(event, ui) {
   $(&quot;#result&quot;).append(&quot;Событие: &quot; + event.type +
   &quot; для &quot; + ui.selected.innerHTML);
  },
  stop: function(event) {
   $(&quot;#result&quot;).append(&quot;Событие: &quot; +
    event.type);
   }
 });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_selectable/example-four.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>В этом примере мы использовали опции start, selected и stop. В опциях start и stop определяются callback-функции, которые вызываются при начале и окончании выбора элементов. В опции selected можно определить callback-функцию, которая вызывается для каждого выбранного элемента по окончании выбора.</p>
<p><strong>selected</strong> &#8211; событие <em>selected</em> наступает по окончании выбора для каждого выбранного элемента.<br />
<strong>selecting</strong> &#8211; событие <em>selecting</em> наступает в процессе выбора для каждого выбранного элемента.<br />
<strong>start</strong> &#8211; событие <em>selectablestart</em> наступает при начале процесса выбора.<br />
<strong>stop</strong> &#8211; событие <em>selectablestop</em> наступает при окончании процесса выбора.<br />
<strong>unselected</strong> &#8211; событие <em>unselected</em> наступает по окончании выбора для каждого элемента не попавшего в выбор по сравнению с предыдущим состоянием.<br />
<strong>unselecting</strong> &#8211; событие <em>unselecting</em> происходит в процессе выбора, когда какой-либо элемент, присутствовавший в выборе, удаляется из него.</p>
<p>Еще плагин Selectable имеет несколько методов, с помощью которых можно управлять им после инициализации. Для того, чтобы испытать методы, добавим несколько кнопок в HTML-разметку:</p>
<pre class="brush: xml;">&lt;button id=&quot;disable&quot;&gt;Disable&lt;/button&gt;
&lt;button id=&quot;enable&quot;&gt;Enable&lt;/button&gt;
&lt;button id=&quot;destroy&quot;&gt;Destroy&lt;/button&gt;</pre>
<p>и используем вот такой javascript-код:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#selectable&quot;).selectable();
  $(&quot;#disable&quot;).click(function(){
  	$(&quot;#selectable&quot;).selectable(&quot;disable&quot;);
  });
  $(&quot;#enable&quot;).click(function(){
  	$(&quot;#selectable&quot;).selectable(&quot;enable&quot;);
  });
  $(&quot;#destroy&quot;).click(function(){
  	$(&quot;#selectable&quot;).selectable(&quot;destroy&quot;);
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_selectable/example-five.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Мы используем три кнопки с идентификаторами #disable, #enable и #destroy, связывая с ними события click. При нажатии на кнопки вызываем соответствующий метод плагина Sortable, временно запрещая использование функциональности плагина, вновь восстанавливая эту функциональность, и удаляя ее окончательно, возвращая элементы в состояние, предшествующее инициализации.</p>
<p><strong>destroy</strong> &#8211; .selectable(&#8216;destroy&#8217;) полностью удаляет всю функциональность плагина Selectable. Возвращает элементы в состояние, предшествующее инициализации.<br />
<strong>disable</strong> &#8211; .selectable(&#8216;disable&#8217;) временно запрещает использование всей функциональности плагина. Вновь разрешить ее использование можно с помощью метода enable.<br />
<strong>enable</strong> &#8211; .selectable(&#8216;enable&#8217;) разрешает использование всей функциональности плагина, если ранее она была запрещена с использованием метода disable.<br />
<strong>option</strong> &#8211; .selectable(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции плагина после инициализации.<br />
<strong>refresh</strong> &#8211; .selectable(&#8216;refresh&#8217;) этот метод обычно используется, если для опции autoRefresh установлено значение false. С помощью него можно пересчитать положение и размеры области выделения.</p>
<blockquote><p> Все примеры, использованные в статье, можно совершенно запросто получить в этом <a href="http://www.linkexchanger.su/examples_2009/ui_selectable/ui_selectable.zip">архиве</a>.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/110.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; плагин Resizable</title>
		<link>http://www.linkexchanger.su/2009/109.html</link>
		<comments>http://www.linkexchanger.su/2009/109.html#comments</comments>
		<pubDate>Wed, 07 Oct 2009 05:12:13 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Resizable]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/109.html</guid>
		<description><![CDATA[Плагин Resizable &#8211; один из нескольких плагинов, входящих в состав jQuery UI, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Resizable позволяет изменять размеры выбранных элементов с помощью перемещения указателем мыши. Посмотрите на примере:

А сделать это не так сложно как кажется на первый взгляд. Конечно, если делать с помощью jQuery.
Для начала посетим страницу [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин <strong>Resizable</strong> &#8211; один из нескольких плагинов, входящих в состав <strong>jQuery UI</strong>, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Resizable позволяет изменять размеры выбранных элементов с помощью перемещения указателем мыши. Посмотрите на примере:<br />
<iframe src="http://www.linkexchanger.su/examples_2009/ui_resizable/example-one.html" style="border: 1px solid #6699cc; overflow: hidden" height="280" width="418"></iframe><br />
А сделать это не так сложно как кажется на первый взгляд. Конечно, если делать с помощью jQuery.<span id="more-109"></span></p>
<p>Для начала посетим страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong>, чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Resizable</strong> и видим, что вместе с ним отметился <strong>чекбокс UI Core</strong>. Работа плагина Resizable зависит от него, поэтому он необходим.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив.</p>
<p>В разделе <strong>HEAD</strong> веб-страницы необходимо подключить несколько файлов, которые есть в архиве:</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/start/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Сначала подключаем файл стилей css/start/jquery-ui-1.7.2.custom.css одной из многочисленных тем оформления. Вероятно, Вы будете использовать свое собственное оформление, но для изучения примеров лучше воспользоваться готовым оформлением. Кроме этого мы подключили файл библиотеки – js/jquery-1.3.2.min.js и файл js/jquery-ui-1.7.2.custom.min.js, в котором объединена функциональность ядра UI и плагина Resizable.</p>
<p>Для примера возьмем следующую HTML-разметку:</p>
<pre class="brush: xml;">&lt;div id=&quot;resizable&quot; class=&quot;ui-widget-content&quot;&gt;
&lt;h3 class=&quot;ui-widget-header&quot;&gt;Resizable&lt;/h3&gt;
&lt;/div&gt;</pre>
<p>И javascript-код, который &laquo;привяжет&raquo; возможности плагина Resizable к выбранному элементу:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#resizable&quot;).resizable();
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_resizable/example-one.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>И больше ничего! По крайней мере для того, чтобы использовать все настройки по умолчанию этого вполне хватит. Но мы попробуем передать плагину несколько опций:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#resizable&quot;).resizable({
  	animate: true,
  	ghost: true
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_resizable/example-two.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Мы передали плагину две опции – animate и ghost. В обоих случаях передали логическое значение true. Но, что же мы этим смогли добиться?<br />
Передав значение true в опции animate, мы добились того, что теперь при изменении размеров элемента будет использоваться анимационный эффект.<br />
В случае с ghost: true при изменении размеров элемента будут отображаться его полупрозрачные контуры.<br />
Остальные опции, как Вы понимаете, используются таким же образом &#8211; главное знать, за что какая отвечает&#8230;</p>
<p><strong>alsoResize</strong> &#8211; по умолчанию имеет значение false. Может принимать селектор jQuery, объект jQuery или элемент. Элементы, определенные в этой опции также меняют свои размеры.<br />
<strong>animate</strong> &#8211; по умолчанию установлено значение false. Если установить значение true, при изменении размера будет использоваться анимация.<br />
<strong>animateDuration</strong> &#8211; в качестве значения опция принимает строку с предопределенными значениями &#8211; &#8217;slow&#8217;, &#8216;normal&#8217;, &#8216;fast&#8217; или число в миллисекундах, определяющее длительность анимационного эффекта при изменении размера элемента.<br />
<strong>animateEasing</strong> &#8211; опция принимает строку с названием анимационного эффекта. Большое количество разнообразных эффектов можно использовать при условии подключения дополнительного плагина jQuery Easing. По умолчанию имеет значение &#8217;swing&#8217;.<br />
<strong>aspectRatio</strong> &#8211; по умолчанию имеет значение false. Если установить true, при изменении размеров элемента будет сохраняться пропорция в соотношении сторон. Возможно также, передавать значения в виде 16/9 или 0.75. В этом случае пропорции в соотношении сторон будут установлены в соответствии с указанным значением.<br />
<strong>cancel</strong> &#8211; в качестве значения указывается селектор jQuery. Предотвращает изменение размеров для элементов, указанных в этой опции. По умолчанию имеет значение &#8216;:input,option&#8217;.<br />
<strong>containment</strong> &#8211; ограничивает изменение размеров внутри элемента определенного в этой опции. Значением может быть строка (например &#8216;parent&#8217;, &#8216;document&#8217;), элемент DOM или селектор jQuery. По умолчанию установлено значение false.<br />
<strong>delay</strong> &#8211; в этой опции можно указать число в миллисекундах, определив задержку старта изменения размеров элемента. По умолчанию установлено значение 0. Эта опция помогает предотвратить случайное изменение размеров элемента при щелчке мышью.<br />
<strong>distance</strong> &#8211; по умолчанию установлено значение 1. Опция определяет количество пикселей, на которое переместиться указатель мыши, прежде, чем начнется изменение размеров элемента. Эта опция помогает предотвратить случайное изменение размеров элемента при щелчке мышью.<br />
<strong>ghost</strong> &#8211; по умолчанию установлено значение false. Если установить true, при изменении размеров элемента будут видны его полупрозрачные контуры.<br />
<strong>grid</strong> &#8211; в качестве значения принимает массив элементов [x, y], где x и y – числа, определяющие шаг сетки. Изменение размеров будет происходить дискретно, в соответствии с заданными значениями. По умолчанию установлено значение false.<br />
<strong>handles</strong> &#8211; принимает строку в качестве значения. По умолчанию установлено значение &#8216;e, s, se&#8217;. Можно использовать любые из следующих обозначений &#8216;n, e, s, w, ne, se, sw, nw, all&#8217; или их комбинации.<br />
<strong>helper</strong> &#8211; по умолчанию опция имеет значение false. Принимает строку с названием css-класса, который добавляется к области, демонстрирующей во время перемещения размеры, в которые установится элемент.<br />
<strong>maxHeight</strong> &#8211; число, определяющее максимальную высоту, до которой можно изменять размеры элемента. По умолчанию – null.<br />
<strong>maxWidth</strong> &#8211; число, определяющее максимальную ширину, до которой можно изменять размеры элемента. По умолчанию – null.<br />
<strong>minHeight</strong> &#8211; число, определяющее минимальную высоту, до которой можно изменять размеры элемента. По умолчанию – 10.<br />
<strong>minWidth</strong> &#8211; число, определяющее минимальную ширину, до которой можно изменять размеры элемента. По умолчанию – 10.</p>
<p>Плагин Resizable, как и остальные плагины из UI jQuery, может реагировать на события. Он имеет три опции, в которых можно определить callback-функции, вызываемые при наступлении соответствующего события.</p>
<p>Опция <strong>start</strong> &#8211; событие <em>resizestart</em> наступает при начале изменения размеров элемента.<br />
Опция <strong>resize</strong> &#8211; событие <em>resize</em> наступает постоянно во время изменения размеров элемента.<br />
Опция <strong>stop</strong> &#8211; событие <em>resizestop</em> наступает при окончании изменения размеров элемента.</p>
<p>Однако на примере все равно лучше:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#resizable&quot;).resizable({
    ghost: true,
    stop:  function(event, ui) {
      alert(&quot;Событие &quot; + event.type);
    }
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_resizable/example-three.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>В этом примере мы определили в опции stop callback-функцию, которая будет вызвана в момент окончания изменения размеров элемента. Функция может принимать два аргумента. Первый аргумент – это объект события, к свойству type которого можно легко обратиться. Теперь, при окончании изменения размеров выбранного элемента мы получим окно предупреждения, в котором будет выведено название события, вызвавшего эту функцию.<br />
Что касается второго аргумента, то это объект, в свойствах которого содержится весьма полезная информация. Как можно обратиться к некоторым свойствам этого объекта показано в следующем примере:</p>
<pre class="brush: jscript;">$(function(){
 $(&quot;#resizable&quot;).resizable({
  ghost: true,
  stop:  function(event, ui) {
   alert(&quot;Начальные размеры: &quot; + ui.originalSize.width +
      &quot;x&quot; + ui.originalSize.height +
      &quot;px\nКонечные размеры: &quot; + ui.size.width +
      &quot;x&quot; + ui.size.height + &quot;px&quot;);
  }
 });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_resizable/example-four.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Здесь мы обращаемся к свойствам объекта ui originalSize и size. Оба свойства также представляют собой объекты, в свойствах width и height которых сохраняются значения ширины и высоты начальных размеров элемента (originalSize) и его конечных размеров (size).</p>
<p>Перечислим основные свойства специального объекта ui:<br />
<strong>ui.helper</strong> – объект, представляющий изменяемый элемент;<br />
<strong>ui.size</strong> – объект, в свойствах width и height которого сохраняются текущие ширина и высота элемента;<br />
<strong>ui.originalSize</strong> – объект, в свойствах width и height которого сохраняются ширина и высота элемента до изменения его размеров;<br />
<strong>ui.position</strong> – объект, в свойствах top и left которого сохраняется текущее положение элемента;<br />
<strong>ui.originalPosition</strong> &#8211; объект, в свойствах top и left которого сохраняется положение элемента до изменения его размеров;</p>
<p>Кроме перечисленных выше возможностей, плагин имеет несколько методов, с помощью которых можно управлять им уже после инициализации. Добавим в HTML-разметку пару кнопок:</p>
<pre class="brush: xml;">&lt;button id=&quot;getter&quot;&gt;Get Option&lt;/button&gt;
&lt;button id=&quot;setter&quot;&gt;Set Option&gt;/button&gt;</pre>
<p>и попробуем использовать метод .resizable(&#8216;option&#8217;, optionName, [value]):</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#resizable&quot;).resizable({
    animate: true,
    ghost: true,
    animateDuration: 500
  });
  $(&quot;#getter&quot;).click(function(){
    alert($(&quot;#resizable&quot;).resizable(&quot;option&quot;, &quot;animateDuration&quot;));
  });
  $(&quot;#setter&quot;).click(function(){
    $(&quot;#resizable&quot;).resizable(&quot;option&quot;, &quot;animateDuration&quot;, 3000);
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_resizable/example-five.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Используем кнопки с идентификаторами #getter и #setter с которыми свяжем событие click. При щелчке мышью на кнопке #getter будем вызывать метод .resizable(&#8216;option&#8217;, optionName, [value]) с двумя аргументами, получая, таким образом, текущее значение опции animateDuration. А при щелчке мышью на кнопке #setter вызовем тот же самый метод .resizable(&#8216;option&#8217;, optionName, [value]), но уже с тремя аргументами. В качестве третьего аргумента передадим значение, которое мы хотим установить для опции animateDuration.</p>
<p>Все доступные методы плагина Resizable:<br />
<strong>destroy</strong> &#8211; .resizable(&#8216;destroy&#8217;) полностью удаляет всю функциональность плагина Resizable. Возвращает элементы в состояние, предшествующее инициализации.<br />
<strong>disable</strong> &#8211; .resizable(&#8216;disable&#8217;) временно запрещает использование всей функциональности плагина. Вновь разрешить ее использование можно с помощью метода enable.<br />
<strong>enable</strong> &#8211; .resizable(&#8216;enable&#8217;) разрешает использование всей функциональности плагина, если ранее она была запрещена с использованием метода disable.<br />
<strong>option</strong> &#8211; .resizable(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции плагина после инициализации.</p>
<blockquote><p>Все примеры, использованные в статье, можно совершенно запросто получить в этом <a href="http://www.linkexchanger.su/examples_2009/ui_resizable/ui_resizable.zip">архиве</a>.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/109.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; плагин Droppable</title>
		<link>http://www.linkexchanger.su/2009/108.html</link>
		<comments>http://www.linkexchanger.su/2009/108.html#comments</comments>
		<pubDate>Tue, 06 Oct 2009 05:25:13 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[droppable]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/108.html</guid>
		<description><![CDATA[Плагин Droppable &#8211; один из нескольких плагинов, входящих в состав jQuery UI, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Droppable позволяет делать выбранные элементы веб-страницы &#171;сбрасываемыми&#187; в некий целевой элемент. Естественно, что для того чтобы быть &#171;сброшенным&#187;, элемент должен быть перемещаемым, а целевой элемент должен уметь принимать &#171;сбрасываемые&#187; элементы. Наведите указатель мыши [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин <strong>Droppable</strong> &#8211; один из нескольких плагинов, входящих в состав <strong>jQuery UI</strong>, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Droppable позволяет делать выбранные элементы веб-страницы &laquo;сбрасываемыми&raquo; в некий целевой элемент. Естественно, что для того чтобы быть &laquo;сброшенным&raquo;, элемент должен быть перемещаемым, а целевой элемент должен уметь принимать &laquo;сбрасываемые&raquo; элементы. Наведите указатель мыши на черный квадрат, нажмите левую клавишу мыши, переместите его внутрь зеленого квадрата и отпустите.<br />
<iframe src="http://www.linkexchanger.su/examples_2009/ui_droppable/example-one.html" style="border: 1px solid #6699cc; overflow: hidden" height="280" width="418"></iframe><br />
А теперь разберемся, как это сделать самостоятельно.<span id="more-108"></span></p>
<p>Для начала посетим страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong>, чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Droppable</strong> и видим, что вместе с ним отметились <strong>чекбоксы UI Core и Draggable</strong>. Работа плагина Droppable зависит от них, поэтому они необходимы.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив.</p>
<p>В разделе HEAD подключаем несколько файлов, которые есть в архиве.</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/trontastic/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Сначала мы подключили файл стилей css/trontastic/jquery-ui-1.7.2.custom.css одной из многочисленных тем оформления. Кроме этого мы подключили файл библиотеки – js/jquery-1.3.2.min.js и файл js/jquery-ui-1.7.2.custom.min.js, в котором объединена функциональность ядра UI и плагинов Droppable и Draggable (ведь прежде, чем «сбросить» элемент, его надо переместить).</p>
<p>Пример HTML-разметки:</p>
<pre class="brush: xml;">&lt;div id=&quot;draggable&quot; class=&quot;ui-widget-content&quot;&gt;
&lt;p&gt;Drag me to my target&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;droppable&quot; class=&quot;ui-widget-header&quot;&gt;
&lt;p&gt;Drop here&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;result&quot;&gt;&lt;/div&gt;</pre>
<p>Элемент с идентификатором #draggable будет у нас перемещаемым, элемент с идентификатором #droppable &#8211; целевым, в него можно будет &laquo;сбросить&raquo; перемещаемый элемент. Наконец, элемент с идентификатором #result будет служить для придания наглядности примеру.</p>
<p>Теперь смотрим javascript-код:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#draggable&quot;).draggable();
  $(&quot;#droppable&quot;).droppable({
    drop: function(){
      $(&quot;#result&quot;).append(&quot;Dropped!&quot;);
    }
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_droppable/example-one.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Мы сразу же определили callback-функцию в опции drop. Это сделано в первую очередь для наглядности. Как только перемещаемый блок div будет «сброшен» в целевой блок div, в элемент с идентификатором #result будет добавлен соответствующий текст.</p>
<p>Но попробуем передать плагину еще пару каких-либо опций.</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#draggable&quot;).draggable();
  $(&quot;#droppable&quot;).droppable({
    activeClass: &quot;active&quot;,
    hoverClass: &quot;hover&quot;,
    drop: function(){
      $(&quot;#result&quot;).append(&quot;Dropped!&quot;);
    }
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_droppable/example-two.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Передав плагину Droppable опции activeClass и hoverClass, в которых указали имена классов, мы добились того, чтобы все время в процессе движения перемещаемого элемента, у элемента целевого присутствовала красная рамка, а в тот момент, когда перемещаемый элемент оказывается над целевым, рамка поменяет свой цвет на синий.</p>
<p>Плагин Droppable может принимать семь опций:<br />
<strong>accept</strong> &#8211; в опции может быть указан селектор или функция. Все перемещаемые элементы, которые будут выбраны этим селектором, получат возможность быть «сброшенными» в элемент, к которому применена функциональность плагина Droppable. Если в этой опции определена функция, то она будет вызываться для каждого перемещаемого элемента на странице (передаваемого в функцию как первый аргумент), с целью применения пользовательского фильтра. Функция должна будет возвратить true, если элемент должен получить возможность быть «сброшенным». По умолчанию – *.<br />
<strong>activeClass</strong> &#8211; если в этой опции определить имя класса, то он будет добавлен к целевому элементу в момент начала перемещения элемента, который должен быть «сброшен». По умолчанию – false.<br />
<strong>addClasses</strong> &#8211; по умолчанию опция имеет значение true. Если установить false, то это предотвратит добавление класса с именем ui-droppable. Это может потребоваться в целях оптимизации при вызове .droppable() для нескольких сотен элементов.<br />
<strong>greedy</strong> &#8211; если для этой опции установлено значение true, это предотвращает всплывание события, т.е. если «сброс» был выполнен во внутренний элемент, в то время как его родитель тоже может принимать «сбрасываемый» элемент, события drop для элемента-родителя не произойдет. По умолчанию опция имеет значение false.<br />
<strong>hoverClass</strong> &#8211; если в этой опции определить имя класса, то он будет добавлен к целевому элементу в тот момент, когда перемещаемый элемент окажется над целевым элементом. По умолчанию – false.<br />
<strong>scope</strong> &#8211; по умолчанию эта опция имеет значение &#8216;default&#8217; и применяется в дополнение к опции accept. В опции может быть определено любое значение в виде строки и все перемещаемые элементы, с таким же значение соответствующей опции, будут иметь возможность «сброса» в целевой элемент.<br />
<strong>tolerance</strong> &#8211; опция определяет, в какой момент необходимо произвести «сброс» элемента, при нахождении его над целевым элементом. По умолчанию имеет значение &#8216;intersect&#8217;, что определит «сброс» в тот момент, когда перемещаемый элемент перекрыл целевой как минимум на 50%.  Другие возможные значения: <em>fit</em> – перемещаемый элемент должен полностью войти в целевой элемент; <em>pointer</em> – указатель мыши должен войти в целевой элемент; <em>touch</em> – перемещаемый элемент должен перекрыть целевой элемент на любую самую малую величину;</p>
<p>Как и другие плагины, входящие в состав UI jQuery, плагин Droppable умеет реагировать на некоторые события. Опций, в которых можно определить callback-функции, вызываемые при наступлении соответствующего события, всего пять.  В самом первом примере мы уже использовали опцию drop, но если вы откроете <a href="http://www.linkexchanger.su/examples_2009/ui_droppable/example-three.html" target="_blank">этот пример</a>, увидите в действии и остальные.</p>
<p>Опция <strong>activate</strong> &#8211; событие <em>dropactivate</em> происходит в момент начала движения перемещаемого элемента.<br />
Опция <strong>deactivate</strong> &#8211; событие <em>dropdeactivate</em> происходит в момент окончания движения перемещаемого элемента, независимо от того, был ли он «сброшен» в целевой элемент или нет.<br />
Опция <strong>over</strong> &#8211; событие <em>dropover</em> происходит в момент входа перемещаемого элемента в пределы целевого элемента.<br />
Опция <strong>out</strong> &#8211; событие <em>dropout</em> происходит в момент выхода перемещаемого элемента за пределы целевого элемента.<br />
Опция <strong>drop</strong> &#8211; событие <em>drop</em> происходит в момент «сброса» перемещаемого элемента в целевой элемент.</p>
<p>Надо отметить, что любая callback-функция, вызываемая при наступлении какого-либо события может принимать два аргумента. Первый аргумент – объект события, второй – специальный объект ui, в свойствах которого содержится следующая информация:<br />
<strong>ui.helper</strong> – объект, характеризующий перемещаемый элемент;<br />
<strong>ui.position</strong> – объект, в свойствах top и left которого содержится информация о положении перемещаемого элемента относительно родительского элемента;<br />
<strong>ui.offset</strong> – объект, в свойствах top и left которого содержится информация об абсолютном положении перемещаемого элемента;</p>
<p>Плагин Droppable имеет четыре метода, с помощью которых можно управлять им уже после инициализации. Добавим в разметку несколько кнопок, чтобы по клику на них вызывать нужные методы плагина:</p>
<pre class="brush: xml;">&lt;button id=&quot;disable&quot;&gt;Disable&lt;/button&gt;
&lt;button id=&quot;enable&quot;&gt;Enable&lt;/button&gt;
&lt;button id=&quot;destroy&quot;&gt;Destroy&lt;/button&gt;</pre>
<p>И теперь познакомимся с некоторыми из методов на примере:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#draggable&quot;).draggable();
  $(&quot;#droppable&quot;).droppable({
    drop: function(event, ui){
      $(&quot;#result&quot;).append(event.type);
    }
  });
  $(&quot;#disable&quot;).click(function(){
    $(&quot;#droppable&quot;).droppable(&quot;disable&quot;);
  });
  $(&quot;#enable&quot;).click(function(){
    $(&quot;#droppable&quot;).droppable(&quot;enable&quot;);
  });
  $(&quot;#destroy&quot;).click(function(){
    $(&quot;#droppable&quot;).droppable(&quot;destroy&quot;);
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_droppable/example-four.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>С кнопками, имеющими идентификаторы #disable, #enable и #destroy связаны обработчики события click, которые вызывают одноименные методы плагина.<br />
Используя .droppable(&laquo;disable&raquo;) можно временно удалить функциональность плагина из выбранного элемента, а с помощью .droppable(&laquo;enable&raquo;) – восстановить ее. Использование  .droppable(&laquo;destroy&raquo;) приведет к окончательному удалению функциональности. Восстановить ее можно будет только перезагрузкой страницы.</p>
<p><strong>destroy</strong> &#8211; .droppable(&#8216;destroy&#8217;) полностью удаляет всю функциональность плагина Droppable. Возвращает элементы в состояние, предшествующее инициализации.<br />
<strong>disable</strong> &#8211; .droppable(&#8216;disable&#8217;) временно запрещает использование всей функциональности плагина. Вновь разрешить ее использование можно с помощью метода enable.<br />
<strong>enable</strong> &#8211; .droppable(&#8216;enable&#8217;)разрешает использование всей функциональности плагина, если ранее она была запрещена с использованием метода disable.<br />
<strong>option</strong> &#8211; .droppable(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции плагина после инициализации.</p>
<blockquote><p>Все примеры, использованные в статье, можно совершенно запросто получить в этом <a href="http://www.linkexchanger.su/examples_2009/ui_droppable/ui_droppable.zip">архиве</a>.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/108.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; плагин Draggable</title>
		<link>http://www.linkexchanger.su/2009/107.html</link>
		<comments>http://www.linkexchanger.su/2009/107.html#comments</comments>
		<pubDate>Mon, 05 Oct 2009 11:27:16 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[draggable]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/107.html</guid>
		<description><![CDATA[Плагин Draggable &#8211; один из нескольких плагинов, входящих в состав jQuery UI, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Draggable позволяет делать выбранные элементы веб-страницы перемещаемыми с помощью указателя мыши. Наведите указатель мыши на зеленый квадрат, нажмите левую клавишу мыши и попробуйте перемещать его.

А теперь посмотрите, насколько легко это реализовать&#8230;.
Для начала посетим [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин <strong>Draggable</strong> &#8211; один из нескольких плагинов, входящих в состав <strong>jQuery UI</strong>, с помощью которых можно организовать взаимодействие с элементами веб-станиц. Плагин Draggable позволяет делать выбранные элементы веб-страницы перемещаемыми с помощью указателя мыши. Наведите указатель мыши на зеленый квадрат, нажмите левую клавишу мыши и попробуйте перемещать его.<br />
<iframe src="http://www.linkexchanger.su/examples_2009/ui_draggable/example-one.html" style="border: 1px solid #6699cc; overflow: hidden" height="180" width="418"></iframe><br />
А теперь посмотрите, насколько легко это реализовать&#8230;.<span id="more-107"></span><br />
Для начала посетим страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong>, чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Draggable</strong> и видим, что вместе с ним отметился <strong>чекбокс UI Core</strong>. Работа плагина Draggable зависит от него, поэтому он необходим.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив.</p>
<p>Сначала в разделе <strong>HEAD</strong> подключаем несколько файлов, которые есть в архиве.</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/le-frog/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Итак, сначала мы подключили файл стилей css/le-frog/jquery-ui-1.7.2.custom.css одной из многочисленных тем оформления. Кроме этого мы подключили файл библиотеки – js/jquery-1.3.2.min.js и файл js/jquery-ui-1.7.2.custom.min.js, в котором объединена функциональность ядра UI и плагина Draggable (на самом деле для использования в примерах этой статьи там содержится еще и функциональность плагинов Droppable и Sortable).</p>
<p>Смотрим HTML-разметку. Пусть у нас она будет выглядеть так:</p>
<pre class="brush: xml;">&lt;div id=&quot;draggable&quot; class=&quot;ui-widget-content&quot;&gt;
  &lt;p&gt;Drag me&lt;/p&gt;
&lt;/div&gt;</pre>
<p>Связываем функциональность плагина Draggable с выбранным элементом:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#draggable&quot;).draggable();
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_draggable/example-one.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Пока мы использовали плагин Draggable с настройками по умолчанию. Но он может принимать более 20 различных опций, которые помогают очень гибко настроить его под конкретные условия использования.<br />
Попробуем передать плагину несколько настроек:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#draggable&quot;).draggable({
    cursor: &quot;move&quot;,
    revert: true,
    revertDuration: 3000
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_draggable/example-two.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Здесь мы изменили вид курсора во время перемещения элемента, и добились того, что по окончании перемещения элемент самостоятельно вернется в свое начальное положение в течение 3 секунд.<br />
Остальные опции используются аналогичным образом, самое главное &#8211; знать их название и понимать какая за что отвечает.</p>
<p><strong>addClasses</strong> &#8211; по умолчанию эта опция имеет значение true. Если установить значение false, то это предотвратит добавление класса ui-draggable к перемещаемым элементам. Это может потребоваться из соображений оптимизации при вызове .draggable() например, для нескольких сотен элементов.<br />
<strong>appendTo</strong> &#8211; по умолчанию эта опция имеет значение &#8216;parent&#8217;. В ней можно передать селектор jQuery или элемент, который будет использован в качестве контейнера для объекта, представляющего перемещаемый элемент во все время его перемещения.<br />
<strong>axis</strong> &#8211; вынуждает перетаскиваемый элемент перемещаться только по оси x или только по оси y. Значение по умолчанию false, что позволяет элементу перемещаться свободно.<br />
<strong>cancel</strong> &#8211; по умолчанию эта опция имеет значение &#8216;input, option&#8217;. Если эти элементы находятся внутри перемещаемого элемента, то перемещаемый элемент нельзя захватить, при нахождении указателя мыши над определенными в этой опции элементами. Для выбора элементов используется селектор jQuery.<br />
<strong>connectToSortable</strong> &#8211; разрешает «сброс» перемещаемых элементов в сортируемый (sortable) список. При этом «сброшенный» элемент становится частью списка. В качестве значения указывается селектор jQuery. По умолчанию имеет значение false. Для корректной работы необходимо дополнительно использовать опцию helper со значением &#8216;clone&#8217;.<br />
<strong>containment</strong> &#8211; ограничивает перемещение внутри определенного элемента или области. В качестве значения может принимать селектор jQuery, элемент, строку или массив. Примеры возможных значений: &#8216;parent&#8217;, &#8216;document&#8217;, &#8216;window&#8217;, [x1, y1, x2, y2].<br />
<strong>cursor</strong> &#8211; строка, в которой может быть передано css значение, определяющее значок для курсора в процессе перетаскивания элемента. По умолчанию – auto.<br />
<strong>cursorAt</strong> &#8211; при перемещении элемента устанавливает курсор в определенную позицию. Например, значение {left: 5, top: 10}, при перемещении установит курсор в 10 пикселах от верхнего края и 5 пикселах от левого края.<br />
<strong>delay</strong> &#8211; отсрочка начала времени перемещения элемента в миллисекундах. Опция используется для того, чтобы предотвратить нежелательное перемещение элемента во время случайного щелчка по нему. По умолчанию имеет значение 0.<br />
<strong>distance</strong> &#8211; расстояние в пикселах, на которое должен переместиться курсор при удерживаемой в нажатом положении левой клавиши мыши прежде, чем начнется перемещение элемента. Опция используется для того, чтобы предотвратить нежелательное перемещение элемента во время случайного щелчка по нему. По умолчанию имеет значение 1.<br />
<strong>grid</strong> &#8211; заставляет перетаскиваемый элемент перемещаться дискретно, по сетке, определяемой массивом передаваемых в опцию значений. Значение по умолчанию false, что позволяет элементу перемещаться свободно. Пример передаваемого значения &#8211; [10, 10].<br />
<strong>handle</strong> &#8211; в этой опции можно определить элемент, находящийся внутри перемещаемого элемента, при нахождении над которым указателя мыши будет возможен захват перемещаемого элемента. Для выбора элементов можно использовать селектор jQuery.<br />
<strong>helper</strong> &#8211; возможные значения опции &#8211; &#8216;original&#8217;, &#8216;clone&#8217;, Function. По умолчанию установлено значение &#8216;original&#8217; – визуально наблюдается перемещении самого элемента. При использовании значения &#8216;clone&#8217; перемещаться будет клон элемента, а сам элемент при этом остается на своей позиции. В опции можно определить функцию. Функция обязательно должна возвращать DOM элемент.<br />
<strong>iframeFix</strong> &#8211; по умолчанию установлено значение false. Если установить значение true, будет предотвращен перехват события mousemove во время перемещения элемента при прохождении указателя мыши над iframe. В качестве значения может быть использован селектор jQuery – при этом предотвращение перехвата будет производиться только при прохождении указателя мыши над выбранными iframe. Опция бывает полезна при использовании совместно например с cursorAt.<br />
<strong>opacity</strong> &#8211; устанавливает значение css-свойства opacity для элемента, находящегося в процессе перемещения. По умолчанию установлено значение false, что соответствует полной непрозрачности.<br />
<strong>refreshPositions</strong> &#8211; по умолчанию используется значение false. При значении true позиция «сброса» элемента будет пересчитываться при каждом событии mousemove. Использовать с осторожностью! Такой подход может помочь создать очень динамичное приложение, но безусловно снизит производительность.<br />
<strong>revert</strong> &#8211; значение по умолчанию – false. Если установить значение true, то элемент возвратится на свою исходную позицию после окончания перетаскивания. Также можно передать значения в виде строки. Возможные значения &#8211; &#8216;valid&#8217; или &#8216;invalid&#8217;. Эти значения используются в случае, если перемещаемый элемент будет «сброшен» в какой-либо целевой элемент. При использовании значения &#8216;valid&#8217; перемещаемый элемент возвратится в предыдущую позицию только в том случае, если был «сброшен» в целевой элемент. При использовании значения &#8216;invalid&#8217; не возвратится в предыдущую позицию только в том случае, если он был «сброшен» в целевой элемент.<br />
<strong>revertDuration</strong> &#8211; длительность эффекта возвращения элемента на исходную позицию, в миллисекундах. По умолчанию имеет значение 500. Опция игнорируется, если опция revert имеет значение false.<br />
<strong>scope</strong> &#8211; значением этой опции является строка. По умолчанию установлено значение &#8216;default&#8217;. Перемещаемые элементы, имеющие в опции scope точно такое же значение, как и значение опции scope для элементов с функциональность droppable, будут приниматься этими элементами. По сути, дополняет опцию accept плагина Droppable.<br />
<strong>scroll</strong> &#8211; по умолчанию установлено значение true – при перемещении элемента к краю области просмотра, она автоматически прокручивается бесконечно. Если установить значение false, эта возможность будет запрещена.<br />
<strong>scrollSensitivity</strong> &#8211; число, определяющее расстояние в пикселах от края области просмотра, после которого она начинает прокручиваться. Расстояние определяется относительно указателя мыши, а не перемещаемого элемента. По умолчанию установлено значение 20.<br />
<strong>scrollSpeed</strong> &#8211; число, определяющее скорость, с которой прокручивается область просмотра при приближении указателя мыши к ее краю на расстояние определенное в опции scrollSensitivity. По умолчанию установлено значение 20.<br />
<strong>snap</strong> &#8211; по умолчанию установлено значение false. Если установить значение true (что эквивалентно &#8216;.ui-draggable&#8217;, поскольку значение может определяться также селектором jQuery), то перемещаемый элемент будет «прилипать» к краям выбранных элементов при прохождении около них.<br />
<strong>snapMode</strong> &#8211; опция определяет, как именно перемещаемый элемент будет «прилипать» к выбранным элементам. Например, только к внешним или только к внутренним сторонам элементов. Возможные значения &#8216;inner&#8217;, &#8216;outer&#8217;, &#8216;both&#8217;. Любое значение игнорируется при snap: false. По умолчанию установлено значение &#8216;both&#8217;.<br />
<strong>snapTolerance</strong> &#8211; расстояние в пикселах от перемещаемого элемента до выбранного, при котором произойдет «прилипание». По умолчанию установлено значение 20. Любое значение игнорируется при snap: false.<br />
<strong>stack</strong> &#8211; объект, с помощью которого осуществляется автоматический контроль за свойством z-index определенной группы перемещаемых элементов, всегда помещая перемещаемый элемент поверх остальных. Значение свойства &#8216;group&#8217; определяет jQuery селектор. Дополнительно можно определить свойство &#8216;min&#8217;, число ниже которого значение z-index опуститься не сможет. Например:  $(&#8216;.selector&#8217;).draggable({ stack: { group: &#8216;.selector&#8217;, min: 50 } });<br />
<strong>zIndex</strong> &#8211; число, определяющее значение свойства z-index перемещаемого элемента. По умолчанию false.</p>
<p>Кроме возможности гибкой настройки плагина Draggable, есть возможность заставить его реагировать на некоторые события. Вот пример:</p>
<pre class="brush: jscript;">$(function(){
  $(&quot;#draggable&quot;).draggable({
    cursor: &quot;move&quot;,
    stop: function(event, ui) {
  	  alert(&quot;Событие: &quot; + event.type +
  	        &quot;\n\ntop: &quot; + ui.offset.top +
  	        &quot; px\nleft: &quot; + ui.offset.left +
  	        &quot; px&quot;);
  	}
  });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_draggable/example-three.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Мы определили в опции stop callback-функцию. Функция принимает два аргумента – объекты event и ui. На простом примере показано, каким образом можно обратиться к свойствам этих объектов. В итоге, при окончании перемещения элемента, в окне предупреждения мы увидим информацию о типе наступившего события &#8211; dragstop, и текущее абсолютное положение элемента на странице.</p>
<p>Опций, связанных с событиями только три:<br />
Опция <strong>start</strong> &#8211; событие <em>dragstart</em> наступает каждый раз при начале перемещения элемента.<br />
Опция <strong>drag</strong> &#8211; событие <em>drag</em> наступает все время, пока элемент находится в процессе перемещения.<br />
Опция <strong>stop</strong> &#8211; событие <em>dragstop</em> наступает каждый раз при завершении перемещения элемента.</p>
<p>Любая callback-функция, определенная в опциях start, drag или stop принимает два аргумента – event и ui. Объект event – это объект события, а объект ui – это специальный объект, в свойствах которого содержится следующая информация:<br />
<strong>ui.helper</strong> – объект, характеризующий элемент, находящийся в процессе перемещения;<br />
<strong>ui.position</strong> – объект, в свойствах top и left которого содержится информация о положении перемещаемого элемента относительно родительского элемента;<br />
<strong>ui.offset</strong> – объект, в свойствах top и left которого содержится информация об абсолютном положении перемещаемого элемента;</p>
<p>Нам осталось познакомиться с методами плагина Draggable. Но для этого нам понадобится добавить в HTML-разметку пару кнопок. Вот так:</p>
<pre class="brush: xml;">&lt;button id=&quot;getOption&quot;&gt;Get Option&lt;/button&gt;
&lt;button id=&quot;setOption&quot;&gt;Set Option&lt;/button&gt;</pre>
<p>В следующем примере продемонстрировано как получать и устанавливать значения опций плагина после его инициализации:</p>
<pre class="brush: jscript;">$(function(){
 $(&quot;#draggable&quot;).draggable({
  cursor: &quot;move&quot;
 });
 $(&quot;#getOption&quot;).click(function(){
  alert($(&quot;#draggable&quot;).draggable(&quot;option&quot;,&quot;grid&quot;));
 });
 $(&quot;#setOption&quot;).click(function(){
  $(&quot;#draggable&quot;).draggable(&quot;option&quot;,&quot;grid&quot;,[50,50]);
 });
});</pre>
<blockquote><p><a href="http://www.linkexchanger.su/examples_2009/ui_draggable/example-four.html" target="_blank">Открыть пример в новом окне</a></p></blockquote>
<p>Мы связали с кнопками Get Option и Set Option событие click. При щелчке на кнопке Get Option мы вызовем метод option, название которого указываем в первом аргументе, а во втором аргументе передаем название опции, значение которой мы хотели бы получить. В итоге мы увидим окно предупреждения, в котором будет показано значение false, поскольку при инициализации эта опция не была определена, а по умолчанию она имеет именно такое значение.<br />
Попробуйте перетаскивать элемент с помощью мыши – он будет плавно перемещаться в любых направлениях.</p>
<p>Сделаем щелчок на кнопке Set Option, снова вызывая метод option, но теперь мы передаем три аргумента. Первый – название метода, второй – название опции, значение которой мы хотим изменить, и третий аргумент – новое значение опции. Таким образом, передав опции grid значение [50,50] мы заставим элемент перемещаться дискретно, вдоль сетки с шагом 50х50 пикселей.</p>
<p>Доступные методы плагина Draggable:<br />
<strong>destroy</strong> &#8211; .draggable(&#8216;destroy&#8217;) полностью удаляет всю функциональность плагина Draggable. Возвращает элементы в состояние, предшествующее инициализации.<br />
<strong>disable</strong> &#8211; .draggable(&#8216;disable&#8217;) временно запрещает использование всей функциональности плагина. Вновь разрешить ее использование можно с помощью метода enable.<br />
<strong>enable</strong> &#8211; .draggable(&#8216;enable&#8217;) разрешает использование всей функциональности плагина, если ранее она была запрещена с использованием метода disable.<br />
<strong>option</strong> &#8211; .draggable(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции плагина после инициализации.</p>
<blockquote><p>Все примеры, использованные в статье, можно совершенно запросто получить в этом <a href="http://www.linkexchanger.su/examples_2009/ui_draggable/ui_draggable.zip">архиве</a>.</p></blockquote>
<p>Для тех, кто смог все это прочитать до конца (а также для тех, кто сразу прокрутил страницу вниз) сообщаю, что в архиве Вы найдете и еще один пример, где показано как можно реализовать перемещение и &laquo;сброс&raquo; элемента несортируемого списка в другой, сортируемый список.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/107.html/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Как использовать виджет Accordion в качестве меню?</title>
		<link>http://www.linkexchanger.su/2009/104.html</link>
		<comments>http://www.linkexchanger.su/2009/104.html#comments</comments>
		<pubDate>Tue, 18 Aug 2009 07:27:35 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[accordion]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[аккордеон]]></category>
		<category><![CDATA[меню]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/104.html</guid>
		<description><![CDATA[Что такое Accordion наверное все знают, но если кто не знает, тому лучше сначала прочитать статью jQuery UI &#8211; виджет Accordion, в ней довольно подробно все рассказано. А сегодняшняя статья написана благодаря довольно многочисленным вопросам и моему обещанию рассказать, как, используя accordion, сделать на его основе меню для сайта. Естественно, что при переходе по ссылке [...]]]></description>
			<content:encoded><![CDATA[<p>Что такое Accordion наверное все знают, но если кто не знает, тому лучше сначала прочитать статью <a href="http://www.linkexchanger.su/2009/93.html">jQuery UI &#8211; виджет Accordion</a>, в ней довольно подробно все рассказано. А сегодняшняя статья написана благодаря довольно многочисленным вопросам и моему обещанию рассказать, как, используя accordion, сделать на его основе меню для сайта. Естественно, что при переходе по ссылке открытая секция аккордеона должна оставаться открытой и активный пункт меню должен быть как-то выделен&#8230;.<span id="more-104"></span></p>
<p>Сразу приведу <a href="http://www.linkexchanger.su/examples_2009/accordionMenu/ac_menu.html" target="_blank">пример</a> и выложу <a href="http://www.linkexchanger.su/examples_2009/accordionMenu/accordionMenu.zip">архив демо</a>, а то меня, не без оснований конечно, обвиняли в отсутствии демо в статьях про jQuery UI. Поскольку ничего особенно сложного в этом решении нет, то я буду краток &#8211; только код, пример и минимум необходимых пояснений.</p>
<p>Итак, сначала мы делаем все в точности так же, как написано в статье <a href="http://www.linkexchanger.su/2009/93.html">jQuery UI &#8211; виджет Accordion</a>. Т.е. подключаем необходимые файлы к HTML-странице. Здесь же внесем первое дополнение. Для того, чтобы иметь возможность запоминать состояние секций аккордеона, нам потребуется подключить еще один небольшой, но весьма полезный плагин &#8211; jQuery Cookie.</p>
<pre class="brush: xml;">&lt;script src=&quot;js/jquery.cookie.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Поиметь свежую версию этого плагина можно на <a href="http://plugins.jquery.com/project/Cookie">http://plugins.jquery.com/project/Cookie</a>.</p>
<p>Теперь приведу пример HTML-разметки меню-аккордеона.</p>
<pre class="brush: xml;">
&lt;div id=&quot;accordion&quot;&gt;
  &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Секция 1&lt;/a&gt;&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;?1-1&quot;&gt;Пункт меню 1-1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?1-2&quot;&gt;Пункт меню 1-2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?1-3&quot;&gt;Пункт меню 1-3&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Секция 2&lt;/a&gt;&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;?2-1&quot;&gt;Пункт меню 2-1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?2-2&quot;&gt;Пункт меню 2-2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?2-3&quot;&gt;Пункт меню 2-3&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Секция 3&lt;/a&gt;&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;?3-1&quot;&gt;Пункт меню 3-1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?3-2&quot;&gt;Пункт меню 3-2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?3-3&quot;&gt;Пункт меню 3-3&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;&lt;a href=&quot;#&quot;&gt;Секция 4&lt;/a&gt;&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;?4-1&quot;&gt;Пункт меню 4-1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?4-2&quot;&gt;Пункт меню 4-2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;?4-3&quot;&gt;Пункт меню 4-3&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;</pre>
<p>Ничего загадочного тут и вовсе нет. Что еще? Добавим немного стилей, чтобы выделять активный пункт меню. Например так:</p>
<pre class="brush: css;">a.open { color: #f00;}</pre>
<p>т.е. в примере просто выделяем текст ссылки в меню красным цветом.</p>
<p>А теперь самое интересное &#8211; javascript-код:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#accordion&quot;).accordion({
    navigation: true
  });
  $(&quot;#accordion li a&quot;).click(function(){
    $.cookie(&quot;openItem&quot;, $(this).attr(&quot;href&quot;));
  });
  $(&quot;#accordion li a[href$=`&quot; + $.cookie(&quot;openItem&quot;) +
  &quot;`]&quot;).addClass(&quot;open&quot;);
});
&lt;/script&gt;</pre>
<p>И здесь ничего сложного! Отыскали нужный элемент по идентификатору <strong>#accordion</strong>, применили к нему возможности плагина. Из опций передали только одну, но в нашем случае необходимую опцию <strong>navigation</strong>, которой присвоили значение <strong>true</strong>. Это обеспечит нам открытие нужной секции аккордеона при переходе по ссылке.</p>
<p>На следующем шаге необходимо обрабатывать щелчок мышкой по пункту меню, чтобы поставить соответствующую куку. Что мы и делаем &#8211; находим все элементы a внутри li, внутри нашего аккордеона, связываем с ними событие click, по которому будет вызвана функция-обработчик.</p>
<p>Тут нам пригодятся возможности плагина jQuery Cookie. Мы устанавливаем куку с именем <strong>openItem</strong>, и значением, которое получаем из атрибута href той ссылки, по которой был совершен клик.</p>
<p>И последний шаг &#8211; при загрузке страницы мы должны прочитать куку (если она конечно есть) и в соответствии с ее значением &laquo;подсветить&raquo; нужный пункт меню. Делаем это &#8211; ищем нужный пункт меню выбирая элемент a внутри li аккордеона. Но не просто, а значение атрибута href которого соответствует значению, сохраненному в куке.</p>
<blockquote><p>Знак $ используем потому, что некоторые браузеры возвращают значения атрибута href по разному. Некоторые отдают абсолютный путь, некоторые &#8211; относительный. Чтобы исключить эту неоднозначность мы ищем такое значение атрибута href, которое заканчивается одинаково со значением, сохраненным в куке.</p></blockquote>
<p>Если такая ссылка будет найдена, то с помощью метода <strong>addClass</strong> мы добавим ей класс <strong>open</strong>, что заставит ее &laquo;покраснеть&raquo;.</p>
<p>Собственно это все, больше тут рассказывать не о чем&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/104.html/feed</wfw:commentRss>
		<slash:comments>63</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; виджет Datepicker</title>
		<link>http://www.linkexchanger.su/2009/103.html</link>
		<comments>http://www.linkexchanger.su/2009/103.html#comments</comments>
		<pubDate>Thu, 02 Jul 2009 04:58:09 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[datepicker]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/103.html</guid>
		<description><![CDATA[jQuery UI &#8211; надстройка над JavaScript-библиотекой jQuery. Она поможет создавать по настоящему интерактивные веб-приложения. Сегодня мы познакомимся с виджетом Datepicker.

Datepicker – это интерактивный календарь, который связан с полем ввода. Щелчок в поле ввода приводит к тому, что в отдельном слое открывается небольшой календарь. Выбираете нужную дату и готово – дата занесена в поле ввода.
Для начала [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery UI &#8211; надстройка над JavaScript-библиотекой jQuery. Она поможет создавать по настоящему интерактивные веб-приложения. Сегодня мы познакомимся с виджетом Datepicker.<br />
<img src="http://www.linkexchanger.su/wp-content/uploads/2009/06/datepicker.jpg" alt="Виджет Datepicker" /><br />
Datepicker – это интерактивный календарь, который связан с полем ввода. Щелчок в поле ввода приводит к тому, что в отдельном слое открывается небольшой календарь. Выбираете нужную дату и готово – дата занесена в поле ввода.<span id="more-103"></span></p>
<p>Для начала посетим страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong> , чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Datepicker</strong> и <strong>чекбокс UI Core</strong>.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив. Можно испытать пример как есть, но интереснее создать свою HTML-страничку, где сначала в разделе HEAD подключить несколько файлов, которые есть в архиве.</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/ui-lightness/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/i18n/jquery-ui-i18n.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Сначала мы подключили файл стилей одной из многочисленных тем оформления. Кроме этого мы подключили файл библиотеки и файл, в котором заключена функциональность UI Core и виджета Datepicker. И наконец, последний файл обеспечивает локализацию виджета для нужного языка. Найти его можно в полученном архиве, в папке /development-bundle/ui/i18n</p>
<p>Из разметки потребуется минимум &#8211; просто элемент input:</p>
<pre class="brush: xml;">&lt;input  id=&quot;datepicker&quot; type=&quot;text&quot; /&gt;</pre>
<p>Кстати, если Вы хотите, чтобы календарь не появлялся по щелчку в элементе input, а был всегда виден &#8211; просто используйте обычный элемент div:</p>
<pre class="brush: xml;">&lt;div  id=&quot;datepicker&quot;&gt;&lt;div&gt;</pre>
<p>Связываем виджет Datepicker с нашей HTML-разметкой:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#datepicker&quot;).datepicker();
});
&lt;/script&gt;</pre>
<p>Отлично! С настройками по умолчанию все понятно, но нам хотелось бы иметь календарь на русском языке (или, к примеру, на украинском). Давайте это сделаем:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $.datepicker.setDefaults(
        $.extend($.datepicker.regional[&quot;ru&quot;])
  );
  $(&quot;#datepicker&quot;).datepicker();
});
&lt;/script&gt;</pre>
<p>Приведенный в примере код обеспечит поддержку русского языка, а если Вы замените ru на uk (интересно, почему не на ua?) то получите календарь уже на украинском языке.</p>
<p>Но вероятно Вам понадобится изменить какие-то настройки, чтобы использовать Datepicker для решения своих задач. Давайте попробуем это сделать.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $.datepicker.setDefaults(
        $.extend($.datepicker.regional[&quot;ru&quot;])
  );
  $(&quot;#datepicker&quot;).datepicker({
    minDate: &quot;-30&quot;,
    maxDate: &quot;+1m +1w +3d&quot;
  });
});
&lt;/script&gt;</pre>
<p>Мы передали виджету две опции, названия которых говорят сами за себя – мы установили минимальную и максимальную дату, которую можно выбрать в календаре. Безусловно, полезные опции, но таких опций гораздо больше, а принцип их использования ничем не отличается от только что рассмотренного принципа. Полный список возможных опций приведен ниже:</p>
<p><strong>altField</strong> &#8211; jQuery селектор для другого поля, которое должно быть обновлено, как только будет выбрана дата в Datepicker. Формат даты в этом дополнительном поле устанавливается с помощью опции altFormat.</p>
<p><strong>altFormat</strong> &#8211; формат даты, который будет использоваться для опции altField. Эти настройки позволяют показывать пользователю один формат даты, тогда как для вычислений может использоваться другой формат. Полный список возможных форматов можно найти на<br />
<a href="docs.jquery.com/UI/Datepicker/formatDate">http://docs.jquery.com/UI/Datepicker/formatDate</a></p>
<p><strong>appendText</strong> &#8211; текст, который будет отображаться после каждого поля выбора даты. Можно использовать, например для того, чтобы пометить поле как обязательное для заполнения.</p>
<p><strong>buttonImage</strong> &#8211; адрес картинки, которая будет отображаться на кнопке, с помощью которой можно вызывать календарь. Используется совместно с опцией showOn, когда та принимает значения &#8216;button&#8217; или &#8216;both&#8217;. Если был определен текст в опции buttonText, он становится значением атрибута alt картинки.</p>
<p><strong>buttonImageOnly</strong> &#8211; если для этой опции установить значение true, то картинка, адрес которой определен в опции buttonImage, будет отображаться не на кнопке, а сама по себе.</p>
<p><strong>buttonText</strong> &#8211; текст, отображающийся на кнопке, с помощью которой можно вызывать календарь. Используется совместно с опцией showOn, когда та принимает значения &#8216;button&#8217; или &#8216;both&#8217;.</p>
<p><strong>changeMonth</strong> &#8211; если в этой опции передать значение true, будет возможно выбирать месяц из выпадающего списка.</p>
<p><strong>changeYear</strong> &#8211; если в этой опции передать значение true, будет возможно выбирать год из выпадающего списка.</p>
<p><strong>closeText</strong> &#8211; эта опция используется совместно с showButtonPanel, если последняя имеет значение true. Значение опции closeText определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>constrainInput</strong> &#8211; по умолчанию опция имеет значение true и принуждает строго соблюдать формат даты, определенный в опциях виджета, в текстовом поле ввода. Чтобы иметь возможность не соблюдать этот формат, следует установить опцию в false.</p>
<p><strong>currentText</strong> &#8211; эта опция используется совместно с showButtonPanel, если последняя имеет значение true. Значение опция currentText определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>dateFormat</strong> &#8211; определяет формат даты. Значение опции dateFormat определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его. Полный список возможных форматов можно найти на</p>
<p>http://docs.jquery.com/UI/Datepicker/formatDate</p>
<p><strong>dayNames</strong> &#8211; массив, содержащий полные названия дней недели, начиная с воскресенья. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>dayNamesMin</strong> &#8211; массив, содержащий 2-хбуквенную аббревиатуру названия дней недели, начиная с воскресенья. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>dayNamesShort</strong> &#8211; массив, содержащий 3-хбуквенную аббревиатуру названия дней недели, начиная с воскресенья. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>defaultDate</strong> &#8211; устанавливает дату, которая будет подсвечена при первом открытии, если поле выбора даты пустое. Опция может быть определена через объект Date, либо как количество дней от текущего для (например +7 или -15), либо как строка значений, определяющих период (&#8216;y&#8217; для лет, &#8216;m&#8217; для месяцев, &#8216;w&#8217; для недель, &#8216;d&#8217; для дней, например &#8216;+1m +7d&#8217;), и наконец как null для текущего дня.</p>
<p><strong>duration</strong> &#8211; длительность эффекта анимации при открытии (закрытии) календаря. Может принимать значения в виде строки &#8211; &#8216;fast&#8217;, &#8216;normal&#8217; (по умолчанию), &#8217;slow&#8217; или в виде числа в миллисекундах. Если передать пустую строку, календарь будет открываться и закрываться без эффекта анимации.</p>
<p><strong>firstDay</strong> &#8211; опция устанавливает первый день недели: воскресенье – 0, понедельник – 1,… Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>gotoCurrent</strong> &#8211; если установить значение опции в true, то кнопка «Сегодня» (доступная при showButtonPanel: true) будет указывать на выбранную дату взамен текущей.</p>
<p><strong>hideIfNoPrevNext</strong> &#8211; если Вы ограничиваете диапазон доступных дат с помощью опций minDate и maxDate, то при достижении края диапазона, стрелки «Назад» и «Вперед» становятся неактивными. Но их можно и совсем скрывать, передав в опции hideIfNoPrevNext значение true.</p>
<p><strong>isRTL</strong> &#8211; для этой опции необходимо установить значение true, если используется язык с написанием справа налево. Определяется в файле локализации, если он используется.</p>
<p><strong>maxDate</strong> &#8211; устанавливает максимальную возможную для выбора дату через объект Date или как число дней от текущего (например +7) или как строку значений определяющих период (&#8216;y&#8217; для лет, &#8216;m&#8217; для месяцев, &#8216;w&#8217; для недель, &#8216;d&#8217; для дней, например &#8216;+1y +1m&#8217;), или null для отсутствия ограничения.</p>
<p><strong>minDate</strong> &#8211; устанавливает минимальную возможную для выбора дату через объект Date или как число дней от текущего (например -7) или как строку значений определяющих период (&#8216;y&#8217; для лет, &#8216;m&#8217; для месяцев, &#8216;w&#8217; для недель, &#8216;d&#8217; для дней, например &#8216;-1y -1m&#8217;), или null для отсутствия ограничения.</p>
<p><strong>monthNames</strong> &#8211; массив, содержащий полные названия месяцев. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>monthNamesShort</strong> &#8211; массив, содержащий 3-хбуквенную аббревиатуру названия месяцев. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его.</p>
<p><strong>navigationAsDateFormat</strong> &#8211; по умолчанию опция имеет значение false. Если установить значение true, функция dateFormat будет примерена к значениям опций nextText, prevText и currentText с тем, чтобы отображать при навигации, например предыдущее и следующее названия месяцев.</p>
<p><strong>nextText</strong> &#8211; текст, который отображается в качестве ссылки на следующий месяц. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его. Если используется файл стилей ThemeRoller’а, это значение заменяется иконкой.</p>
<p><strong>numberOfMonths</strong> &#8211; эта опция определяет, сколько месяцев сразу нужно показать. Значение опции может быть просто числом или массивом, состоящим из двух элементов, которые определяют соответственно количество строк и столбцов. Например, значение [2, 3] отобразит календарь в две строки по три месяца.</p>
<p><strong>prevText</strong> &#8211; текст, который отображается в качестве ссылки на предыдущий месяц. Определяется в файле локализации, если он используется, но это значение можно переопределить, явно указав его. Если используется файл стилей ThemeRoller’а, это значение заменяется иконкой.</p>
<p><strong>shortYearCutoff</strong> &#8211; значение по умолчанию +10. Эта опция используется только при условии использования в dateFormat двузначной записи года и выполняет роль компенсатора для определения века. Если значение передано в виде числа, используется как есть. Если значение передано в виде строки, конвертируется в число и добавляется к текущему значению года. После того как значение определено, все данные, выступающие в качестве значения года, и меньшие и равные ему считаются годами текущего века. Значения большие – считаются годами предыдущего века.</p>
<p><strong>showAnim</strong> &#8211; определяет тип анимации при открывании календаря. По умолчанию имеет значение show (при закрывании будет использован hide). Без подключения дополнительных файлов могут быть использованы эффекты &#8217;slideDown&#8217; и &#8216;fadeIn&#8217; (при закрывании соответственно будут использоваться эффекты &#8217;slideUp&#8217; и &#8216;fadeOut&#8217;). Так же возможно использование любых эффектов jQuery UI Effects при условии их дополнительного подключения.</p>
<p><strong>showButtonPanel</strong> &#8211; установка значения true для этой опции приведет к тому, что будет показана панель с двумя кнопками – переход к сегодняшней дате и закрытие календаря.</p>
<p><strong>showCurrentAsPos</strong> &#8211; когда используется отображение сразу нескольких месяцев, число, переданное в этой опции, определяет позицию текущего месяца. По умолчанию используется значение 0, и текущий месяц отображается в верхнем левом углу.</p>
<p><strong>showMonthAfterYear</strong> &#8211; по умолчанию используется значение false и в заголовке название месяца идет перед годом. При использовании значения true название месяца будет следовать за годом.</p>
<p><strong>showOn</strong> &#8211; по умолчанию эта опция имеет значение &#8216;focus&#8217;, что заставляет календарь открываться при щелчке в поле ввода. Другие возможные значения &#8211; &#8216;button&#8217; и &#8216;both&#8217;. Рядом с полем ввода появится кнопка. В первом случае календарь будет открываться по щелчку на кнопке, а во втором случае как по щелчку на кнопке, таки при получении фокуса полем ввода.</p>
<p><strong>showOptions</strong> &#8211; если Вы используете один из эффектов jQuery UI Effects, с помощью этой опции ему можно передать дополнительные настройки. Например: showOptions: {direction: &#8216;up&#8217;}.</p>
<p><strong>showOtherMonths</strong> &#8211; по умолчанию имеет значение false. Если использовать true, на календаре будут отображаться дни предыдущего и/или следующего месяца без возможности их выбора.</p>
<p><strong>stepMonths</strong> &#8211; определяет насколько месяцев сдвигать календарь при щелчке по ссылкам Следующий и Предыдущий. По умолчанию – 1.</p>
<p><strong>yearRange</strong> &#8211; управление диапазоном лет, отображаемых в выпадающем списке (при использовании опции changeYear). По умолчанию используется значение &#8216;-10:+10&#8242; относительно текущего года. Возможно использование и абсолютного формата, например &#8216;1980:2025&#8242;.</p>
<p>Перейдем к знакомству с событиями виджета Datepicker:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $.datepicker.setDefaults($.extend(
    $.datepicker.regional[&quot;ru&quot;])
  );
  $(&quot;#datepicker&quot;).datepicker({
    beforeShow: function(input) {
      $(input).css(&quot;background-color&quot;,&quot;#ff9&quot;);
    },
    onSelect: function(dateText, inst) {
      $(this).css(&quot;background-color&quot;,&quot;&quot;);
      alert(&quot;Выбрано: &quot; + dateText +
        &quot;\n\nid: &quot; + inst.id +
        &quot;\nselectedDay: &quot; + inst.selectedDay +
        &quot;\nselectedMonth: &quot; + inst.selectedMonth +
        &quot;\nselectedYear: &quot; + inst.selectedYear);
    },
    onClose: function(dateText, inst) {
      $(this).css(&quot;background-color&quot;,&quot;&quot;);
    }
  });
});
&lt;/script&gt;</pre>
<p>В примере мы передаем виджету сразу три опции, в которых определены callback-функции. В опции <strong>beforeShow</strong> определена функция, которая будет вызвана перед отображением календаря. С помощью css-свойства background-color, эта функция установит желтый цвет фона для элемента input. В опции <strong>onSelect</strong> определена функция, которая будет вызвана в момент выбора какой-либо даты в календаре и передаст пустое значение css-свойству background-color, возвратив его в начальное состояние. И, наконец, в опции <strong>onClose</strong> определена функция, которая вызывается при закрытии календаря, если никакое значение выбрано не было. Она тоже вернет css-свойство background-color в его начальное состояние.</p>
<p>Но, обратите внимание, все callback-функции принимают некоторые аргументы. С ними стоит познакомиться немного подробнее.</p>
<p>В опции <strong>beforeShow</strong> функция принимает в качестве аргумента объект, характеризующий элемент input. В примере мы указали этот объект в качестве селектора jQuery и получили, таким образом, возможность работать с его css-свойствами с помощью методов библиотеки.</p>
<p>В опции <strong>onSelect</strong> функция принимает два аргумента. Первый аргумент <strong>dateText</strong> – строка, представляющая собой тот текст, который появится и в элементе input. Второй аргумент – объект datepicker. В том же примере показано, как можно обратиться к некоторым из свойств этого объекта.</p>
<p>Функция, определенная в опции <strong>onClose</strong> принимает те же два аргумента, что и функция из опции <strong>onSelect</strong>.</p>
<p>И еще одно важное обстоятельство для callback-функций, определенных в опциях <strong>onSelect</strong> и <strong>onClose</strong> – в контексте этих функций ссылка <strong>this</strong> указывает на объект, характеризующий элемент input.</p>
<p>Ниже приведены описания всех возможных событий для виджета Datepicker.</p>
<p><strong>beforeShow</strong> &#8211; здесь можно определить функцию, которая будет вызываться перед открытием календаря. Функция принимает в качестве аргумента объект, характеризующий текстовое поле ввода с которым работает виджет.</p>
<p><strong>beforeShowDay</strong> &#8211; в этой опции можно определить пользовательскую функцию, которая будет принимать в качестве аргумента выбранную дату. Функция должна возвратить массив, где элемент с индексом [0] – true или false показывает, возможен или нет выбор этой даты. Элемент с индексом [1] содержит имя класса (классов) для отображения даты. Элемент с индексом [2] (опционально) – текст всплывающей подсказки для даты. Функция будет вызываться для каждой даты в календаре в момент наведения указателя мыши.</p>
<p><strong>onChangeMonthYear</strong> &#8211; здесь можно определить функцию, которая будет вызываться при смене месяца или года в календаре. Функция принимает три аргумента. Первые два аргумента – это новые значения года и месяца, третий аргумент – объект datepicker.</p>
<p><strong>onClose</strong> &#8211; в этой опции определяется функция, которая будет вызвана, когда календарь был закрыт без выбора какой-либо даты.</p>
<p><strong>onSelect</strong> &#8211; в этой опции определяется функция, которая будет вызвана, когда в календаре выбрана какая-либо дата.</p>
<p>Теперь можно поговорить о методах виджета Datepicker. Давайте добавим в наш HTML-код обыкновенную ссылку:</p>
<pre class="brush: xml;">&lt;a href=&quot;#&quot;&gt;Открыть в диалоге&lt;/a&gt;</pre>
<p>и используем вот такой javascript-код:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $.datepicker.setDefaults(
      $.extend($.datepicker.regional[&quot;ru&quot;])
  );
  $(&quot;#datepicker&quot;).datepicker({
    changeYear: true
  });
  $(&quot;a&quot;).click(function(){
    $(&quot;#datepicker&quot;).datepicker(
        &quot;dialog&quot;,
        &quot;23.04.2009&quot;,
        function(){
          alert(&quot;Событие onSelect&quot;);
        },
        { showButtonPanel: true },
        [300, 300]
    );
  });
});
&lt;/script&gt;</pre>
<p>В приведенном примере мы демонстрирует работу метода <strong>dialog</strong>. Мы вызываем этот метод при щелчке на ссылке <strong>Открыть в диалоге</strong>. Первый аргумент – это название метода, второй аргумент <strong>textDate</strong> – дата на которой по умолчанию будет открываться календарь. Остальные три аргумента необязательные, но мы познакомимся и с ними. В аргументе <strong>onSelect</strong> можно передать callback-функцию, которая будет вызвана при выборе конкретной даты в календаре. В аргументе <strong>settings</strong> можно передать объект с новыми настройками виджета, которые будут применены к календарю, который будет открыт в диалоговом окне. И, наконец, последний аргумент <strong>pos</strong> – здесь можно задать координаты, в которых будет появляться календарь. Координаты можно задавать числами, но если передать в функцию, вызываемую по щелчку на ссылке <strong>объект event</strong>, то можно будет определить координаты, используя свойства объекта event. Например, использовать event.clientX и event.clientY.</p>
<p>Далее приведены описания всех методов виджета Datepicker.</p>
<p><strong>destroy</strong> &#8211; .datepicker(&#8216;destroy&#8217;) полностью удаляет всю функциональность виджета Datepicker. Возвращает элементы в состояние, предшествующее инициализации.</p>
<p><strong>disable</strong> &#8211; .datepicker(&#8216;disable&#8217;) временно запрещает использование всей функциональности виджета. Вновь разрешить ее использование можно с помощью метода enable.</p>
<p><strong>enable</strong> &#8211; .datepicker(&#8216;enable&#8217;) разрешает использование всей функциональности виджета, если ранее она была запрещена с использованием метода disable.</p>
<p><strong>option</strong> &#8211; .datepicker(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции виджета после инициализации.</p>
<p><strong>dialog</strong> &#8211; .datepicker(&#8216;dialog&#8217;, dateText, [onSelect], [settings], [pos]) открывает виджет Datepicker в режиме диалогового окна. В аргументе dateText передается дата, на которой должен быть открыт календарь. Остальные аргументы необязательные. В аргументе onSelect можно передать функцию, которая будет вызвана в момент выбора даты в календаре, в аргументе settings можно передать объект с новыми настройками виджета, в аргументе pos – координаты, в которых будет открыто диалоговое окно. Здесь можно использовать события мыши, чтобы определить координаты.</p>
<p><strong>isDisabled</strong> &#8211; .datepicker(&#8216;isDisabled&#8217;) метод возвращает значение true, если к виджету был применен метод disable и false в противном случае.</p>
<p><strong>hide</strong> &#8211; .datepicker(&#8216;hide&#8217;, [speed]) скрывает ранее открытый календарь.</p>
<p><strong>show</strong> &#8211; .datepicker(&#8217;show&#8217;) открывает календарь.</p>
<p><strong>getDate</strong> &#8211; .datepicker(&#8216;getDate&#8217;) метод возвращает дату, выбранную в календаре.</p>
<p><strong>setDate</strong> &#8211; .datepicker(&#8217;setDate&#8217;, date) метод позволяет установить дату в календаре. Значением аргумента date может быть число, определяющее количество дней от текущей даты (например: +7 или -14) или строка, определяющая период (&#8216;y&#8217; для лет, &#8216;m&#8217; для месяцев, &#8216;w&#8217; для недель, &#8216;d&#8217; для дней, например &#8216;+1m +7d&#8217;). Значение null установит текущую дату.</p>
<p>Вот и все. Разве что сказать, что для управления календарем можно использовать горячие клавиши:<br />
- <em>page up/down</em> – предыдущий/следующий месяц;<br />
- <em>ctrl+page up/down</em> &#8211; предыдущий/следующий год;<br />
-<em>ctrl+home</em> – выбор текущего месяца или открытие календаря после того как он был закрыт;<br />
- <em>ctrl+left/right</em> &#8211; предыдущий/следующий день;<br />
- <em>ctrl+up/down</em> &#8211; предыдущая/следующая неделя;<br />
- <em>enter</em> – выбор отмеченной даты;<br />
- <em>ctrl+end</em> – закрытие и удаление даты из поля ввода;<br />
- <em>escape</em> – закрытие календаря без выбора даты;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/103.html/feed</wfw:commentRss>
		<slash:comments>91</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; виджет Tabs</title>
		<link>http://www.linkexchanger.su/2009/99.html</link>
		<comments>http://www.linkexchanger.su/2009/99.html#comments</comments>
		<pubDate>Wed, 01 Jul 2009 05:00:40 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[tabs]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/99.html</guid>
		<description><![CDATA[jQuery UI &#8211; надстройка над JavaScript-библиотекой jQuery. Она поможет создавать по настоящему интерактивные веб-приложения. Сегодня мы познакомимся с виджетом Tabs.

Виджет Tabs помогает разделить информационное наполнение между несколькими вкладками. Это может быть полезно при дефиците свободного места на веб-странице. Информационное наполнение вкладок может быть загружено с помощью ajax-запроса.
Для начала посетим страницу настраиваемой закачки на сайте jQuery [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery UI &#8211; надстройка над JavaScript-библиотекой jQuery. Она поможет создавать по настоящему интерактивные веб-приложения. Сегодня мы познакомимся с виджетом Tabs.<br />
<img src="http://www.linkexchanger.su/wp-content/uploads/2009/06/tabs1.jpg" alt="Виджет Tabs" /><br />
Виджет Tabs помогает разделить информационное наполнение между несколькими вкладками. Это может быть полезно при дефиците свободного места на веб-странице. Информационное наполнение вкладок может быть загружено с помощью ajax-запроса.<span id="more-99"></span></p>
<p>Для начала посетим страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong> , чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Tabs</strong> и видим, что вместе с ним отметился <strong>чекбокс UI Core</strong>. Работа виджета Tabs зависит от него, поэтому он необходим.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив. Можно испытать пример как есть, но интереснее создать свою HTML-страничку, где сначала в разделе HEAD подключить несколько файлов, которые есть в архиве.</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/le-frog/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery.cookie.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Сначала мы подключили файл стилевого оформления виджета, затем файл библиотеки jQuery. В третьем подключенном файле объединена функциональность ядра UI и виджета Tabs. Четвертый файл понадобится в том случае, если Вам необходимо использовать cookies. Найти его можно в папке архива development-bundle/external/cookie/.<br />
Дальше знакомимся с требованиями виджета Tabs к HTML-разметке.</p>
<pre class="brush: xml;">
&lt;div id=&quot;tabs&quot;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;#tabs-1&quot;&gt;Nunc tincidunt&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#tabs-2&quot;&gt;Proin dolor&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#tabs-3&quot;&gt;Aenean lacinia&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;div id=&quot;tabs-1&quot;&gt;
    &lt;p&gt;Tab 1 content&lt;/p&gt;
  &lt;/div&gt;
  &lt;div id=&quot;tabs-2&quot;&gt;
    &lt;p&gt;Tab 2 content&lt;/p&gt;
  &lt;/div&gt;
  &lt;div id=&quot;tabs-3&quot;&gt;
    &lt;p&gt;Tab 3 content&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Ярлыками вкладок являются элементы <strong>li</strong>, в атрибутах <strong>href</strong> которых содержится идентификаторы соответствующих им элементов <strong>div</strong>, которые представляют собой область информационного наполнения вкладки. Внутри элементов <strong>div</strong> содержимое может быть практически любым. Ну и все это заключено в элемент <strong>div</strong> с идентификатором <strong>#tabs</strong>.</p>
<p>Теперь привяжем функциональность виджета к HTML-разметке.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#tabs&quot;).tabs();
});
&lt;/script&gt;
</pre>
<p>Все. С настройками по умолчанию виджет уже работает. Теперь будем передавать ему свои настройки:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#tabs&quot;).tabs({
    event: &quot;mouseover&quot;,
    selected: 2
  });
});
&lt;/script&gt;</pre>
<p>В этом примере мы заставили виджет Tabs переключать вкладки по событию mouseover (взамен установленного по умолчанию click) и открывать при инициализации третью вкладку (отсчет ведется от 0).</p>
<p>Сразу еще один пример, который демонстрирует приемы использования cookies для запоминания последней открытой вкладки для того, чтобы впоследствии открыть ее при инициализации. Но, до этого давайте добавим в HTML-разметку кнопку, для того, чтобы кликнув по ней, убедиться, что cookies действительно ставятся.</p>
<pre class="brush: xml;">&lt;button id=&quot;getCookie&quot;&gt;Get Cookie&lt;/button&gt;</pre>
<p>и собственно пример установки cookies</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#tabs&quot;).tabs({
    cookie: { expires: 7, name: &quot;startTab&quot; }
  });
  $(&quot;#getCookie&quot;).click(function(){
    var cook = $(&quot;#tabs&quot;).tabs(&quot;option&quot;, &quot;cookie&quot;);
    alert(&quot;name: &quot; + cook.name +
            &quot;\nexpires: &quot; + cook.expires);
  });
});
&lt;/script&gt;</pre>
<p>Мы установили cookie с именем startTab сроком на 7 дней. Щелчок по кнопке с идентификатором getCookie приведет к тому, что в окне предупреждения мы увидим имя установленной cookie и срок, на который она была установлена. Не забывайте, что для использования этой возможности необходимо подключать дополнительный файл плагина jQuery Cookie.</p>
<p>Мы научились передавать виджету различные опции, а их описания приведены ниже:</p>
<p><strong>ajaxOptions</strong> &#8211; опции ajax-запроса, которые используются для загрузки удаленного содержимого в область информационного наполнения. По умолчанию используется значение null.</p>
<p><strong>cache</strong> &#8211; опция определяет, кэшировать или нет информационное наполнение вкладки, загружаемое с помощью ajax-запросов, т.е. загрузить содержимое только однажды или загружать каждый раз, когда совершен щелчок на ярлыке вкладки. По умолчанию используется значение false, т.е. кэширование не производится. Обратите внимание – чтобы воспрепятствовать фактическому кэшированию данных браузером Вы должны дополнительно обеспечить значение false в опциях самого ajax-запроса.</p>
<p><strong>collapsible</strong> &#8211; по умолчанию используется значение false. Если передать в этой опции значение true, то каждый следующий щелчок на ярлыке вкладки будет скрывать и открывать область информационного наполнения.</p>
<p><strong>cookie</strong> &#8211; запоминает последнюю выбранную вкладку в cookie. В дальнейшем используется для определения вкладки, открываемой по умолчанию (если не используется опция selected). Требует подключения плагина cookie. Возможно присвоение имени cookie через опцию name.</p>
<p><strong>disabled</strong> &#8211; массив, содержащий индексы вкладок (отсчет ведется от 0), которые должны быть недоступными при инициализации виджета. Например, disabled: [1, 2] сделает недоступными вторую и третью вкладки.</p>
<p><strong>event</strong> &#8211; тип события, которое используется для переключения вкладок. По умолчанию используется значение &#8216;click&#8217;. Второе возможное значение &#8216;mouseover&#8217;.</p>
<p><strong>fx</strong> &#8211; устанавливает анимационные эффекты при открытии/закрытии вкладок. Например: fx: { opacity: &laquo;toggle&raquo;, duration: &laquo;slow&raquo; }</p>
<p><strong>panelTemplate</strong> &#8211; HTML-шаблон из которого создается новая область информационного наполнения вкладки в случае создания ее с использованием метода add или при создании вкладки «на лету» с использованием ajax-запроса. По умолчанию имеет значение &#8216;&lt;div&gt;&lt;/div&gt;&#8217;.</p>
<p><strong>selected</strong> &#8211; индекс вкладки, (отсчет ведется от 0) которая должна быть открыта при инициализации виджета. По умолчанию используется значение 0, т.е. открывается первая вкладка. Чтобы сделать невыбранными все вкладки, надо использовать значение -1.</p>
<p><strong>spinner</strong> &#8211; HTML-код, указанный в этой строке, отображается на ярлыке вкладки во время загрузки удаленного содержимого в область информационного наполнения. Если передать пустую строку, эта возможность будет деактивирована. По умолчанию используется &lt;em&gt;Loading&lt;/em&gt;.</p>
<p><strong>tabTemplate</strong> &#8211; HTML-шаблон из которого создаются новые ярлыки вкладок в случае создания их с использованием метода add. #{href} and #{label} заменяются url’ом и названием вкладки, переданными в аргументах метода add. По умолчанию имеет значение &#8216;&lt;li&gt;&lt;a href=&raquo;#{href}&raquo;&gt;&lt;span&gt;#{label}&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&#8217;.</p>
<p>Точно так же как и другие виджеты, виджет Tabs умеет реагировать на разнообразные события. Посмотрим пример использования одного из возможных событий.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#tabs&quot;).tabs({
    selected: 2,
    select: function(event, ui) {
      alert(&quot;Событие: &quot; + event.type +
            &quot;\nui.tab: &quot; + ui.tab +
            &quot;\nui.panel: &quot; + ui.panel.innerHTML +
            &quot;\nui.index: &quot; + ui.index);
    }
  });
});
&lt;/script&gt;</pre>
<p>Мы определили в опции <strong>select</strong> callback-функцию, которая будет вызываться в момент наступления события <strong>tabsselect</strong>, т.е. в тот момент, когда был совершен щелчок по ярлыку вкладки. Callback-функция принимает два аргумента. Первый аргумент – это объект <strong>event</strong>, второй аргумент – специальный объект <strong>ui</strong>. Организовав доступ к свойствам этих объектов, можно получить довольно полезную информацию (мы выводим ее в окне предупреждения).</p>
<p><strong>ui.tab</strong> – ссылка на активированную в настоящий момент вкладку;<br />
<strong>ui.panel</strong> – ссылка на элемент, в котором заключено информационное наполнение активированной вкладки ;<br />
<strong>ui.index</strong> – индекс активированной вкладки (отсчет ведется от 0);</p>
<p>Ниже приведены описания событий виджета Tabs и названия опций, в которых можно определить callback-функции, вызываемые при наступлении события.</p>
<p><strong>select</strong> &#8211; событие <em>tabsselect</em> происходит в момент щелчка по ярлыку вкладки (при наведении указателя мыши на вкладку, если используется опция event: &#8216;mouseover&#8217;). При щелчке на ярлыке активной вкладки ничего не происходит.</p>
<p><strong>load</strong> &#8211; событие <em>tabsload</em> происходит, когда в область информационного наполнения вкладки было загружено содержимое из внешнего файла.</p>
<p><strong>show</strong> &#8211; событие <em>tabsshow</em> происходит в момент отображения содержимого вкладки.</p>
<p><strong>add</strong> &#8211; событие <em>tabsadd</em> происходит каждый раз, когда добавлена новая вкладка.</p>
<p><strong>remove</strong> &#8211; событие <em>tabsremove</em> происходит каждый раз, когда удалена какая-либо вкладка.</p>
<p><strong>enable</strong> &#8211; событие <em>tabsenable</em> происходит в момент, когда ранее недоступная вкладка становится доступной.</p>
<p><strong>disable</strong> &#8211; событие <em>tabsdisable</em> происходит в момент, когда вкладка становится недоступной.</p>
<p>Осталось разобраться с методами виджета Tabs. Для этого добавим еще пару кнопок в HTML-разметку:</p>
<pre class="brush: xml;">&lt;button id=&quot;startRotate&quot;&gt;Start Rotate&lt;/button&gt;
&lt;button id=&quot;stopRotate&quot;&gt;Stop Rotate&lt;/button&gt;</pre>
<p>и пример javascript-кода:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#tabs&quot;).tabs({
    selected: 2
  });
  $(&quot;#startRotate&quot;).click(function(){
    $(&quot;#tabs&quot;).tabs(&quot;rotate&quot;, 3000, true);
  });
  $(&quot;#stopRotate&quot;).click(function(){
    $(&quot;#tabs&quot;).tabs(&quot;rotate&quot;, null);
  });
});
&lt;/script&gt;</pre>
<p>При щелчке на кнопке с идентификатором <strong>Start Rotate</strong> будет применен метод <strong>rotate</strong>, который заставит виджет самостоятельно переключать вкладки каждые три секунды. При щелчке на кнопке с идентификатором <strong>Stop Rotate</strong> автоматическое переключение вкладок будет остановлено.</p>
<p>Далее приведены описания всех доступных методов виджета Tabs.</p>
<p><strong>destroy</strong> &#8211; .tabs(&#8216;destroy&#8217;) полностью удаляет всю функциональность виджета Tabs. Возвращает элементы в состояние, предшествующее инициализации.</p>
<p><strong>disable</strong> &#8211; .tabs(&#8216;disable&#8217;) временно запрещает использование всей функциональности виджета. Вновь разрешить ее использование можно с помощью метода enable.</p>
<p><strong>enable</strong> &#8211; .tabs(&#8216;enable&#8217;) разрешает использование всей функциональности виджета, если ранее она была запрещена с использованием метода disable.</p>
<p><strong>option</strong> &#8211; .tabs(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции виджета после инициализации.</p>
<p><strong>add</strong> &#8211; .tabs(&#8216;add&#8217;, url, label, [index]) метод добавляет новую вкладку. Второй аргумент содержит либо идентификатор создаваемой вкладки, (см. требования к разметке) либо является полным  url (относительным или абсолютным, но без поддержки кросс-доменной загрузки) при создании вкладки с использованием ajax. Третий аргумент – название вкладки, отображаемое на ее ярлыке. Четвертый &#8211; индекс создаваемой вкладки (позиции отсчитываются от 0).</p>
<p><strong>remove</strong> &#8211; .tabs(&#8216;remove&#8217;, index ) удаляет вкладку. Второй аргумент &#8211; индекс удаляемой вкладки (позиции отсчитываются от 0).</p>
<p><strong>enable</strong> &#8211; .tabs(&#8216;enable&#8217;, index) делает доступной ранее недоступную вкладку. Чтобы сделать доступными одновременно несколько вкладок  сделайте так: $(&#8216;#tabs&#8217;).data(&#8216;disabled.tabs&#8217;, [ ]);</p>
<p><strong>disable</strong> &#8211; .tabs(&#8216;disable&#8217;, index) делает вкладку недоступной. Активная вкладка не может быть сделана недоступной. Чтобы сделать недоступными одновременно несколько вкладок  сделайте так: $(&#8216;#tabs&#8217;).data(&#8216;disabled.tabs&#8217;, [1, 2, 3]);</p>
<p><strong>select</strong> &#8211; .tabs(&#8217;select&#8217;, index) метод позволяет выбрать вкладку так, как будто был сделан щелчок по ее ярлыку. Второй аргумент &#8211; индекс нужной вкладки (позиции отсчитываются от 0). Он же может быть идентификатором вкладки (см. требования к разметке).</p>
<p><strong>load</strong> &#8211; .tabs(&#8216;load&#8217;, index) программно перезагружает содержимое вкладки, используя ajax-запрос. Этот метод всегда загружает содержимое, даже если опция cache имеет значение true. Второй аргумент &#8211; индекс нужной вкладки (позиции отсчитываются от 0).</p>
<p><strong>url</strong> &#8211; .tabs(&#8216;url&#8217;, index, url) изменяет url, откуда с помощью ajax-запроса будет загружаться содержимое. Второй аргумент &#8211; индекс нужной вкладки (позиции отсчитываются от 0). Указанный в третьем аргументе url будет использоваться и для дальнейших загрузок.</p>
<p><strong>length</strong> &#8211; .tabs(&#8216;length&#8217;) метод просто возвращает количество вкладок.</p>
<p><strong>abort</strong> &#8211; .tabs(&#8216;abort&#8217;) метод завершает все выполняющиеся ajax-запросы и анимацию.</p>
<p><strong>rotate</strong> &#8211; .tabs(&#8216;rotate&#8217;, ms, [continuing]) метод устанавливает автоматический перебор всех вкладок. Второй аргумент – количество миллисекунд, в течение которых очередная вкладка будет активной. Чтобы остановить перебор вкладок во втором аргументе необходимо передать 0 или null. Третий аргумент определяет логику при выборе вкладки пользователем. Значение true – перебор вкладок будет продолжен. По умолчанию используется false.</p>
<p>Все? Пожалуй, нет. Как можно обойтись без примера, где информационное наполнение загружается с использованием ajax-запросов, верно?</p>
<p>Сделать это несложно, но придется немного поменять HTML-разметку:</p>
<pre class="brush: xml;">
&lt;div id=&quot;tabs&quot;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;ajax_1.html&quot;&gt;&lt;span&gt;Content 1&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;ajax_2.html&quot;&gt;&lt;span&gt;Content 2&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;ajax_3.html&quot;&gt;&lt;span&gt;Content 3&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#tabs-4&quot;&gt;Content 4&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;div id=&quot;tabs-4&quot;&gt;
    &lt;p&gt;4. Информационное наполнение для вкладки №4.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Изучите пример этой разметки и обратите внимание, что вкладки с информацией, загружаемой с помощью ajax-запросов, вполне успешно могут соседствовать с вкладками, созданными обычным способом.</p>
<p>Конечно, надо создать еще и файлы, из которых будет загружаться информация. В нашем примере &#8211; это ajax_1.html, ajax_2.html и ajax_3.html. А больше ничего и не потребуется. Что касается javascript-кода, можно использовать даже настройки по умолчанию:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#tabs&quot;).tabs();
});
&lt;/script&gt;</pre>
<p>Все. Про стилевое оформление не пишу &#8211; планирую отдельную статью про это сразу для всех виджетов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/99.html/feed</wfw:commentRss>
		<slash:comments>106</slash:comments>
		</item>
		<item>
		<title>jQuery UI &#8211; виджет Slider</title>
		<link>http://www.linkexchanger.su/2009/97.html</link>
		<comments>http://www.linkexchanger.su/2009/97.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 04:56:32 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[slider]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/97.html</guid>
		<description><![CDATA[jQuery UI &#8211; надстройка над JavaScript-библиотекой jQuery. Она поможет создавать по настоящему интерактивные веб-приложения. Сегодня мы познакомимся с виджетом Slider.

Виджет Slider может превратить обычный элемент div в шкалу с бегунком, который можно перемещать с помощью указателя мыши или клавишами.
Для начала посетим страницу настраиваемой закачки на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery UI &#8211; надстройка над JavaScript-библиотекой jQuery. Она поможет создавать по настоящему интерактивные веб-приложения. Сегодня мы познакомимся с виджетом Slider.<br />
<img src="http://www.linkexchanger.su/wp-content/uploads/2009/06/slider.jpg" alt="Виджет Slider" /><br />
Виджет Slider может превратить обычный элемент div в шкалу с бегунком, который можно перемещать с помощью указателя мыши или клавишами.<span id="more-97"></span><br />
Для начала посетим страницу <a href="http://jqueryui.com/download">настраиваемой закачки</a> на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке <strong>Deselect all component</strong>, чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется &#8211; отмечаем <strong>чекбокс Slider</strong> и видим, что вместе с ним отметился <strong>чекбокс UI Core</strong>. Работа виджета Slider зависит от него, поэтому он необходим.<br />
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку <strong>Download</strong> и получаем архив. Можно испытать пример как есть, но интереснее создать свою HTML-страничку, где сначала в разделе HEAD подключить несколько файлов, которые есть в архиве.</p>
<pre class="brush: xml;">&lt;link type=&quot;text/css&quot; href=&quot;css/hot-sneaks/jquery-ui-1.7.2.custom.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script src=&quot;js/jquery-1.3.2.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Мы подключили файл стилевого оформления виджета и файл библиотеки jQuery. В третьем файле объединена функциональность ядра UI и виджета Slider. Дальше познакомимся с требованиями к HTML-разметке.</p>
<p>Вы можете смеяться, но требований нет. Слайдер делается из обычного элемента div.</p>
<pre class="brush: xml;">&lt;div id=&quot;slider&quot;&gt;&lt;/div&gt;</pre>
<p>Теперь привязываем функциональность виджета к HTML-разметке. Это тоже проще простого:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#slider&quot;).slider();
});
&lt;/script&gt;</pre>
<p>В таком виде виджет Slider использует все настройки по умолчанию, но настроить его под себя несложно. Попробуем передать виджету какие-нибудь настройки.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#slider&quot;).slider({
    min: 10,
    max: 200,
    values: [20,60]
  });
});
&lt;/script&gt;</pre>
<p>С помощью опций <strong>min</strong> и <strong>max</strong> мы определили минимальное и максимальное значения шкалы, а с помощью опции <strong>values</strong>, определили начальные значения сразу для двух бегунков, т.е. в таком виде шкала позволит выбирать не одно значение, а диапазон значений.</p>
<p>Очень просто. Главное, знать список опций и их возможности. Ниже как раз и приведен такой список:</p>
<p><strong>animate</strong> &#8211; по умолчанию опция имеет значение false. В этом случае щелчок на шкале приведет к тому, что бегунок моментально переместится в указанное место. Если установить значение true – перемещение бегунка будет выполнено с анимацией.</p>
<p><strong>max</strong> &#8211; максимальное значение шкалы. По умолчанию – 100.</p>
<p><strong>min</strong> &#8211; минимальное значение шкалы. По умолчанию – 0.</p>
<p><strong>orientation</strong> &#8211; определяет расположение виджета. Может принимать значения &#8216;horizontal&#8217; и &#8216;vertical&#8217;. По умолчанию имеет значение &#8216;auto&#8217;. При значении по умолчанию обычно верно определяет нужную ориентацию. Если этого не происходит, можно указать ориентацию принудительно.</p>
<p><strong>range</strong> &#8211; по умолчанию эта опция имеет значение false. Если установить значение true и при этом используется два бегунка, то между ними шкала будет отображаться иным стилем, нежели основная. Два других возможных значения &#8216;min&#8217; и &#8216;max&#8217; при одном бегунке. В первом случае иным стилем будет отображаться часть шкалы слева (или ниже) от бегунка, во втором случае – справа (или выше).</p>
<p><strong>step</strong> &#8211; позволяет задать шаг изменения значений шкалы между минимальным и максимальным значением. Разность между максимальным и минимальным значением шкалы должна без остатка делиться на значение этой опции. Значение по умолчанию – 1.</p>
<p><strong>value</strong> &#8211; определяет положение бегунка. При использовании более чем одного бегунка, определяет положение первого. Значение по умолчанию – 0.</p>
<p><strong>values</strong> &#8211; массив, в котором могут быть переданы значения, определяющие положения бегунков на шкале. Если при этом опция range имеет значение true, длина массива должна быть равна 2. Значение по умолчанию – null.</p>
<p>Разобравшись с настройками виджета, перейдем к знакомству с теми событиями, на которые может реагировать слайдер. Как обычно &#8211; на простом примере:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#slider&quot;).slider({
    min: 10,
    max: 200,
    values: [20,60],
    stop: function(event, ui) {
      alert(&quot;Событие &quot; + event.type);
    }
  });
});
&lt;/script&gt;</pre>
<p>В этом примере мы определили опцию <strong>stop</strong>. Значением опции является callback-функция, которая вызывается при окончании перемещения бегунка. Эта callback-функция может принимать два аргумента. Первый – объект <strong>event</strong>, второй аргумент – объект <strong>ui</strong>, в свойствах которого содержится некоторая информация, представляющая  интерес:</p>
<p><strong>ui.value</strong> – текущее значение опции <strong>value</strong> при использовании одного бегунка (при использовании двух и более бегунков – положение первого бегунка);<br />
<strong>ui.values</strong> – текущее значение опции <strong>values</strong> при использовании двух и более бегунков;</p>
<p>А в следующем примере показано, каким образом можно получить доступ к свойствам объекта ui.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#slider&quot;).slider({
    min: 10,
    max: 200,
    values: [20,60],
    stop: function(event, ui) {
      alert(&quot;Положение бегунков: &quot; + ui.values);
    }
  });
});
&lt;/script&gt;</pre>
<p>Далее приведены описания событий виджета Slider и названия опций, в которых можно определять callback-функции, вызываемые при наступлении соответствующих событий.</p>
<p>Опция <strong>start</strong> &#8211; событие <em>slidestart</em> происходит в момент начала перемещения бегунка.</p>
<p>Опция <strong>slide</strong> &#8211; событие <em>slide</em> происходит постоянно во все время перемещения бегунка.</p>
<p>Опция <strong>change</strong> &#8211; событие <em>slidechange</em> происходит при окончании перемещения бегунка или если положение бегунка было изменено программно.</p>
<p>Опция <strong>stop</strong> &#8211; событие <em>slidestop</em> происходит в момент окончания перемещения бегунка.</p>
<p>Нам осталось познакомиться с методами виджета Slider. В следующем примере продемонстрировано как с помощью метода <strong>option</strong> можно получить и установить значения опций уже после инициализации виджета. Для этого придется в HTML-код с которым мы эксперементируем, добавить пару кнопок:</p>
<pre class="brush: xml;">&lt;button id=&quot;getter&quot;&gt;Get Option&lt;/button&gt;
&lt;button id=&quot;setter&quot;&gt;Set Option&lt;/button&gt;</pre>
<p>и javascript-код:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
  $(&quot;#slider&quot;).slider({
    min: 10,
    max: 200,
    values: [20,60]
  });
  $(&quot;#getter&quot;).click(function(){
    alert(&quot;Положение: &quot; +
              $(&quot;#slider&quot;).slider(&quot;option&quot;,&quot;values&quot;));
  });
  $(&quot;#setter&quot;).click(function(){
    $(&quot;#slider&quot;).slider(&quot;values&quot;, 0, 15);
    $(&quot;#slider&quot;).slider(&quot;values&quot;, 1, 195);
  });
});
&lt;/script&gt;</pre>
<p>При инициализации виджета, мы использовали опции, с помощью которых ограничили диапазон значений от 10 до 200 и установили начальные значения двух ползунков. Для первого – 20, а для второго – 60. Затем мы связали с кнопками событие <strong>click</strong>. Если теперь щелкнуть по кнопке с надписью <strong>Get Option</strong> мы увидим окно предупреждения, в котором будет выведены значения, характеризующие текущие значения ползунков. При щелчке по кнопке с надписью <strong>Set Option</strong> для первого ползунка будет установлено значение 15, а для второго – 195. Если теперь щелкнуть по этой кнопке, то Ваших глазах ползунки изменят свое положение.</p>
<p>Ниже приведены описания всех доступных методов:</p>
<p><strong>destroy</strong> &#8211; .slider(&#8216;destroy&#8217;) полностью удаляет всю функциональность виджета Slider. Возвращает элементы в состояние, предшествующее инициализации.</p>
<p><strong>disable</strong> &#8211; .slider(&#8216;disable&#8217;) временно запрещает использование всей функциональности виджета. Вновь разрешить ее использование можно с помощью метода enable.</p>
<p><strong>enable</strong> &#8211; .slider(&#8216;enable&#8217;) разрешает использование всей функциональности виджета, если ранее она была запрещена с использованием метода disable.</p>
<p><strong>option</strong> &#8211; .slider(&#8216;option&#8217;, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции виджета после инициализации.</p>
<p><strong>value</strong> &#8211; .slider(&#8216;value&#8217;, [value]) с помощью этого метода можно получить или установить значение бегунка (при использовании единственного бегунка).</p>
<p><strong>values</strong> &#8211; .slider(&#8216;values&#8217;, index, [value]) с помощью этого метода можно получить или установить значения бегунков (при использовании двух и более бегунков).</p>
<p>Ну и достаточно&#8230; Мы узнали почти все. За исключением приемов стилевого оформления виджета Slider. Но к этой теме я планирую обязательно вернуться.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/97.html/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>
