2011-07-15 4 views
11

は、私が選択していjqueryを使用してボタンでマルチセレクションの選択したオプションを上下に移動するにはどうすればよいですか?

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

と2つのボタン

<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

uは別のファイルバディにスクリプトを保存するだけです – 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の例として、いくつかの戦略的なコードの再利用と同じ考え方です。私の必要性は、ボタンを常に "cols"という名前の同じ選択要素で操作させることでした。 moveUp()とmoveDown()関数のパラメータとして "sel"を置くことができます。

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; 
    } 
} 
関連する問題