2011-07-15 1362 views
11

que tienen seleccione¿Cómo puedo mover la opción seleccionada en multiselección hacia arriba y hacia abajo mediante botones usando jquery?

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

y dos botones

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

¿Cómo puedo mover la opción seleccionada en multiselect arriba y abajo por los botones usando jQuery?

+0

¿Qué 'option' que desea mover, y donde están los botones? ¿Cuál es el margen? –

+0

¿quieres mover tu selección? es decir, pasar de 1 a 2 a 3? o quieres cambiar el orden de las selecciones? es decir, ir de 1,2,3 a 2,1,3 – yamspog

+0

Quiero mover hacia arriba o hacia abajo seleccionar la opción usando el botón hacia arriba o hacia abajo – devsoft

Respuesta

27

Actualización: Código fijo para múltiples opciones seleccionadas, basado en @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 »

No hay necesidad de utilizar en línea onclick="" detectores de eventos. jQuery toma el control total de separar la presentación de la funcionalidad.

+2

[Aquí hay una solución] (http://jsfiddle.net/AJzMh/) para su código. Se rompe cuando se seleccionan varios elementos. – user113716

+1

Cuando selecciona múltiples opciones (no una al lado de la otra, ctrl + clic) y luego sube/baja, terminarán juntas. Eso no está bien ... – Vic

+0

cuando tengo más de 10 elementos y comencé a mover el primer elemento a la parte inferior, el desplazamiento no se desplaza, y no puedo ver la opción seleccionada, ¿tiene alguna solución para eso? –

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

Quiero mover la opción seleccionada con los botones hacia arriba y hacia abajo – devsoft

+0

Tantas líneas para una tarea tan pequeña . – Shef

+0

u solo tiene que guardar el script en otro compañero de archivos – 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

No es necesario separar y todos esos cálculos, jQuery lo manejará solo. :) – Shef

+0

@Shef lo escribí muy rápido. :) –

+0

¡Lo que significa que tuvo más tiempo para corregirse! :) – Shef

5

si no se utiliza 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

aquí es la misma idea que el ejemplo no jQuery publicado anteriormente, pero con algo de código re-uso estratégico. Mi necesidad era que los botones siempre funcionaran en el mismo elemento seleccionado, llamado "cols". Puede poner "sel" como parámetro de las funciones moveUp() y moveDown() si quiere algo más genérico.

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; 
    } 
} 
Cuestiones relacionadas