2012-05-04 1 views
3

Мой вопрос связан с примером dnd (шаг 4: прослушивание событий), размещенным на http://www.sitepen.com/blog/2011/12/05/dojo-drag-n-drop-redux/.Dojo dnd target и страница loading

В моем случае у меня есть несколько источников dnd, которые охватывают несколько страниц. Как записывать данные в корзину покупок (цель), чтобы элементы в ней не исчезали после загрузки разных страниц и чтобы пользователи могли по-прежнему отбрасывать больше предметов?

Любые советы были бы очень признательны!

ответ

1

см dojotoolkit.org

Кажется документы не выше 1,7 для перечисления однако;

подписаться на набор тем и вы будете знать, когда/что drapped

dojo.topic.subsribe

  • /DND/старт: при запуске DnD. Текущий источник, узлы и флаг копирования (см. Описание startDrag() менеджера для получения дополнительной информации) передаются в качестве параметров этого события.
  • ./dnd/ источник/над: когда мышь перемещается по источнику. В качестве параметра передается исходный код в . Такое же событие возникает, когда мышь выходит из источника. В этом случае значение null принимается как параметр .
  • /dnd/drop/before: поднят как раз перед каплей. Его можно использовать для для захвата параметров падения. Параметры те же, что и для /dnd/drop.
  • /dnd/drop: поднят для выполнения капли. Первые три параметра: такие же, как для/dnd/start. Четвертым параметром является объект . Обратите внимание, что во время обработки этого события узлы могут быть уже перемещены или повторно использованы. Если вам нужны исходные узлы, используйте /dnd/drop/before для их захвата или используйте локальные события исходных/целевых объектов.
  • /dnd/Отменить: когда DnD был отменен либо пользователем (путем нажатия Esc), , либо путем отбрасывания предметов в незаконном месте. В этом разделе нет параметров .

Пример темы подписки:

dojo.subscribe("dnd/start", function(source, nodes, copy) { 
    // see dojo.dnd.startDrag documentation for details 
    // this event will process when user picks up a dnditem 
    console.log("Arguments:", arguments); 

}; 
dojo.subscribe("dnd/drop", function(source, nodes, copy, target) { 
    // see dojo.dnd.startDrag documentation for details 
    // this event will process when user releases dnditem on a valid target 
    // note the extra parameter, target - in 99% cases a DOM node 
    console.log("Arguments:", arguments); 
}); 

Что происходит, пользователь выбирает пункт - и dndmanager называет dojo.publish ("DND/старт", this.source, this.selection это. bCopy). При подписке на эту тему вы получите уведомление.

dojo.тема работает как если бы вы подписались на список рассылки, вы получите почту, как только новости доступны

+0

Спасибо mschr. К сожалению, я новичок в dojo, поэтому я не вижу связи между обработчиками событий, о которых вы указали выше, и решением моей проблемы. Наверное, я могу задать свой вопрос таким образом. На первой странице (page1.html) есть контейнеры source1 и target. Однако источник 2 должен находиться на второй странице (page2.html). Как обрабатывать цель, чтобы она отображалась на странице2, принимать больше элементов и отображать их на странице1? –

+0

попробуйте добавить приведенный выше пример к вашей кодовой базе и проверить аргументы с помощью консоли – mschr

+0

Спасибо, mschr. Я попробую! –

0

Вы хотите инициализировать тележку с деталями, которые пользователь выбрал для покупки, каждая капля должна

<script> 
    function dropped(source, nodes, copy, target) { 
     if(target.id == "myCardId") { 
     var list = dojo.cookie("mycart"); 
     // split or initialize list (delimiter : comma) 
     list = list = "" ? [] : list.split(","); 
     if(dojo.indexOf(nodes[0].id), list) != -1) 
      // allready there, return 
      return; 
     else { 
      // combine list with every dropped node 
      dojo.forEach(nodes, function(dropItem) { list.push(dropItem.id); }); 
      // set cookie with new variable 
      dojo.cookie("mycart", list.join(","); 
     } 
     } 
    } 

    .... 
    dojo.subscribe("dnd/drop", dropped); 
</script> 

Может быть реализован на PHP так, как будто, хотя я не буду подробно разбираться в том, как вы получаете представление элементов, для примера - вы имеете их в db_data;

<?php 

if(isset($_COOKIE) && !empty($_COOKIE['mycart'])) { 
    $cartContents = "<ul class=\"dndContainer\">"; 
    foreach(explode(",", $_COOKIE['mycart']) as $id) 
     $cartContents .= "<li class=\"dndItem\">".$db_data[$id]->title."</li>"; 
    $cartContent .= "</ul>"; 
} 
?> 
<div id="dragSource"><? print generateView(); ?></div> 
<div id="myCartId"><? print $cartContents; ?></div> 

в качестве альтернативы для больших тележек, печенье является излишеством и загромождать заголовки выше сценарий может затем отправить XHR с идентификатором и сервером затем добавить его в сессии, используя ту же логику, как Javascript делает - в том, что случай, просто замените $ _COOKIE с $ _SESSION

+0

Большое спасибо, mschr! –