Во-первых, как правило, старайтесь избегать использования тем DnD, особенно для локальных вещей & mdash; они громоздки в использовании, потому что к тому времени, когда ваша функция вызывается, параметры могут быть изменены или даже уничтожены другими процессорами (как вы уже обнаружили). Используйте локальные события и / или методы переопределения. Если вы хотите что-то сделать для вновь вставленных узлов, просто переопределите onDrop
(или onDropExternal
, или onDropInternal
, если вы хотите обрабатывать только определенные отбрасывания).
Еще один полезный совет: новые вставленные узлы выделены.
Давайте закодируем это:
var c1 = new dojo.dnd.Source('container1', {copyOnly:true});
var c2 = new dojo.dnd.Source('container2');
// ...
// the decorator technique
function paintRed(source){
var old_onDrop = source.onDrop;
source.onDrop = function(){
// we don't care about actual parameters
// (we will pass them in bulk)
// let's do a drop:
old_onDrop.apply(this, arguments);
// now all dropped items are inserted and selected in c2
// let's iterated over all selected items:
this.forInSelectedItems(function(item, id){
// print the id
console.log(id);
// paint it red
dojo.style(id, "color", "red");
});
};
}
// now let's decorate c2
paintRed(c2);
// now c2 paints all dropped nodes red
Если вы разрешаете переставлять списки и хотите вносить изменения только для внешних отбрасываний (например, от c1 до c2), вам следует переопределить onDropExternal
. Код будет таким же.
Поскольку этот пример не опирается на оригинальные элементы, вы можете сделать это с темами, но вам может понадобиться дополнительный код, если вы хотите сделать это условно (например, для c2, но не для c1). Если вас не волнуют другие вещи, на самом деле это тоже довольно просто:
dojo.subscribe("/dnd/drop", function(source, nodes, copy, target){
// warning: by the time this function is called nodes
// can be copied/modified/destroyed --- do not rely on them!
// but we don't need them here
target.forInSelectedItems(function(item, id){
// print the id
console.log(id);
// paint it red
dojo.style(id, "color", "red");
});
});