<?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; drag-and-drop</title>
	<atom:link href="http://www.linkexchanger.su/tag/drag-and-drop/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Sun, 08 Jan 2012 13:25:49 +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>Пользовательские интерфейсы jQuery: drag-and-drop сортируемый список.</title>
		<link>http://www.linkexchanger.su/2008/23.html</link>
		<comments>http://www.linkexchanger.su/2008/23.html#comments</comments>
		<pubDate>Mon, 28 Jan 2008 10:25:02 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[drag-and-drop]]></category>
		<category><![CDATA[draggable]]></category>
		<category><![CDATA[droppable]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[li]]></category>
		<category><![CDATA[ol]]></category>
		<category><![CDATA[ul]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[меню]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/23.html</guid>
		<description><![CDATA[Внимание! Эта статья устарела. Новая статья по этой теме: &#171;jQuery UI &#8211; плагин Sortable&#187;. Давайте используем возможности jQuery для создания сортируемого с помощью drag-and-drop списка. Возможность сортировать список с помощью простого перетаскивания мышкой  его пунктов, наверняка сможет произвести впечатление на Ваших пользователей. Только не забывайте одну важную вещь: применение всех этих &#171;фишек&#187; должно быть [...]]]></description>
			<content:encoded><![CDATA[<p><font color="#ff0000">Внимание! Эта статья устарела. Новая статья по этой теме: <a href="http://www.linkexchanger.su/2009/111.html">&laquo;jQuery UI &#8211; плагин Sortable&raquo;</a>.</font> Давайте используем возможности jQuery для создания сортируемого с помощью drag-and-drop списка. Возможность сортировать список с помощью простого перетаскивания мышкой  его пунктов, наверняка сможет произвести впечатление на Ваших пользователей. Только не забывайте одну важную вещь: применение всех этих &laquo;фишек&raquo; должно быть целесообразным и соответствовать ожиданиям пользователя. Не стоит применять такие эффекты сплошь и рядом  &#8211; можно  получить совсем не тот результат, на который Вы рассчитывали. Это было небольшое лирическое отступление, а теперь &#8211; к делу.<span id="more-23"></span><br />
Как обычно, первым делом рассмотрим работу пары примеров.<br />
Меню слева работает с опциями, установленными по умолчанию. Все, что нужно для создания такого меню (разумеется, кроме библиотеки jQuery и своего HTML-кода), это написать следующее:</p>
<pre class="brush: jscript;">$(&quot;#menuList&quot;).sortable();</pre>
<p>где <strong>#menuList</strong> &#8211; это идентификатор списка.<br />
В меню справа использованы некоторые дополнительно установленные опции. Код конечно немного посложнее, но и в нем нет абсолютно ничего страшного.<br />
<iframe src="http://www.linkexchanger.su/example_jquery/sortable.html" style="border: medium none " width="420" height="250"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery/sortable.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>А теперь разберем примеры более подробно. Этот пример для своей корректной работы требует подключения достаточно большого количества различных вспомогательных файлов.</p>
<pre class="brush: xml;">
&lt;script src=&quot;js/jquery-1.2.1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery.dimensions.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.mouse.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.draggable.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.draggable.ext.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.droppable.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.droppable.ext.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/ui.sortable.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Все файлы уже знакомы по предыдущим примерам. Добавился только один файл <strong>ui.sortable.js</strong>, который (как и все остальные) мы подключаем в разделе <strong>HEAD</strong> нашей страницы.<br />
Из таблицы стилей остановлюсь только на небольшом моменте, поскольку это по большому счету дело вкуса.</p>
<pre class="brush: css;">.dragStyle {
  background:#CFD4E6;
  border:1px solid #727EA3;
}</pre>
<p>Класс <strong>dragStyle</strong> используется во втором примере и применяется в момент перемещения элемента, отображая то место, на которое перемещаемый элемент будет &laquo;сброшен&raquo;.</p>
<p>Далее полностью приведен кусок кода, который и отвечает за работу обоих списков.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#menuList&quot;).sortable(); // 1-ый спискок

  $(&quot;#menuList2&quot;).sortable({ // 2-ой список
	hoverClass: &quot;dragStyle&quot;,
	start: function(ev, ui) {
	  var text = $(ui.draggable.element).text();
	  $(&quot;#result&quot;).text(&quot;Перемещаем &quot; + text);
	},
	stop: function(ev, ui) {
	  $(&quot;#result&quot;).text(&quot;Перемещение окончено!&quot;);
	}
  });
});
&lt;/script&gt;</pre>
<p>Вот так просто. За работу первого списка отвечает всего-навсего одна строка кода. Для второго списка мы используем некоторые дополнительные опции.<br />
<strong>hoverClass</strong> &#8211; опция содержит название класса, который будет применен в процессе перемещения одного из пунктов списка, чтобы указать место, куда перемещаемый пункт будет &laquo;сброшен&raquo;.<br />
<strong>start</strong> &#8211; здесь указываем функцию, которая выполнится в момент старта перемещения элемента списка. В этой функции мы обращаемся к перемещаемому элементу, получаем его содержимое в виде текста и записываем в переменную <strong>text</strong>. Затем отыскиваем элемент <strong>#result</strong> и вставляем текст туда.<br />
<strong>stop</strong> &#8211; указываем функцию, которая выполнится в момент, когда произошел &laquo;сброс&raquo; элемента на нужную позицию (независимо от того изменилась ли фактическая позиция элемента). Тут тоже все предельно просто &#8211; вставляем текст сообщения в элемент <strong>#result</strong>.</p>
<p>Я использовал для примера всего несколько опций, а их полный список опций можно найти на сайте разработчиков библиотеки.</p>
<p>Буду рад, если найдете возможность оставить свой комментарий или задать вопросы.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/23.html/feed</wfw:commentRss>
		<slash:comments>63</slash:comments>
		</item>
		<item>
		<title>Пользовательские интерфейсы jQuery: перемещаемый и &#171;сбрасываемый&#187; контент.</title>
		<link>http://www.linkexchanger.su/2008/21.html</link>
		<comments>http://www.linkexchanger.su/2008/21.html#comments</comments>
		<pubDate>Thu, 24 Jan 2008 14:30:46 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[drag-and-drop]]></category>
		<category><![CDATA[draggable]]></category>
		<category><![CDATA[droppable]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[интерфейс]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[скрипт]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/21.html</guid>
		<description><![CDATA[ Внимание! Эта статья устарела. Новая статья по этой теме: &#171;jQuery UI &#8211; плагин Droppable&#171;. Библиотека jQuery предоставляет возможность не только легко и просто написать код, который позволит свободно перемещать элементы по странице. В ее состав, вернее в состав ее расширений входит функция droppable, которая позволяет также довольно просто написать код, который будет обрабатывать события, [...]]]></description>
			<content:encoded><![CDATA[<p> <font color="#ff0000">Внимание! Эта статья устарела. Новая статья по этой теме: &laquo;<a href="http://www.linkexchanger.su/2009/108.html">jQuery UI &#8211; плагин Droppable</a>&laquo;.</font> Библиотека jQuery предоставляет возможность не только легко и просто написать код, который позволит свободно перемещать элементы по странице. В ее состав, вернее в состав ее расширений входит функция <strong>droppable</strong>, которая позволяет также довольно просто написать код, который будет обрабатывать события, которые происходят в момент окончания перемещения элемента.<br />
Что полезного с практической точки зрения можно сделать, воспользовавшись такой возможностью. Первое, что приходит в голову &#8211; это какая-нибудь интерактивная корзина для интернет-магазина. Вот и попробуем сделать такой пример.<span id="more-21"></span></p>
<p>Как всегда сначала попробуем испытать готовый пример, а затем разберемся как работает этот код. Берем мышкой нужный продукт и тащим его в корзину. Над корзиной отпускаем и смотрим, что получилось&#8230;</p>
<blockquote><p>Чтобы не усложнять код примера, не применяются некоторые проверки, которые должны быть использованы в целях безопасности в реальных интернет-магазинах.</p></blockquote>
<p><iframe src="http://www.linkexchanger.su/example_jquery/droppable.html" style="border: medium none " width="420" height="180"></iframe></p>
<blockquote><p>Вы можете сохранить <a href="http://www.linkexchanger.su/example_jquery/droppable.zip">исходный код</a> примера и при наличии у Вас библиотеки jQuery, воспроизвести его на своем сайте.</p></blockquote>
<p>Чтобы все это работало, нам потребуется подключить к нашей странице, в разделе HEAD довольно много файлов (за исключением самой библиотеки эти файлы не очень большие):</p>
<pre class="brush: xml;">
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.1.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.dimensions.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/ui.mouse.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/ui.draggable.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/ui.draggable.ext.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/ui.droppable.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/ui.droppable.ext.js&quot;&gt;&lt;/script&gt;</pre>
<p>Большинство их уже знакомы по предыдущим примерам, добавились только ui.droppable.js и ui.droppable.ext.js, которые и обеспечат нам те возможности, которые мы собираемся рассмотреть.</p>
<p>Не будем очень уж внимательно рассматривать таблицу стилей, поскольку здесь в основном это дело вкуса. Остановлюсь только на ее отдельных моментах.</p>
<pre class="brush: css;">
.products {
  float:left;
}
#basket {
  background-color:#e9b96e;
  border:3px double #c17d11;
  width:150px;
  height:120px;
  margin:10px;
  padding:3px;
  position:absolute;
  top:5px;
  right:5px;
}</pre>
<p>В работе примера используются элементы с классом <strong>.products</strong> и идентификатором <strong>#basket</strong> (понятно, что products &#8211; это товары интернет-магазина, а basket &#8211; корзина). Никаких подводных камней тут нет, можно использовать любой стиль отображения этих элементов. Единственное, что необходимо учитывать &#8211; наш скрипт будет обращаться к этим элементам по имени класса и идентификатора.<br />
Можно упомянуть еще два класса из таблицы стилей:</p>
<pre class="brush: css;">
.droppable-active {
	outline:1px dotted #F00;
}
.droppable-hover {
	outline:1px dotted #00F;
}</pre>
<p>Класс <strong>.droppable-active</strong> будет использован скриптом в тот момент, когда процесс перемещения элемента уже начался, но перемещаемый элемент еще не находится &laquo;в зоне действия&raquo; целевого элемента. А класс <strong>.droppable-hover</strong> будет применен, когда перемещаемый элемент окажется над целевым.</p>
<p>Сам HTML-код вообще не представляет собой ничего особенного: несколько картинок, целевой блок, блок вывода результатов. Все это Вы сможете посмотреть, если скачаете файл примера. А вот сам JavaScript, который все это обрабатывает, разберем подробнее. Код получился немножко длинноват, но очень хотелось сделать более-менее красивый пример, а не полуфабрикат&#8230;</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){

// ---- DRAGGABLES &amp; DROPPABLES -----
$(&quot;div.products&quot;).draggable({
  helper: clone,
  opacity: 0.5
});

$(&quot;#basket&quot;).droppable({
  accept: &quot;.products&quot;,
  activeClass: &quot;droppable-active&quot;,
  hoverClass: &quot;droppable-hover&quot;,
  drop: function(ev, ui) {
    var code = $(ui.draggable.element)
    .find(&quot;img&quot;).attr(&quot;id&quot;);
    if($(this).find(&quot;div[@id=&quot;+ code +&quot;]&quot;)
      .html()==null) {
      var name = $(ui.draggable.element)
      .find(&quot;img&quot;).attr(&quot;alt&quot;);
      $(this).append(&quot;
&lt;div class=&quot;basket&quot; id=&quot; + code + &quot;&gt;
&lt;input type=&quot;text&quot; class=&quot;qnt&quot;/&gt; &quot; + name +
&quot;&lt;img src=&quot;droppable-delete.gif&quot; class=&quot;delete&quot;
alt=&quot;Удалить&quot; /&gt;&lt;/div&gt;
&quot;);
    }
  // *******************
  $(&quot;.delete&quot;).click(function () {
    $(this).parent().remove();
  });
  // *******************
  // *******************
  $(&quot;#buy&quot;).click(function () {
    var databox = new Array();
    $(&quot;#basket&quot;).find(&quot;input[@type=text]&quot;)
      .each(function(){
      var qnt = $(this).attr(&quot;value&quot;);
      if(qnt===undefined) { qnt = 0; }
      	var text = $(this).parent().text();
      	databox[databox.length] =  text + &quot; - &quot; + qnt;
      });
      data = databox.join(&quot; кг, &quot;);
      $(&quot;#buyResult&quot;).html(&quot;Вы заказали:&quot; + data +
&quot; кгСпасибо за покупку!&quot;);
    });
  // ****************
  }
});
// ------ DRAGGABLES &amp; DROPPABLES ------
});
&lt;/script&gt;</pre>
<p>Как обычно используем $(document).ready(function(){&#8230;}); которая отслеживает момент готовности объектной модели документа (DOM). В нее &laquo;завернуто&raquo; все, что мы написали. И начнем разбираться дальше.</p>
<pre class="brush: jscript;">
$(&quot;div.products&quot;).draggable({
  helper: clone,
  opacity: 0.5
});</pre>
<p>Это уже должно быть немножко знакомо: выбираем набор элементов <strong>DIV</strong>, имеющих класс <strong>.products</strong> и делаем любой из них свободно перемещаемым, задавая при этом некоторые опции. <strong>helper: clone</strong> &#8211; при перемещении элемента он останется на месте, а перемещать с помошью мыши мы будем его клон, <strong>opacity: 0.5</strong> &#8211; прозрачность которого во время перемещения будет 0,5.</p>
<p>Дальше буду приводить код небольшими кусочками, чтобы было легче разбираться.<br />
<code></code></p>
<pre class="brush: jscript;">
$(&quot;#basket&quot;).droppable({
  accept: &quot;.products&quot;,
  activeClass: &quot;droppable-active&quot;,
  hoverClass: &quot;droppable-hover&quot;</pre>
<p>Выбираем элемент с идентификатором <strong>basket</strong> и делаем его <strong>droppable</strong> &#8211; туда будем &laquo;сбрасывать&raquo; перемещаемые элементы. Далее устанавливаем необходимые опции:<br />
<strong>accept: &laquo;.products&raquo;</strong> &#8211; &laquo;сбросить&raquo; мы можем только элементы, имеющие класс <strong>products</strong>.<br />
<strong>activeClass: &laquo;droppable-active&raquo;</strong> &#8211; имя класса, который будет применен к <strong>#basket</strong> во время перемещения любого из элементов с классом <strong>.products</strong>, но до того, как перемещаемый элемент окажется &laquo;в зоне действия&raquo; элемента <strong>#basket</strong>.<br />
<strong>hoverClass: &laquo;droppable-hover&raquo;</strong> &#8211; все тоже самое, только класс будет применен тогда, когда перемещаемый элемент попадет в &laquo;зону действия&raquo; элемента <strong>#basket</strong>.<br />
В опции <strong>drop</strong> &#8211; устанавливается функция, которая должна будет выполниться в момент, когда мы &laquo;сбросили&raquo; перемещаемый элемент. Простор для фантазии &#8211; обрабатывайте данные как угодно. Я кратко немного прокомментирую, что написано дальше.</p>
<pre class="brush: jscript;">
var code = $(ui.draggable.element)
.find(&quot;img&quot;).attr(&quot;id&quot;);</pre>
<p>Мы обращаемся к перемещаемому элементу, находим в нем (именно в нем) элемент <strong>img</strong> и получаем значение его атрибута <strong>id</strong>. Сохраняем в переменной <strong>code</strong>.</p>
<pre class="brush: jscript;">if($(this).find(&quot;div[@id=&quot;+ code +&quot;]&quot;).html()==null)</pre>
<p>Здесь будем проверять, нет ли уже в нашей корзине товара с таким же <strong>id</strong>. Для этого обратимся к элементу, который представляет собой нашу корзину (<strong>this</strong> в данном случае тоже самое, что и <strong>#basket</strong>), найдем элемент <strong>div</strong> с <strong>id</strong> равным <strong>id</strong> перемещаемого элемента (хранится в переменной <strong>code</strong>) и получим его HTML-код. Сравним с <strong>null</strong>. Если условие верное, значит такого продукта в корзине еще нет и мы можем выполнять следующие операторы, чтобы добавить товар в корзину.</p>
<pre class="brush: jscript;">var name = $(ui.draggable.element)
.find(&quot;img&quot;).attr(&quot;alt&quot;);</pre>
<p>Обращаемся к перемещаемому элементу (это уже делали, правда?), ищем <strong>img</strong>, получаем значение атрибута <strong>alt</strong>, где у нас хранится название товара.<br />
Теперь осталось только сформировать нужный HTML-код и добавить его в корзину, т.е. в элемент <strong>#basket</strong>.</p>
<pre class="brush: jscript;">$(this).append('&lt;p class=&quot;basket&quot; id=' + code + '&gt;
&lt;input class=&quot;qnt&quot; type=&quot;text&quot; /&gt; ' + name +
'&lt;img src=&quot;droppable-delete.gif&quot; class=&quot;delete&quot; alt=&quot;Удалить&quot; /&gt;');&lt;/p&gt;</pre>
<p>Тут вроде бы все достаточно понятно. И осталось написать еще пару вспомогательных функций, чтобы пример был хоть немного действующим. Приводить их еще раз тут не  буду (можете посмотреть их в полном коде), просто поясню, что первая обрабатывает клик мышкой на картинке удаления товара из корзины и собственно удаляет выбранный элемент <strong>div</strong>. А вторая обходит все имеющиеся текстовые поля ввода, собирает их значения в массив, объединяет массив в строку и выводит результат в виде HTML-кода в элемент <strong>#buyResult</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/21.html/feed</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
	</channel>
</rss>

