3

我的问题与发布在http://www.sitepen.com/blog/2011/12/05/dojo-drag-n-drop-redux/的 dnd 示例(第 4 步:监听事件)有关。

就我而言,我有多个跨多个页面的 dnd 源。如何在购物车(目标)中记录数据,以便加载不同页面后其中的商品不会消失,并且用户可以继续丢弃更多商品?

任何提示将不胜感激!

4

2 回答 2

1

参见dojotoolkit.org

然而,似乎文档不是 1.7 列表的上游;

订阅一组主题,您将知道何时/什么被覆盖

dojo.topic.subsribe

  • /dnd/ start:当 DnD 开始时。当前源、节点和复制标志(有关详细信息,请参阅管理器的 startDrag())作为此事件的参数传递。
  • ./dnd/ source/over:当鼠标移到源上时。有问题的源作为参数传递。当鼠标离开源时会引发相同的事件。在这种情况下,null 作为参数传递。
  • /dnd/ drop/before:在下降之前引发。它可用于捕获丢弃参数。参数与 /dnd/drop 相同。
  • /dnd/ drop:引发以执行下降。前三个参数与 /dnd/start 相同。第四个参数是目标对象。请注意,在处理此事件的过程中,节点可能已经被移动,或被重用。如果您需要原始节点,请使用 /dnd/drop/before 捕获它们,或使用源/目标对象的本地事件。
  • /dnd/ cancel:当 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/start", this.source, this.selection, this.bCopy)。订阅主题时,您将收到通知。

dojo.topic 就像您订阅了一个邮件列表一样,一旦有消息,您就会收到邮件

于 2012-05-05T09:17:57.123 回答
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>

或者,对于大型购物车,cookie 是多余的,并且会使标题混乱 上面的脚本可以发送带有 id 和服务器的 XHR 然后将其附加到会话,使用与 javascript 相同的逻辑 - 在这种情况下,只需将 $_COOKIE 替换为 $_SESSION

于 2012-05-07T18:30:05.333 回答