Introducción
Este artículo se pretende continuar lo empezado en:
En esta ocasión trataremos un conjunto diferente de controles, estos muy usados en un desarrollo web.
En este caso particular trataremos controles de lista: ListBox y Combos. Notando cuan similares son a la hora de trabajarlos.
Selección de Ítems
En los ejemplos indicados como 1 y 2, se recuperan los ítems marcados por parte del usuario, pudiendo manipularlos y trabajar con la información.
function btnEj1Seleccion_OnClick() { var list = new Array(); $.each($('#Ej1Select :selected'), function() { var msg = 'texto: {0}, valor: {1} '.format($(this).text(), $(this).val()); list.push(msg); }); $('#Ej1Resultado').html(list.join('')); } function btnEj2Seleccion_OnClick() { var optionSelected = $('#Ej2Select :selected'); var msg = 'texto: {0}, valor: {1}'.format(optionSelected.text(), optionSelected.val()); $('#Ej2Resultado').html(msg); }
Los selectores usados en ambos casos son idénticos, solo lo diferencia la selección múltiple que puede brindar un ListBox, es por eso que aplica un loop por cada ítem marcado por el usuario.
En este código hay que marcar algunos puntos de interés:
La función $.each() recorre la selección de una lista de ítems y aplica una función por cada uno de ellos.
En este caso en concreto se recorre cada ítem seleccionado de la lista, o sea se obtiene cada <option> tomando de este el valor y el texto. Es importante notar que esta función tiene acceso a cada ítem por medio del this, pero se trata de un objeto javascript y no jquery, es por eso que se aplica nuevamente un selector $(this), para tener acceso a los métodos que permiten acceder recuperar la información.
Con respecto al selector, este accede al control por medio del sus id, por eso el uso del #, pero de este se filtra además los seleccionados usando el :selected.
Por fuera de la función se crea un array de javascript para ubicar cada dato marcado, se inserta el texto resultante de cada item por medio de push(), y al final se lo une por medio del join(), para lograr un solo string.
Seguramente se habrá notado además el uso del una función format() para reemplazar en el texto ciertas posiciones con un dato en concreto, bien esta función en si no es estándar de javascript, sino que se encuentra definida en utils.js, y básicamente aplicaría como un método de extensión para los tipos de datos string.
El trabajo con combos es idéntico a la lista, pero solo se toma un ítem accediendo de forma directa, no requiere ser recorrido sus ítems, por eso es algo más simple aplicar los selectores.
Agregar / Remover Ítems
La sección marcada para el Ejemplo 3, representa la operación de agregar y remover elementos en una lista.
function btnEj3Agregar_OnClick() { var ej3Texto = $('#txtEj3Texto'); var ej3Valor = $('#txtEj3Valor'); var newItem = $('<option/>').text(ej3Texto.val()).val(ej3Valor.val()); $("#Ej3Select").append(newItem); } function btnEj3AgregarDespuesSeleccion_OnClick() { var itemsSelected = $('#Ej3Select :selected'); if (itemsSelected.length == 0) { alert('Debe seleccionar un item'); return; } var ej3Texto = $('#txtEj3Texto'); var ej3Valor = $('#txtEj3Valor'); var newItem = $('<option/>').text(ej3Texto.val()).val(ej3Valor.val()); newItem.insertAfter(itemsSelected[0]); } function btnEj3Seleccion_OnClick() { var list = new Array(); $.each($('#Ej3Select :selected'), function() { var msg = 'texto: {0}, valor: {1} '.format($(this).text(), $(this).val()); list.push(msg); }); $('#Ej3Resultado').html(list.join('')); } function btnEj3RemoverSeleccion_OnClick() { $.each($('#Ej3Select :selected'), function() { $(this).remove(); }); }
El agregar una nueva opción requiere que el html de <opción> sea creado, es por eso que se define este en el selector, para luego disponer de método de text() y val() para asignar la información proveniente del input del usuario.
Una vez creado el nuevo ítem solo se hace un append() a la lista existente, también se podrían usar métodos como ser insertBefore() o insertAfter() para controlar la ubicación del nuevo elemento, pero esto requiere que se indique que elemento será tomado como objetivo. En el ejemplo al hacer uso de estos métodos se debe asegurar que al menos un ítem esta marcado para que funcione correctamente, si mas de uno se ha seleccionado solo se toma el primero.
El remover un ítem es muy simple, solo se recorre la selección y se aplica el remove(), al igual que en la selección, el this representa cada ítem en el loop, aquí también es necesario aplicar nuevamente el selector para tener acceso a los método de jquery implementa.
Trabajar con combos es idéntico a las listas, solo que se opera con un solo ítem a la vez, el ejemplo 4 implementa justamente estas acciones en un combo:
function btnEj4Agregar_OnClick() { var ej4Texto = $('#txtEj4Texto'); var ej4Valor = $('#txtEj4Valor'); var newItem = $('<option/>').text(ej4Texto.val()).val(ej4Valor.val()); $("#Ej4Select").append(newItem); } function btnEj4Seleccion_OnClick() { var optionSelected = $('#Ej4Select :selected'); var msg = 'texto: {0}, valor: {1}'.format(optionSelected.text(), optionSelected.val()); $('#Ej4Resultado').html(msg); } function btnEj4RemoverSeleccion_OnClick() { $('#Ej4Select :selected').remove() }
Algo que quizás no he marcado en los otros ejemplos es que al utilizar algo como esto
var optionSelected = $('#Ej4Select :selected');
se debe comprender que se esta asignado a la variable la selección del objeto completo, es por eso que luego se puede acceder a la funcionalidad provista por jquery.
Asignar Selección
En algún momento seguramente se requiera marcar un valor de la lista o combo sin que el usuario realice la acción, sino que será por medio de código, por suerte jquery hace esto muy simple, implementándose de igual forma no importa de que lista se trate.
En los ejemplos 5 y 6, se puede apreciar la implementación:
function btnEj5SeleccionarPorValor_OnClick() { var valor = $('#txtEj5').val(); $('#Ej5Select').val(valor); } function btnEj6SeleccionarPorValor_OnClick() { var valor = $('#txtEj6').val(); $('#Ej6Select').val(valor); }
Si se escribe un valor correcto en el TextBox, solo hará falta asignar el val() al selector del control y eso es todo.
Listas ASP.NET
Hasta ahora hemos estado trabajando en los ejemplos con controles html, pero se debió a que operar con estos o con el control de lista o combo del asp.net es idéntico.
En el ejemplo 7 se podrá apreciar justamente este punto:
function btnEj7Agregar_OnClick() { var ej7Texto = $('#txtEj7Texto'); var ej7Valor = $('#txtEj7Valor'); var newItem = $('<option/>').text(ej7Texto.val()).val(ej7Valor.val()); $('#<%=Ej7Select.ClientID%>').append(newItem); } function btnEj7Seleccion_OnClick() { var list = new Array(); $.each($('#<%=Ej7Select.ClientID%> :selected'), function() { var msg = 'texto: {0}, valor: {1} '.format($(this).text(), $(this).val()); list.push(msg); }); $('#Ej7Resultado').html(list.join('')); } function btnEj7RemoverSeleccion_OnClick() { $.each($('#<%=Ej7Select.ClientID%> :selected'), function() { $(this).remove(); }); }
Aplicar selectores a un control de asp.net solo requiere el uso de la propiedad ClientID, si es que se usa el id del control para acceder al mismo, esto se aplica por si asp.net renombra esta propiedad al realizar el render del html que envía al cliente.
Código de Ejemplo