Почему недавно добавленный UL не принимает Drag'n'Drop? - PullRequest
0 голосов
/ 17 июня 2011

Я использую функцию перетаскивания в Dojo, чтобы создать сортируемый многомерный список.

Теперь, когда я добавил код, который будет порождать новый UL внутри зависшего LI при перетаскивании чего-либо на него, вновь порожденный UL не будет принимать элементы, в которые нужно перетаскивать.

dojo.addOnLoad(function ()
{
    dojo.query(".listview").forEach(function(node, index, arr)
    {
        dojo.connect(node, "onmouseover", "ListViewInsertList");
        dojo.connect(node, "onmouseout", "ListViewInsertListAbort");
    });
});

var hovernode = null;
var timeout = null;

function ListViewInsertList(e)
{
    console.log("Hover caught.");
    if (dojo.query(".dojoDndAvatar").length > 0)
    {
        console.log("DND is active!");
        hovernode = e.target;
        timeout = window.setTimeout("ListViewInsertListDo()", 1000);
    }
}

function ListViewInsertListDo()
{        
    dojo.create("ul", { dojoType: "dojo.dnd.Source", className: "container listview" }, hovernode);

    dojo.query(".listview").forEach(function(node, index, arr)
    {
        dojo.connect(node, "onmouseover", node, "ListViewInsertList");
        dojo.connect(node, "onmouseout", node, "ListViewInsertListAbort");
    });
}

function ListViewInsertListAbort()
{
    window.clearTimeout(timeout);
}

Мой HTML выглядит примерно так:

<ul dojoType="dojo.dnd.Source" selfAccept="true" class="container listview">
     <li class="dojoDndItem listviewitem">abc</li>
     <li class="dojoDndItem listviewitem">def
          <ul dojoType="dojo.dnd.Source" selfAccept="true" class="container listview">
               <li class="dojoDndItem listviewitem">ghi</li>
          </ul>
     </li>
</ul>

Так как мне сказать Dojo, что недавно добавленный UL хорош для предметов, в которые можно бросить?

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

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

function bindUL ( node ) {
  return dojo.connect(node, "onmouseover", "ListViewInsertList");
}

и добавьте сюда

function ListViewInsertListDo()
{        
  var x = dojo.create("ul", { dojoType: "dojo.dnd.Source", className: "container listview" }, hovernode);
  bindUL(x);
  dojo.query(".listview").forEach(function(node, index, arr)
  {
0 голосов
/ 17 июня 2011

Когда вы запускаете обратный вызов onLoad, он захватывает существующие элементы и добавляет к ним поведение.

Я предполагаю, что, поскольку вы добавляете новый материал, вам нужно запустить этот конкретныйнемного кода, чтобы события были присоединены к новым элементам.

...