0

我有一个可从源列表拖动到包含在表单元素中的目标列表的项目列表。这对于一个目的地列表工作正常,因为可以静态指定'name'属性。但是,我试图找出一种方法来支持多个目标列表,并且我认为如果我可以从目标列表中获取ID并将其作为名称属性动态添加到输入字段,因为它被放入可排序列表中列表中,每个列表可以作为单独的数组提交。我的排序,可拖动和投掷的功能我希望的方式工作正好与下面的代码:使用jQuery将项目属性下载到可排序列表中时修改项目的属性

<div> 
     Available Items 
     <ul id="avail"> 
     <li><input type="hidden" name="options[]" value="1">Option 1</li> 
     <li><input type="hidden" name="options[]" value="2">Option 2</li> 
     <li><input type="hidden" name="options[]" value="3">Option 3</li> 
     <li><input type="hidden" name="options[]" value="4">Option 4</li> 
     </ul> 
    </div> 
    <p class="clear"></p> 
    <form action="myForm.php" method="post" enctype="multipart/form-data"> 
     <div style="float:left;"> 
     List #1 
     <ul class="sortable" id="list1"> 
     </ul> 
     </div> 
     <div style="float:left;margin-left:5px;"> 
     List #2 
     <ul class="sortable" id="list2"> 
     </ul> 
     </div> 
     <div class="clear"></div><br> 
    </form> 

及以下的jQuery:

$('#avail li').draggable({ 
     connectToSortable: ".sortable", 
     helper: "clone", 
     opacity: 0.75, 
    }); 
    var sortableIn; 
    $('.sortable').sortable({ 
     receive: function(event, ui) { 
     sortableIn = 1; 
     }, 
     over: function(event, ui) { 
     sortableIn = 1; 
     }, 
     out: function(event, ui) { 
     sortableIn = 0; 
     }, 
     beforeStop: function(event, ui) { 
     if (sortableIn == 0) { 
      ui.item.remove(); 
     } 
     } 
    }).droppable({ 
     greedy: true 
    }); 

你可以看到它在行动上this fiddle。因此,基于这个例子总结,当一个选项被放入这些列表之一时,我试图用'list1 []'或'list2 []'替换'option []'作为输入字段的名称属性。

我假设我需要在“receive”函数或“drop”函数中使用类似于attr('name',$(this).attr('id'))的东西,但我不是确切地确定将它放在哪里以及如何将输入字段定义为attr()的目标而不是包含<li>


解决方案: 我改变了receive功能update并添加曲折的第二代码片段它,因此它现在看起来像:

update: function(event, ui) { 
    sortableIn = 1; 
    ui.item.find("input").attr("name", $(this).attr("id") + '[]'); 
} 
+0

我们不在这里的标题中做“已解决”。如果您找到自己的答案,请删除您的问题或在下面回答并将其标记为已接受。 – j08691

+0

谢谢你的头。这是我第一次在SO上发布。虽然,您的评论的相关性可能已通过注意到下面已提供并接受的答案而得到改进。 – KenC

回答

0

我会把它的data-list属性目标元素。例如:

<ul class="sortable" id="list1" data-list="1"> 
</ul> 

<ul class="sortable" id="list2" data-list="2"> 
</ul> 

然后在receive,你可以指定你想要的name属性的值:

ui.item.find("input").attr("name", "list" + $(this).data("list") + "[]"); 

或者你可以读取ID:

ui.item.find("input").attr("name", $(this).attr("id") + "[]"); 

这将导致在收到的物品中有:

name="list1[]" 
name="list2[]" 

由于$(this)将作为元素被拖拽到的可排序列表,因此它将从数据中获取列表号。

+0

是的!这是我找不到的“发现(”输入“)”。我不得不将它添加到接收函数和函数中,以使它每次都能正常工作,但是这确实有窍门! – KenC

+0

@KenC很棒。是的,'ui.item'是'

  • '元素,所以我们不得不在其中找到'input'来改变这个属性。 – Twisty

    +0

    其实我只是测试它多一点,它只适用于over函数而不是接收函数。不知道我明白为什么会这样,但嘿...它的工作:) FWIW当它在接收函数,而不是在over函数,第一次我会放弃一个特定的选项,它仍然会有name =“options []”,然后第二次我放弃相同的选项,这将是正确的。同样每隔一段时间,它将看起来随机(尽管可能不是)放在list1中的项目上,而name =“list2 []”,反之亦然。 – KenC