2012-07-17 105 views
0

我有一個在<select>允許多項選擇近70項的應用程序。jQuery.after意外的結果

我想通過兩個列表替換它的行爲,其中用戶可以在源列表之間拖放到目標列表。最初的選擇應該反映這些舉措。

我想使它成爲通用的,因爲我必須重複使用多個頁面中的行爲,有時在同一頁面中重複使用幾次。

我現在什麼(我減少的項目爲可讀性的實際數量):

<div style="border: solid 1px red; overflow:auto"> 
    <select name="lst1" multiple="multiple" id="lst1" class="go"> 
     <option value="1">Element N°1</option> 
     <option value="2">Element N°2</option> 
     <option selected="selected" value="3">Element N°3</option> 
     <option value="4">Element N°4</option> 
     <option value="5">Element N°5</option> 
    </select> 
</div> 

<script type="text/javascript"> 
    $(function() { 
     $(".go").each(function (index, el) { 
      var source = document.createElement("ul"); 
      var target = document.createElement("ul"); 
      $(el).after(source); 
      $(el).after(target); 
      $(source).addClass("sourceItems"); 
      $(target).addClass("targetItems"); 
      $(el + "option:selected").each(function (index2, sub) { 
       var item = document.createElement("li"); 
       item.textContent = $(sub).text(); 
       $(target).append(item); 
      }); 
      $(el + "option:not(:selected)").each(function (index2, sub) { 
       var item = document.createElement("li"); 
       item.textContent = $(sub).text(); 
       $(source).append(item); 
      }); 

      $(source).sortable({ connectWith : target}); 
      $(target).sortable({ connectWith : source }); 
     }); 
    }); 

</script> 

<style type="text/css">  
.sourceItems, .targetItems { list-style-type: none; float:left; margin: 0; padding: 0; margin-right: 10px; background: #eee; padding: 5px; width: 200px; border: solid 1px black; } 
.sourceItems li, .targetItems li { margin: 5px; padding: 5px; width: 180px; height: 12px; cursor: move; } 
</style> 

此代碼產生意想不到的結果:

enter image description here

產生的「目標」清單的DOM看起來像確定:

<ul class="targetItems ui-sortable"> 
<li>Element N°3</li> 
<li>Element N°7</li> 
<li>Element N°8</li> 
<li>Element N°14</li> 
<li>Element N°20</li> 
<li>Element N°15</li> 
<li>Element N°21</li> 
</ul> 

但是「源」名單的產生DOM是一個爛攤子(它包含了頁面的DOM中的每個元素)):

<li> 
    .sourceItems, .targetItems { list-style-type: none; float:left; margin: 0; padding: 0; margin-right: 10px; background: #eee; padding: 5px; width: 200px; border: solid 1px black; } 
    .sourceItems li, .targetItems li { margin: 5px; padding: 5px; width: 180px; height: 12px; cursor: move; } 
</li><li> 

</li><li></li><li> 
    .sourceItems, .targetItems { list-style-type: none; float:left; margin: 0; padding: 0; margin-right: 10px; background: #eee; padding: 5px; width: 200px; border: solid 1px black; } 
    .sourceItems li, .targetItems li { margin: 5px; padding: 5px; width: 180px; height: 12px; cursor: move; } 

    Element N°1 
    Element N°2 
    Element N°3 
    Element N°4 
    Element N°5 
    Element N°6 
    Element N°7 
    Element N°8 
    Element N°9 

... 

Element N°3Element N°7Element N°8Element N°14Element N°15Element N°20Element N°21Element N°23Element N°27Element N°29Element. 

我看不出有什麼不對。我希望有人指出問題的根源。

下面是示出這一問題的的jsfiddle:

 var source = document.createElement("ul"); 
     var target = document.createElement("ul"); 
     $(el).after(target); 
     $(el).after(source); 
http://jsfiddle.net/gsYHb/

[編輯]如果我扭轉創建源和目標元素的順序,另一個列表上出現問題在這種情況下

,這是凌亂的目標列表。

回答

0

正如您在http://jsfiddle.net/stevebeauge/gsYHb/6/中看到的,我已經能夠解決我的問題。

這是由於$(this + "option:not(:selected)")選擇器返回整個頁面。

$(this).children("option:not(:selected)")替代此代碼會使腳本正常工作(+其他一些小修正)