2011-07-15 17 views
11

mam wybraćJak przenieść wybraną opcję w multiselekcji w górę iw dół za pomocą przycisków przy użyciu jquery?

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

i dwa przyciski

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

Jak mogę przenieść wybraną opcję w wielokrotny w górę iw dół za pomocą przycisków przy użyciu jQuery?

+0

Które option' 'chcesz przenieść, a gdzie są przyciski? Jaka jest marża? –

+0

Czy chcesz przenieść swój wybór? tzn. przejść od 1 do 2 do 3? lub czy chcesz zmienić kolejność selekcji? tzn. przejdź od 1,2,3 do 2,1,3 – yamspog

+0

Chcę przejść w górę lub w dół opcji wyboru za pomocą przycisku w górę lub w dół – devsoft

Odpowiedz

27

Update: Poprawiono kod dla wielu opcji wybranych na podstawie @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 »

Nie ma potrzeby korzystania inline onclick="" nasłuchiwania zdarzeń. jQuery przejmuje pełną kontrolę nad oddzielaniem prezentacji od funkcji.

+2

[Tutaj jest poprawka] (http://jsfiddle.net/AJzMh/) dla Twojego kodu. Łamie się, gdy wybranych jest wiele elementów. – user113716

+1

Po wybraniu wielu opcji (nie obok siebie, ctrl + kliknięcie), a następnie przesunięciu w górę/w dół, staną się razem. To nie jest w porządku ... – Vic

+0

kiedy mam więcej niż 10 przedmiotów i zacząłem przenosić pierwszy element na dół, przewijanie nie przewija się i nie widzę wybranej opcji, czy masz jakieś rozwiązanie? –

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

Chcę przenieść wybraną opcję za pomocą przycisków w górę iw dół – devsoft

+0

Tyle linii dla tak małego zadania . – Shef

+0

musisz tylko zachować skrypt w kodzie innego pliku – 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

Nie trzeba się odrywać i wszystkie te obliczenia, jQuery poradzi sobie sam. :) – Shef

+0

@Shef napisałem to naprawdę szybko. :) –

+0

Co oznacza, że ​​masz więcej czasu na poprawianie siebie! :) – Shef

5

jeśli nie używasz 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

tutaj jest taki sam pomysł jak wcześniej pisał non-jquery przykład, ale z jakiegoś strategicznego kodu ponownego wykorzystania. Moją potrzebą było, aby przyciski zawsze działały na tym samym elemencie select, o nazwie "cols". Możesz wstawić "sel" jako parametr funkcji moveUp() i moveDown(), jeśli chcesz czegoś bardziej ogólnego.

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; 
    } 
} 
Powiązane problemy