Computación Web (2023/24)

Práctica 2: JavaScript

Página de compra con jQuery

Una tienda de bicicletas en línea está mejorando su sitio web para que, cuando los clientes estén realizando un pedido de una bicicleta, la aplicación les presente algunos accesorios que pueden añadir a su pedido.

Supón que, cuando el cliente inicia el proceso para pedir la bicicleta, se le presenta la siguiente página web (guárdala y ábrela localmente con un navegador):

<!DOCTYPE html>
<html>
    <head>
    <meta charset="UTF-8">
    <title>Resumen de la compra</title>
    <link rel="stylesheet" href="order.css" type="text/css">
    </head>
    <body>
    <h1>Resumen de la compra</h1>
    <table id="compra">
        <thead>
        <tr>
            <td>Producto</td>
            <td>Unidades</td>
            <td>Precio</td>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>Bicicleta de montaña, talla L</td>
            <td>1</td>
            <td>400.00</td>
        </tr>
        <tr id="total">
            <td>Total:</td>
            <td></td>
            <td id="totalval">400.00</td>
        </tr>
        </tbody>
    </table>
    <h2>Accesorios opcionales</h2>
    <form>
        <select id="accesorios">
        </select>
        <input id="cantidad" type="number" value="1" min="1" max="99">
        <input id="boton" type="button" value="Comprar">
    </form>
    </body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <script src="accesorios.js" type="text/javascript"></script>
    <script src="compra.js" type="text/javascript"></script>
</html>

El documento anterior hace referencia a la hoja de estilos order.css que se muestra a continuación, que también debes guardar en el mismo directorio:

#compra {
    min-width: 500px;
}

#compra thead {
    background-color: black;
    color: white;
    font-weight: bold;
}

#compra td {
    padding-left: 0.5ex;
    padding-right: 0.5ex;
}

#total {
    font-weight: bold;
}

#compra td:nth-child(2),
#compra td:nth-child(3) {
    text-align: right;
}

#cantidad {
    text-align: right;
}

Además, puedes observar que el fichero HTML también hace referencia al final a un par de ficheros JavaScript: accesorios.js y compra.js.

El fichero accesorios.js simplemente contiene la lista de accesorios de la que los clientes pueden elegir. Guárdalo también en el mismo directorio:

/*
 * Lista de accesorios que se pueden comprar.
 *
 */
var accesorios = {
    rf1x1: {
        etiqueta: "Botellín de agua 0,5L",
        precio: 4.0
    },
    rf1x2: {
        etiqueta: "Botellín de agua 0,9L",
        precio: 5.0
    },
    rf2x1: {
        etiqueta: "Faro delantero",
        precio: 15.5
    },
    rf2x2: {
        etiqueta: "Faro trasero",
        precio: 12
    },
    rf2x3: {
        etiqueta: "Pack faros delantero y trasero",
        precio: 23.99
    }
}

Debes implementar el otro fichero, compra.js, que incluirá la funcionalidad necesaria para gestionar cómo se añaden los accesorios al pedido. Puedes comenzar creando un fichero vacío con ese nombre en el mismo directorio que los otros.

Observa también que la página incluye la biblioteca jQuery. Puedes usarla en los ejercicios siguientes.

Carga la página HTML y échale un vistazo. Como verás, todavía no funciona.

El menú de accesorios

El control select con identificador accesorios del documento HTML está, de momento, vacío. Necesitamos programar la funcionalidad en JavaScript para completar este control con una opción por cada accesorio de la lista de accesorios. El objetivo es que tu programa en JavaScript produzca, para el elemento option que por ahora está vacío algo similar a:

<select id="accesorios">
    <option value="rf1x1">Botellín de agua 0,5L (4.00€)</option>
    <option value="rf1x2">Botellín de agua 0,9L (5.00€)</option>
    (...)
</select>

Programa, en el fichero compra.js, la función que itere sobre la lista de accesorios y cree los elementos option mencionados arriba. Registra esa función para que se ejecute cuando el navegador haya cargado el árbol DOM del documento. Ten en cuenta las siguientes pistas:

Comprueba que tu programa funciona recargando la página en el navegador. Todos los accesorios deberían aparecer en el menú desplegable.

Compra de accesorios (primera aproximación)

Cuando el usuario presione el botón Comprar, debe añadirse el accesorio actualmente seleccionado a la tabla de accesorios a comprar. Programa en compra.js una función que tome el accesorio seleccionado en el menú desplegable y cree una nueva fila al fondo de la tabla, inmediatamente antes de la fila que muestra el importe total. Registra la función para que se ejecute cada vez que el usuario presione el botón.

De momento no te preocupes por el número de unidades (asume que se selecciona sólo una) ni actualices el importe total de la compra. Por simplicidad, añade siempre una fila nueva a la tabla, incluso aunque haya ya otras filas para el mismo accesorio en la tabla.

Se proporcionan a continuación algunas pistas:

Compra de accesorios (segunda aproximación)

Mejora la función del apartado anterior para que se tenga en cuenta el número de unidades. La segunda columna debe mostrar el número de unidades seleccionadas y la tercera el precio total de todas las unidades. Además, debes actualizar el precio total de la compra sumando al total anterior el importe de los nuevos accesorios añadidos. Por último, restablece el valor 1 en el control que recoge el número de unidades, para que este sea el número de unidades por defecto si el usuario selecciona algún otro accesorio.

De momento, aunque el accesorio seleccionado esté ya en la tabla, se añade una nueva fila igualmente.

Se proporciona la siguiente pista para resolver este ejercicio:

Compra de accesorios (tercera aproximación)

Mejora la función del apartado anterior para que, si se compra de nuevo un accesorio que ya esté en la tabla, se agreguen las unidades a la fila existente en vez de crear una nueva. Actualiza de forma consistente el precio total de la compra.

Se proporcionan las siguientes pistas para resolver este ejercicio: