Drag & Drop с использованием jQuery UI

14 апреля, 2010
jquery ui drag drop

В прошлый раз я рассказывал о перемещении блоков на странице в браузерах с поддержкой HTML5. Но, знаете, у меня последнее время складывается впечатление, что к тому времени как этим стандартом можно будет свободно пользоваться, он успеет устареть.

До сих пор часто требуется поддержка IE6, а перетаскивание объектов, о котором шла речь, не работает даже в IE8, и неизвестно, будет ли работать в девятой версии самого распространённого браузера. Рассчитывать же на то, что все пользователи вдруг откажутся от IE по-моему очень оптимистично.

В любом случае, решать сегодняшние задачи приходится доступными средствами. Это означает, что если вы не используете библиотек, то для перетаскивания объектов нужно создавать обработчики событий mousedown, mousemove и mouseup. Ничего запредельно сложного, но занятие это совсем не увлекательное. Поэтому, на мой взгляд, лучше использовать какую-нибудь библиотеку, например, jQuery UI.

Чтобы сравнить насколько отличаются её возможности от тех, которые нам предоставит HTML5, я сделал точно такой же пример, как и в прошлый раз, но с использованием jQuery UI.

демонстрационный пример архив с исходным кодом

Рассмотрим его подробнее.

Страница имеет следующую разметку

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  3.  
  4. <head>
  5.     <title>jQuery UI Drag & Drop</title>
  6.    <link rel="stylesheet" type="text/css" href="styles.css" />
  7.    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  8.     <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
  9.     <script type="text/javascript" src="jquery-ui-1.8.custom.min.js"></script>
  10.     <script type="text/javascript" src="init.js"></script>
  11. </head>
  12. <body>
  13.     <h1>jQuery UI Drag & Drop</h1>
  14.  
  15.    <div class="wrapper">
  16.        <div id="block1">
  17.            <div class="textBlock">Текст 1</div>
  18.            <div class="textBlock">Текст 2</div>
  19.            <div class="textBlock">Текст 3</div>
  20.        </div>
  21.        <div id="block2"></div>
  22.    </div>
  23.    
  24. </body>
  25. </html

На странице находятся два контейнера: block1 и block2. Первый содержит три блока (теги div с классом textBlock), которые можно переместить в block2. В заголовке страницы подключены библиотеки jQuery и jQuery UI.

Теперь взгляните на код, который выполняет все необходимые действия.

  1. $(function() {
  2.     $('.textBlock').draggable({
  3.         helper:'clone'
  4.     });
  5.     $('#block2').droppable({
  6.         hoverClass: 'dropHere'
  7.         ,drop: function(event, ui) {
  8.             $(this).append($('<div class="textBlock">' + ui.draggable.html() + '</div>'));
  9.         }
  10.     });
  11. });

С помощью метода draggable мы делаем все элементы с классом textBlock перемещаемым. Параметр helper:'clone' указывает, что сам элемент должен оставаться на месте, а перемещаться будет его копия.

Чтобы сделать block2 «приёмником» перемещаемых элементов используется метод droppable. В параметре hoverClass указываем имя CSS класса, который будет присваиваться блоку, когда над ним находится перемещаемый элемент.

В параметре drop указываем обработчик события drop. Так же, как и в прошлый раз, здесь мы просто создаём новый элемент внутри контейнера block2. Получить доступ к перетаскиваемому элементу можно с помощью объекта ui.draggable, который передаётся во втором параметре обработчика.

Как видите, код получился даже короче чем в прошлый раз. И, кроме того, он работает во всех браузерах, поддерживаемых библиотекой jQuery. Более того, в jQuery UI входят компоненты вроде Sortable, которые значительно расширят её возможности.

Но у HTML5 есть два важных преимущества.

1) Потребление ресурсов. Попробуйте просто подвигать любой из блоков мышкой и одновременно посмотрите нагрузку на процессор. Думаю, результат будет виден невооружённым взглядом.

2) Поддержка браузером HTML5 означает, что вы сможете перетаскивать элементы как из другого окна, так и из другого приложения, а в случае с jQuery UI это невозможно.

Наверное, отличным решением была бы JS библиотека, подобная jQuery UI, но написанная с использованием возможностей HTML5… Хотя, без поддержки нового стандарта браузерах пользы от неё будет немного.

Удачи!

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в HTML, JavaScript, Web разработка View Comments

]]>
  • Отличный пример, большое спасибо!
  • Как по мне на старом лучше работает чем на новом ie, да и стоит у меня только 6 версия.
  • С HTML 5 намного лучше, и возможности там шире! Жаль, что пройдет еще много ремени, пока большинство браузеров будет его поддерживать!
  • Егор
    офтоп небольшой:
    нет ли у Вас такого же простого примера treeview на jquery?
  • Мне больше понравилось с использованием HTML5 - при перетаскивании видно блок, который пеертаскиваешь. Будем ждать, когда все браузеры будут его поддерживать!
  • Этот метод мне как пользователю нравится больше. В прошлый раз блоки перетаскивались как-то "неохотно" что-ли. Тут же все гладенько. Блоки захватываются и встают на место без проблем.
  • Визуальные эффекты в HTML5 можно изменить. Вообще, поддержка canvas позволяет рисовать что угодно, т.е. можно вместо перемещаемого блока показать произвольную картинку.
blog comments powered by Disqus ]]>