Ver Mensaje Individual
  #5 (permalink)  
Antiguo 23/11/2007, 06:20
sanmi69
 
Fecha de Ingreso: septiembre-2004
Mensajes: 191
Antigüedad: 22 años
Puntos: 1
Re: Ordenar Options de Select

Cita:
Iniciado por derkenuke Ver Mensaje
Hola de nuevo:

Me he dado cuenta que si no se mantiene seleccionada la option (u options) se pierde el rastro de lo que hemos movido o no. Puedes cambia la función cambiarDePosicionOption() por lo siguiente para que se vea mejor:
Código PHP:
    function cambiarPosicionOption(optionA, optionB) {
        var 
indiceDeB = optionB.index;
        
elSel.options[ optionA.index ] = new Option(optionB.text, optionB.value);
        
elSel.options[ indiceDeB ] = new Option(optionA.text, optionA.value);
        
elSel.options[ indiceDeB ].selected = true;
    } 
Un saludo.
si, modifique el script para que se mantubiera marcado.

Ademas tb pasaba q si tenias seleccionada 2 opciones y llegabas al tope de arriba con la primera, la segunda podia seguir subiendo.

Aparte el metodo de cambiar posicion lo que sacado del metodo que sube/baja, ya que asi no duplico codigo


Asik cuelgo mis metodos modificados para el que le valgan:

Código PHP:
/**
 * fCambiarPosicionOption
 * sustituir opcionA por opcionB (IE no deja directamente)
 */
function fCambiarPosicionOption(objCombo,optionA, optionB) {
        
objCombo.options[ optionA.index ] = new Option(optionB.text, optionB.value);
        
objCombo.options[ optionB.index ] = new Option(optionA.text, optionA.value);
}

/**
 * fSubirOption
 * Sube una posicion los elementos seleccionados
 */

function fSubirOption(objCombo){
    var 
opciones = objCombo.options;
    var 
opcionesSeleccionadas = [];
    for(var 
i=0, l=opciones.length; i<l; i++) {
        if( 
opciones[i].selected )
            
opcionesSeleccionadas.push( opciones[i] );
    }
    var 
hayAnterior=true;
    for(var 
i=0, l=opcionesSeleccionadas.length; i<l && hayAnterior; i++) {
        
// sustituimos cada opcion por la anterior
        
var indexSel= opcionesSeleccionadas[i].index;
        
hayAnterior = indexSel > 0;
        if( 
hayAnterior ) {
            var 
elAnterior = objCombo.options[ opcionesSeleccionadas[i].index - 1 ];
            
fCambiarPosicionOption(objCombo,opcionesSeleccionadas[i], elAnterior);
            
objCombo.options[indexSel-1].selected=true;
        }
    }
}

/**
 * fBajarOption
 * Baja una posicion los elementos seleccionados
 */

function fBajarOption(objCombo){
    var 
opciones = objCombo.options;
    var 
opcionesSeleccionadas = [];
    for(var 
i=opciones.length-1, l=0; i>=l; i--) {
        if( 
opciones[i].selected )
            
opcionesSeleccionadas.push( opciones[i] );
    }
    var 
hayPosterior=true;
    for(var 
i=0, l=opcionesSeleccionadas.length; i<l && hayPosterior; i++) {
        
// sustituimos cada opcion por la anterior
        
var indexSel= opcionesSeleccionadas[i].index;
        
hayPosterior = indexSel < opciones.length-1;
        if( 
hayPosterior ) {
            var 
elPosterior = objCombo.options[ opcionesSeleccionadas[i].index + 1 ];
            
fCambiarPosicionOption(objCombo,opcionesSeleccionadas[i], elPosterior);
            
objCombo.options[indexSel+1].selected=true;
        }
    }
} 

ademas es mas logico seleccionar lo que antes estaba selecionado en le metodo de subir/bajar, que e el de cambiar posicion, yauw e asi el metodo de cambiar posicion es reutilizable para cuando lo necesitemos