2011-07-15 41 views
11

我有選擇如何使用jquery通過按鈕向上和向下移動多選中的選定選項?

<select multiple id="select2"> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
</select> 

和兩個按鈕

<input type="button" value="Up" onclick="up()"> 
<input type="button" value="Down" onclick="down()"> 

我怎麼能上下通過使用jquery按鈕移動選定的選項中多選?

+0

?什麼是標記? –

+0

你想移動你的選擇嗎?即從1到2到3?還是你想改變選擇的順序?即從1,2,3到2,1,3 – yamspog

+0

我想上移或下移選擇使用按鈕向上或向下 – devsoft

回答

27

更新:對於選擇多個選項固定代碼,基於@patrick dw's suggestion

$(document).ready(function(){ 
    $('input[type="button"]').click(function(){ 
     var $op = $('#select2 option:selected'), 
      $this = $(this); 
     if($op.length){ 
      ($this.val() == 'Up') ? 
       $op.first().prev().before($op) : 
       $op.last().next().after($op); 
     } 
    }); 
}); 

Test it here »

無需使用內聯onclick=""事件偵聽器。 jQuery完全控制分離表示和功能。

+2

[這是修復](http://jsfiddle.net/AJzMh/)代碼。當多個項目被選中時它會中斷。 – user113716

+1

當你選擇多個選項(不是相鄰的,ctrl +單擊),然後向上/向下移動時,它們將結束在一起。這是不正確的...... – Vic

+0

當我有超過10個項目,並開始移動第一個元素到底部,滾動不滾動,我看不到選定的選項, 你有任何解決方案嗎? –

0
<script type="text/javascript"> 
    $(document).ready(function() { 
    $('li').click(function() { 
     // the clicked LI 
     var clicked = $(this); 

     // all the LIs above the clicked one 
     var previousAll = clicked.prevAll(); 

     // only proceed if it's not already on top (no previous siblings) 
     if(previousAll.length > 0) { 
     // top LI 
     var top = $(previousAll[previousAll.length - 1]); 

     // immediately previous LI 
     var previous = $(previousAll[0]); 

     // how far up do we need to move the clicked LI? 
     var moveUp = clicked.attr('offsetTop') - top.attr('offsetTop'); 

     // how far down do we need to move the previous siblings? 
     var moveDown = (clicked.offset().top + clicked.outerHeight()) - (previous.offset().top + previous.outerHeight()); 

     // let's move stuff 
     clicked.css('position', 'relative'); 
     previousAll.css('position', 'relative'); 
     clicked.animate({'top': -moveUp}); 
     previousAll.animate({'top': moveDown}, {complete: function() { 
      // rearrange the DOM and restore positioning when we're done moving 
      clicked.parent().prepend(clicked); 
      clicked.css({'position': 'static', 'top': 0}); 
      previousAll.css({'position': 'static', 'top': 0}); 
     }}); 
     } 
    }); 
    }); 
</script> 

<ul> 
<li><a>Hank</a></li> 
<li><a>Alice</a></li> 
<li><a>Tom</a></li> 
<li><a>Ashlee</a></li> 
</ul> 
+0

我想要使用按鈕向上和向下移動選定的選項 – devsoft

+0

對於如此小的任務。 – Shef

+0

你只需要保存腳本在另一個文件夥伴 – theGame

4
function up() { 
    var selected = $("#select2").find(":selected"); 
    var before = selected.prev(); 
    if (before.length > 0) 
     selected.detach().insertBefore(before); 
} 

function down() { 
    var selected = $("#select2").find(":selected"); 
    var next = selected.next(); 
    if (next.length > 0) 
     selected.detach().insertAfter(next); 
} 
+0

不需要分離和所有這些計算,jQuery將自己處理它。 :) – Shef

+0

@Shef我寫得很快。 :) –

+0

這意味着你有更多時間來糾正自己! :) – Shef

5

,如果你不使用jquery

function moveUp(){ 
    var select = document.getElementById("columnOrder"); 
    var options = select && select.options; 
    var selected = []; 

    for (var i = 0, iLen = options.length; i < iLen; i++) { 
     if (options[i].selected) { 
      selected.push(options[i]); 
     } 
    } 

    for (i = 0, iLen = selected.length; i < iLen; i++) { 
     var index = selected[i].index; 

     if(index == 0){ 
      break; 
     } 

     var temp = selected[i].text; 
     selected[i].text = options[index - 1].text; 
     options[index - 1].text = temp; 

     temp = selected[i].value; 
     selected[i].value = options[index - 1].value; 
     options[index - 1].value = temp; 

     selected[i].selected = false; 
     options[index - 1].selected = true; 
    } 
} 

function moveDown(){ 
    var select = document.getElementById("columnOrder"); 
    var options = select && select.options; 
    var selected = []; 

    for (var i = 0, iLen = options.length; i < iLen; i++) { 
     if (options[i].selected) { 
      selected.push(options[i]); 
     } 
    } 

    for (i = selected.length - 1, iLen = 0; i >= iLen; i--) { 
     var index = selected[i].index; 

     if(index == (options.length - 1)){ 
      break; 
     } 

     var temp = selected[i].text; 
     selected[i].text = options[index + 1].text; 
     options[index + 1].text = temp; 

     temp = selected[i].value; 
     selected[i].value = options[index + 1].value; 
     options[index + 1].value = temp; 

     selected[i].selected = false; 
     options[index + 1].selected = true; 
    } 
} 
1

這裏是相同的思路與先前發佈非jQuery的例子,但也有一些戰略代碼複用。我的需求是讓按鈕始終在同一個select元素上操作,名爲「cols」。如果你想要更通用的東西,你可以把「sel」作爲moveUp()和moveDown()函數的參數。

function moveUp() { 
    var sel = document.getElementById("cols"); 
    var i1=0, i2=1; 
    while (i2 < sel.options.length) { 
     swapIf(sel,i1++,i2++); 
    } 
} 
function moveDown() { 
    var sel = document.getElementById("cols"); 
    var i1=sel.options.length-1, i2=i1-1; 
    while (i1 > 0) { 
     swapIf(sel,i1--,i2--); 
    } 
} 
var swapVar = ''; 
function swapIf(sel,i1,i2) { 
    if (! sel[i1].selected && sel[i2].selected) { 
     swapVar = sel[i2].text; 
     sel[i2].text = sel[i1].text; 
     sel[i1].text = swapVar; 
     swapVar = sel[i2].value; 
     sel[i2].value = sel[i1].value; 
     sel[i1].value = swapVar; 
     sel[i1].selected = true; 
     sel[i2].selected = false; 
    } 
} 
相關問題