使用 Dojo 的 Ajax 应用开发进阶教程,第 7 部分: Dojo 核心库深入介绍
2010-09-26 00:00:00 来源:WEB开发网如 代码清单 5 所示,注意其中 insertNodes()方法和 creator方法的参数 hint的使用。当条目被拖动到目标上方并放下的时候,表示目标的 dojo.dnd.Target对象会首先通过 checkAcceptance(source, nodes)方法来检查是否允许拖动的条目放下。如果允许的话,目标上的 onDrop(source, nodes, copy)方法会被调用,其三个参数 source、nodes和 copy分别表示拖放源、被拖动的节点以及是否需要进行复制。默认提供的 onDrop()方法的实现会根据拖放源和目标是否相同来调用不同的方法:当源和目标不相同的时候,调用的是 onDropExternal(source, nodes, copy);相同的时候调用的则是 onDropInternal(nodes, copy)。拖动的节点在目标上被放下之后的默认行为取决于在创建目标 dojo.dnd.Target对象的时候,是否定义了 creator方法。如果定义了 creator方法,就通过此方法在拖放目标中创建出新的 DOM 节点;如果没有的话,就直接进行 DOM 节点的复制或移动。从 代码清单 5 中可以看到,拖放目标 target定义了 creator方法,因此当条目从 source拖放到其上之后,条目的显示方式发生了变化。
在有些拖放操作中,当条目在目标上放下的时候,并不需要进行 DOM 节点的复制或移动。拖放行为本身只是作为一种触发的动作。这个时候就需要自定义 onDrop()或是 onDropExternal()和 onDropInternal()方法的实现。代码清单 6 中给出了一个自定义拖动条目被放下时行为的示例。该示例的场景是用户拖动想要购买的图书到购物车中,购物车会自动更新图书的总价。
清单 6. 自定义拖动条目被放下时的行为
var sum = 0;
var target = new dojo.dnd.Target("target", {
accept : ["book"],
onDropExternal : function(source, nodes, copy) {
for (var i = 0, n = nodes.length; i < n; i++) {
var node = nodes[i];
var item = source.getItem(node.id);
sum += item.data.price;
}
dojo.byId("target").innerHTML = "总价合计为:" + sum + " 元";
}
});
更多精彩
赞助商链接