代码之家  ›  专栏  ›  技术社区  ›  dirkiev

jQuery UI Sortable Widget动态添加不触发事件的列表

  •  1
  • dirkiev  · 技术社区  · 8 年前

    我所拥有的是一个两个可排序列表,其中一个由一组项目填充。用户应该能够在这些列表之间进行排序。 他们还应该能够创建新列表,还可以添加初始项。因此,可排序元素是静态的,但可排序列表是动态的。

    最初的两个列表会触发可排序事件,并正常工作。然而,问题在于动态添加的列表。添加它们没有问题,您可以将项目排序到其中。问题是没有触发任何事件,例如“receive”或“activate”,所以当我将元素拖动到一个新列表中时,我想获取列表的id,但它从未触发任何这些事件。

    这里有一个简单的提琴 JS Fiddle

       $(".connectedSortable").sortable({
     connectWith: '.connectedSortable',
     receive: function(event, ui) {
       var receivingID = ui.item.parent('ul').attr('id');
       console.log('receiving id :' + receivingID);
     }}).disableSelection();
    

    这似乎永远不会在动态添加的列表上运行

    function makeSortable(id) {
     console.log(id);
     $("#" + id).sortable({
       connectWith: ".connectedSortable"     
     ,
     activate: function(event, ui) {
       console.log("activated list" + id);
     }}
     ).disableSelection();   }
    

    这是用户添加另一个列表时运行的内容。

    1 回复  |  直到 8 年前
        1
  •  0
  •   element11    8 年前

    以下是解决问题后对JS Fiddle的更新。 LINK!

    这个 $(".connectedSortable").sortable(...) 块需要在 $('#add_new_list').click(...) 作用这个 .sortable(...) 代码将可排序添加到所有现有项,但不添加到未来项。

    我所做的更改将 可排序(…) 在一个名为 refreshHooks() 它在页面加载时运行,每次单击“添加新列表”时都会再次运行。

    $(document).ready(function () {
    
       function makeSortable(id) {
          console.log(id);
          $("#" + id).sortable({
             connectWith: ".connectedSortable",
             activate: function (event, ui) {
                console.log("activated list" + id);
             }}
          ).disableSelection();
       }    
    
       var list_counter = 2;
    
       $('#add_new_list').click(function () {
          $('#add_new_list').before($(
                '<ul id="list' + list_counter + '"' +
                ' class="connectedSortable"></ul>'
                ));
    
          var lists = {};
          lists.list_id = ['list' + list_counter];
          makeSortable(lists.list_id);
          list_counter++;
    
          refreshHooks();
       });
    
       function refreshHooks() {
          $(".connectedSortable").sortable({
             connectWith: '.connectedSortable',
             receive: function (event, ui) {
                var receivingID = ui.item.parent('ul').attr('id');
                console.log(receivingID);
             },
             activate: function (event, ui) {
                console.log("activated list");
             }
          }).disableSelection();
       }
       refreshHooks();
    });