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