========== Javascript ========== Introducción ============ Surgió como una iniciativa de Netscape. **No hay ninguna relación entre Java y Javascript**. Algunas características de Javascript son: * No se convierte en bytecodes, lo interpreta el navegador * Está estandarizado aunque no todos los navegadores se ciñen al 100% al estándar. El nombre del estándar es "ECMAScript" * No está orientado a objetos, sino que está basado en objetos. * Es de tipado débil: esto significa que podemos cambiar una variable de tipo sin problemas, el intérprete intentará hacer las conversiones correctas. Tipos de datos ============== Javascript acepta los siguientes tipos de datos: * Números. * Cadenas * Booleanos (lógicos) * undefined: se utiliza cuando intentamos acceder a una variable que no contiene nada porque no se ha creado. * null: se utiliza habitualmente para indicar algo vacío. El uso de ``use strict`` -------------------------------------------------------------------------------- Tradicionalmente Javascript permitía acceder a variables sin definir, lo que causaba infinidad de problemas. Si deseamos que Javascript sea más **estricto** en como se usa el lenguaje podemos incluir al principio de nuestros programas en Javascript la cadena "use strict". Constantes y variables ================================================================================ Podemos definir *constantes*, que son etiquetas que tienen dentro un valor que no cambia y *variables* que son etiquetas cuyo valor no cambia: .. code:: javascript "use strict" const gravedad =9.81; let posicion =42; ¡Cuidado!, durante mucho tiempo, en lugar de ``let`` se usaba ``var`` pero el sistema de asignación de variables se modificó hace tiempo y el uso de ``var`` en general se considera **obsoleto.** Concatenación de cadenas ================================================================================ Tradicionalmente en Javascript las cadenas se han concatenado de la misma manera que en otros lenguajes: .. code-block:: javascript "use strict" let nombre = "Carmen"; let ap1 = "Diaz"; let ap2 = "Sanchez"; //Unimos todo... let nombreCompleto=nombre+ " " + ap1 + " " + ap2; Con ES6 se introdujeron las "plantillas" que permiten unir cadenas más cómodamente. .. code-block:: javascript "use strict" let nombre = "Carmen"; let ap1 = "Diaz"; let ap2 = "Sanchez"; //Ahora usamos una plantilla para unir... let nombreCompleto=``; .. warning:: Estas plantillas usan la "coma invertida", la que está a la derecha de la ``p`` en el teclado Incrustando Javascript ====================== Javascript se inserta en HTML con la etiqueta `` **El orden es importante** La función $ ------------ La función $ selecciona elementos de la página para que podamos hacer cosas con ellos. Es la función más utilizada de JQuery y veremos que podemos pedir que nos seleccione grupos de cosas de forma muy sencilla. La función $ devuelve siempre objetos. Los atributos y métodos de esos objetos los iremos aprendiendo poco a poco. En general, antes de poder procesar un elemento, deberemos seleccionarlo utilizando los mismos selectores que en CSS. Gestión de eventos ------------------ Utilizando ``click`` podemos indicar a la biblioteca que queremos que cuando alguien haga click en un elemento se ejecute una cierta función. El siguiente código HTML y JS ilustra una posibilidad .. code-block:: html Ejemplos
Texto texto texto
El código Javascript asociado al HTML anterior es este. .. code-block:: javascript /* Esperaremos hasta que el documento esté cargado y listo * para ser procesado por nuestro programa*/ let obj_documento = $(document) /* Cuando esté cargado ejecutaremos la función cuyo nombre aparezca aquí*/ obj_documento.ready(inicio) //* Error gravísimo*/ //obj_documento.ready( inicio() ) function inicio(){ let obj_izq=$("#botonizq") obj_izq.click ( fn_click_izq ) let obj_der=$("#botonder") obj_der.click ( fn_click_der ) } function fn_click_izq(){ let obj_div=$("#texto") obj_div.fadeOut() } function fn_click_der(){ let obj_div=$("#texto") obj_div.fadeIn() } Solución HTML (párrafos) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: html

Soy un párrafo impar

Soy un párrafo par

Soy un párrafo impar

Soy un párrafo par

Soy un párrafo impar

Soy un párrafo par

Solución Javascript (párrafos) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: javascript $(document).ready(main) function mostrar_pares(){ let objetos=$(".p_par") objetos.slideDown() } function mostrar_impares(){ let objetos=$(".p_impar") objetos.slideDown() } function ocultar_pares(){ let objetos=$(".p_par") objetos.slideUp() } function ocultar_impares(){ let objetos=$(".p_impar") objetos.slideUp() } function main(){ $("#mostrar_pares").click(mostrar_pares) $("#mostrar_impares").click(mostrar_impares) $("#ocultar_pares").click(ocultar_pares) $("#ocultar_impares").click(ocultar_impares) } Existen diversos eventos aunque los más utilizados son: * ``click`` * ``dblclick`` * ``mouseover`` Ejercicio ------------------------------------------------------ Crear un programa que tenga varios párrafos con 4 botones que permitan que cuando se haga click en ellos ocurran distintas cosas * Habrá un botón con el texto "Ocultar pares". Cuando se hace click en él se ocultan los párrafos pares. * Habrá un botón con el texto "Ocultar impares". Cuando se hace click en él se ocultan los párrafos impares. * Habrá un botón con el texto "Mostrar pares". Cuando se hace click en él se muestran los párrafos pares (que tal vez estaban ocultos). * Habrá un botón con el texto "Mostrar impares". Cuando se hace click en él se muestran los párrafos impares (que tal vez estaban ocultos). Ejercicio --------- Crear una página en la que hay un div con texto y al pasar el ratón por encima de ella, la caja cambia de color. Antes de poder resolver este ejercicio, hay que echar un vistazo a varias posibilidades de JQuery. Procesado de atributos ====================== En JQuery sabemos que podemos procesar elementos utilizando su ``id`` con cosas como esta: .. code-block:: javascript var objeto=$("#identificador1") objeto.metodo( ... ) Una de las cosas que se puede hacer es leer y escribir diversos atributos de los objetos. Además, se pueden leer propiedades especiales como comprobar si un radio o un checkbox están en el estado ``checked``. Supongamos este formulario: .. code-block:: html
Hombre
Mujer

Autobús
Coche
Moto
Bici
Tren
Podemos usar el método ``val`` para cambiar el valor de un objeto cualquiera: .. code-block:: javascript function inicio(){ let opc_h=$("#opc_h") opc_h.click ( click_hombre ) let opc_m=$("#opc_m") opc_m.click ( click_mujer ) } function click_hombre() { let cuadro_texto=$("#informe") cuadro_texto.val("Bienvenido Sr.") } function click_mujer(){ let cuadro_texto=$("#informe") cuadro_texto.val("Bienvenido Sra/Srta.") } Por ejemplo, en los checkboxes y en los radios, podemos comprobar si uno de ellos está marcado comprobando la propiedad "checked" con el método ``prop``. Supongamos que deseamos saber cuantos checkboxes se marcan. Si se marcan cero, una o dos, mostraremos el texto "poca variedad", si se marcan tres mostraremos "cierta variedad" y si se marcan cuatro o cinco, mostraremos "mucha variedad". Aquí hay dos posibles soluciones, siendo una de ellas más corta y flexible que la otra. La primera: .. code-block:: javascript let opc_coche=$("#coche") opc_coche.click ( cuantas_pulsadas ) let opc_moto=$("#moto") opc_moto.click ( cuantas_pulsadas ) let opc_bici=$("#bici") opc_bici.click ( cuantas_pulsadas ) let opc_bus=$("#bus") opc_bus.click ( cuantas_pulsadas ) let opc_tren=$("#tren") opc_tren.click ( cuantas_pulsadas ) function cuantas_pulsadas(){ //Aquí contaríamos cuantas tienen la propiedad checked } El segundo implica que todos los controles tengan el mismo atributo ``class``. Ahora la solución tendría un HTML como este: .. code-block:: html Autobús
Coche
Moto
Bici
Tren
Y el JS sería así: .. code-block:: javascript let medios_de_locomocion=$(".medio") medios_de_locomocion.click ( cuantas_pulsadas ) function cuantas_pulsadas(){ let cuantas_marcadas=0 let vector_ids=["#bus", "#coche", "#moto", "#bici", "#tren"] for (let pos in vector_ids){ var objeto = $( vector_ids[pos] ) if (objeto.prop("checked")) { cuantas_marcadas=cuantas_marcadas+1 } } if ((cuantas_marcadas>=0 ) && (cuantas_marcadas<=2)){ alert ("Poca variedad") } if (cuantas_marcadas==3) { alert ("Variedad media") } if (cuantas_marcadas>=4){ alert ("Mucha variedad") } } Ejercicio: recuento de medios de locomoción ------------------------------------------------------ Crear un programa que permita al usuario indicar cinco posibles medios de locomoción (usar checkboxes), a saber:coche, moto, bus, tren y avión. El programa debe contabilizar cuantos se usan en informar del número de medios usados en un textbox. Solución: recuento de medios (HTML) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: html
Solución: recuento de medios (JS) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Variante 1: Sin vectores, implica usar muchos ``if``. Aunque funcione supone cortar y pegar, que aunque en este caso no sea un trabajo muy grande nos obliga a adoptar malos hábitos .. code-block:: javascript $(document).ready(main) function contar(){ let contador=0 if ($("#coche").prop("checked")) { contador=contador+1 } if ($("#moto").prop("checked")) { contador=contador+1 } let mensaje="Medios:"+contador $("#informe").val(mensaje) } function main(){ $("#coche").click(contar) $("#moto").click(contar) $("#bus").click(contar) $("#tren").click(contar) $("#avion").click(contar) } Variante 2: Con vectores .. code-block:: javascript $(document).ready(main) function contar(){ let contador=0 let ids=new Array() let ids=["#coche", "#moto", "#bus", "#tren", "#avion"] for (let pos in ids){ let medio=$(ids[pos]) if (medio.prop("checked")) { contador=contador+1 } } let mensaje="Medios:"+contador $("#informe").val(mensaje) } function main(){ $("#coche").click(contar) $("#moto").click(contar) $("#bus").click(contar) $("#tren").click(contar) $("#avion").click(contar) } Ejercicio configurador ------------------------------------------------------ Se desea tener una aplicación que permita configurar un equipo al gusto del usuario: * Se debe elegir entre un procesador Intel o AMD. El primero cuesta 250 euros y el segundo 230. * Se debe elegir entre 2, 4 y 8 GB de memoria. El coste es respectivamente 90, 145, 210 * Hay extras que se pueden elegir o no, ya que son completamente optativos (es decir, usar checkboxes). En concreto se puede tener un grabador de Blu-ray (190 euros), tarjeta gráfica aceleradora (430 euros) y un monitor LED (185 euros). Solución HTML configurador ------------------------------------------------------ .. code-block:: html Solución JS configurador ------------------------------------------------------ .. code-block:: javascript $(document).ready(main) function calcular_precio(){ var precio=0 if ($("#intel").prop("checked")) { precio=precio+250 } if ($("#amd").prop("checked")) { precio=precio+210 } if ($("#2gb").prop("checked")) { precio=precio+90 } if ($("#4gb").prop("checked")) { precio=precio+140 } if ($("#8gb").prop("checked")) { precio=precio+210 } if ($("#bluray").prop("checked")) { precio=precio+190 } if ($("#aceleradora").prop("checked")) { precio=precio+430 } if ($("#monitor").prop("checked")) { precio=precio+185 } $("#total").val(precio) } function main(){ $("#intel").click (calcular_precio) $("#amd").click (calcular_precio) $("#2gb").click (calcular_precio) $("#4gb").click (calcular_precio) $("#8gb").click (calcular_precio) $("#bluray").click (calcular_precio) $("#monitor").click (calcular_precio) $("#aceleradora").click (calcular_precio) } Ejercicio configurador de PCs ampliado ------------------------------------------------------ En el ejercicio anterior ocurre que por un problema hardware no es posible tener procesadores AMD con aceleradora, por lo que cuando se marque un AMD se debe desactivar el checkbox de la aceleradora y si hubiera una marca, también se debe desactivar y por supuesto recalcular el precio. Configurador de coches =================================================== Un fabricante de automóviles desea ofrecer a sus clientes una aplicación que les permita configurar sus vehículos según sus preferencias y ver el precio final del coche. Los precios y las restricciones son los siguientes: * Se pueden tener dos tipos de motor: gasolina (precio base 7000 euros) y diésel (precio base 8200). * Se pueden tener 3 potencias: 1100, 1800 y 2300 centímetros cúbicos. Los precios de cada uno son 800, 1900 y 2500. Sin embargo **no es posible fabricar motores diésel de 2300**. * Hay dos tipos de pintura: normal y metalizada. Los precios respectivos son 750 y 1580 euros. * Hay seis colores: negro, blanco, rojo, azul polar, verde turquesa y gris marengo. **No se pueden fabricar colores de pintura normal de ninguno de los tres últimos colores**. * Se dispone de diversos extras: alerón deportivo (190 euros **pero solo se puede elegir si se elige pintura metalizada**), radio-CD con MP3 (230 euros más), altavoces traseros (320 euros más, **pero solo si se elige antes el Radio-CD**), y GPS incorporado (520 euros más). Crear la aplicación que respete las restricciones exigidas por el cliente. HTML del configurador ---------------------- .. code-block:: html
Tipo de motor
Gasolina
Diésel

Cubicaje
1100m3
1800m3
2300m3

Pinturas
Normal
Metaliz.

Colores
Negro Blanco Rojo
Azul polar Verde Gris
Extras
Alerón radiocd Altavoces GPS
JS del configurador (sin JQuery) ----------------------------------------- .. code-block:: javascript function esta_checked(identificador){ let control; control= document.getElementById( identificador); if (control.checked){ return true; } return false; } function hay_errores(){ let error=false; /* Si detectamos un error ponemos error a true*/ if (esta_checked("diesel") && (esta_checked("2300"))){ alert("Imposible diesel de 2300, por favor modifique sus opciones."); error=true; } if (esta_checked("normal") && (esta_checked("azulpolar"))){ alert("Imposible normal+azul"); error=true; } if (esta_checked("normal") && (esta_checked("gris"))){ alert("Imposible normal+gris"); error=true; } if (esta_checked("normal") && (esta_checked("verde"))){ alert("Imposible normal+verde"); error=true; } if (esta_checked("normal") && (esta_checked("aleron"))){ alert("Imposible normal+aleron. Elija pintura metalizada"); error=true; } /*Cuidado, aquí comprobamos si el altavoz está marcado pero sin haber marcado el radioCD*/ if (esta_checked("altavoces") && (!esta_checked("radiocd"))){ alert("No puede pedir altavoces sin pedir el RadioCD"); error=true; } return error; } function calcular(){ let precio=0; if (hay_errores()){ return false; } /* Si llegamos aquí es que no hay errores y el precio se puede calcular*/ if (esta_checked("gasolina")){ precio=precio+7000; } if (esta_checked("diesel")){ precio=precio+8200; } if (esta_checked("1100")){ precio=precio+800; } if (esta_checked("1800")){ precio=precio+1900; } if (esta_checked("2300")){ precio=precio+2500; } if (esta_checked("normal")){ precio=precio+750; } if (esta_checked("metalizada")){ precio=precio+1580; } /*Obsérvese que el precio no ha cambiado dependiendo del color*/ if (esta_checked("aleron")){ precio=precio+190; } if (esta_checked("radiocd")){ precio=precio+230; } if (esta_checked("altavoces")){ precio=precio+320; } if (esta_checked("gps")){ precio=precio+520; } alert("Su precio es:"+precio); } Dinamismo con Google Maps ========================= Google Maps ofrece un servicio de mapas con una limitación de 25.000 peticiones diarias. El código básico sería así: HTML de GMaps ------------- .. code-block:: html Plantilla JQuery

Javascript con mapas

Introduzca latitud:
Introduzca longitud:

Calculador de distancias desde CR a otras ciudades
Javascript de GMaps ------------------- .. code-block:: javascript var latitud=38.59 var longitud=-3.55 var mi_nivel_de_zoom=8 var obj_mapa function inicio(){ var div_mapa=document.getElementById("mapa") var obj_coordenadas=new google.maps.LatLng(latitud,longitud) var obj_opciones={ center:obj_coordenadas, zoom:mi_nivel_de_zoom } obj_mapa=new google.maps.Map(div_mapa, obj_opciones) $("#mover").click (mover_el_mapa) } function mover_el_mapa() { var obj_latitud=$("#latitud") var valor_latitud=obj_latitud.val() var valor_longitud=$("#longitud").val() var nuevas_coordenadas=new google.maps.LatLng( valor_latitud, valor_longitud) obj_mapa.panTo(nuevas_coordenadas) } Ejercicio --------- Ampliar el programa con una lista de ciudades del mundo. Cuando el usuario elija una de ellas, nuestro programa nos dirá la distancia desde Ciudad Real a dichas ciudades. Considerar las siguientes coordenadas en formato (latitud, longitud): * Ciudad Real: (38.59, -3.55) * Nueva York: (40.73, -73.87) * Sidney: (-33.90, 151.13) * Berlin: (52.31, 13.39) * París: (48.85, 2.35) Para poder conseguir esto, hay que modificar la URL de carga de GoogleMaps para solicitar que se cargue una biblioteca que nos ayudará a resolver este punto. En concreto, ahora pasaremos un parámetro ``libraries`` con el valor ``geometry`` que nos permitirá utilizar la biblioteca en concreto. Ahora el HTML es así: .. code-block:: html Ahora una función que nos calcula la distancia sería algo como esto: .. code-block:: javascript /* Nos da la distancia en metros entre CR * y el punto (latitud_destino,longitud_destino) * (abreviados lat_dest y lng_dest)*/ function distancia(lat_dest, lng_dest) { let latitud_cr=38.59 let longitud_cr=-3.55 let coords_origen=new google.maps.LatLng( latitud_cr, longitud_cr) let coords_destino=new google.maps.LatLng( lat_dest, lng_dest) let distancia=google.maps.geometry.spherical.computeDistanceBetween( coords_origen, coords_destino ) return distancia } Ejercicio --------- La empresa Automobile Creation for Millenium Enterprise (ACME) planea lanzar una página web en la que se permita al usuario configurar los coches a su medida, ofreciendo las distintas opciones en pantalla para que el usuario las elija. Sin embargo no todas las combinaciones se permiten en fábrica por lo que deberán tenerse en cuentas las siguientes Especificaciones ~~~~~~~~~~~~~~~~ * Hay dos motores: gasolina (5000) y diésel (6800) * Hay dos carrocerías: monovolumen (4500) y berlina (3700) * Hay tres accesorios: radio-cd con MP3 (180), alerones deportivos (220) y llantas de aleación (200) Por diversos problemas, no es posible combinar las siguientes opciones: * No se pueden tener berlinas de gasolina. * No se puede integrar el alerón en los monovolúmenes. * No se puede poner el radio-cd a los monovolúmenes. Cuando se marque cualquiera de estas opciones, hay que limpiar todo el configurados y avisar de que no se puede hacer eso. No se pueden usar ``alerts`` .. code-block:: javascript let vector_ids=["#gasolina", "#diesel", "#monovolumen", "#berlina", "#radiocd", "#alerones", "#llantas"] let precios=[5000, 6800, 4500, 3700, 180, 220, 200] function inicio(){ for (let pos in vector_ids){ let el_id=vector_ids[pos] $(el_id).click ( calcularPrecio ) } } function cocheEsFabricable() { //Caso 1: nada de berlinas de gasolina let marcada_la_berlina=$("#berlina").prop("checked") let marcada_la_gasolina=$("#gasolina").prop("checked") if (marcada_la_berlina && marcada_la_gasolina) { alert ("No se pueden fabricar berlinas de gasolina") return false } let marcado_aleron=$("#alerones").prop("checked") let marcado_monovolumen=$("#monovolumen").prop("checked") if (marcado_aleron && marcado_monovolumen ) { alert ("No podemos integrar los alerones en monovolúmenes") return false } let marcado_radiocd=$("#radiocd").prop("checked") if (marcado_radiocd && marcado_monovolumen) { alert ("No podemos fabricar un monovol. con radio-cd") return false } return true } /* Calcula el precio del coche en función de lo que esté marcado * y lo que no.*/ function calcularPrecio() { let todo_bien=cocheEsFabricable() if (todo_bien!=true) { return } let precioCoche=0 for (var pos in vector_ids){ let el_id=vector_ids[pos] if ($(el_id).prop("checked")) { let precio_accesorio=precios[pos] precioCoche=precioCoche+precio_accesorio } } alert ("El precio es:"+precioCoche) } Ampliación ---------- Se desea que el usuario puede elegir entre los siguientes colores con los siguientes precios: * Blanco: 700 euros * Rojo, Verde y Azul básicos: 950 * Gris, Negro y Naranja: 1400 euros por ser colores metalizados Además, se desea ver una muestra de color en algún punto de la página. Para lograrlo se necesitará utilizar un método que proporciona JQuery y que se llama ``addClass`` Solución HTML ~~~~~~~~~~~~~ .. code-block:: html

Motores

Motor Gasolina
Motor Diésel

Carrocerías

Monovolumen
Berlina

Accesorios

Radio-CD
Alerones
Llantas

Colores

Blanco
Rojo
Gris

Muestra de color Observe y compare

Solución JS ~~~~~~~~~~~~ Añadiremos este código a nuestro programa anterior. .. code-block:: javascript let obj_documento = $(document) obj_documento.ready(inicio) let vector_ids=["#gasolina", "#diesel", "#monovolumen", "#berlina", "#radiocd", "#alerones", "#llantas"] let precios=[5000, 6800, 4500, 3700, 180, 220, 200] function inicio(){ for (let pos in vector_ids){ let el_id=vector_ids[pos] $(el_id).click ( calcularPrecio ) } $("#blanco").click ( ponerColorBlanco ) $("#rojo").click ( ponerColorRojo ) $("#gris").click (ponerGris ) } function limpiarColores(){ let clases=["muestrarojo", "muestrablanco", "muestragris"] for (let pos in clases) { $("#muestra").removeClass( clases[pos] ) } } function ponerGris() { limpiarColores() $("#muestra").addClass("muestragris") } function ponerColorRojo(){ limpiarColores() $("#muestra").addClass ("muestrarojo") } function ponerColorBlanco(){ limpiarColores() $("#muestra").addClass ("muestrablanco") } Otro configurador de coches ============================== Sin utilizar JQuery se desea crear un configurador de coches en JS que responda a las siguientes premisas: * Hay dos modelos a elegir: el modelo A cuesta 7000 euros y el modelo B cuesta 9000. * Se pueden elegir dos tipos de motor. El motor de gasolina cuesta 2000 y el diésel 5000 euros. * Se pueden elegir 0, 1, muchos o todos los extras siguientes: Pintura metalizada por 1000 euros más, pack de sonido por 500 euros más y pack de seguridad por 1000 euros más Configurador en HTML -------------------- .. code-block:: html

Elija un modelo

Modelo A
Modelo B

Elija un tipo de motor

Gasolina
Diésel

Elija extras

Pintura metalizada
Extra sonido
Extra seguridad
Configurador en JS -------------------- .. code-block:: javascript function esta_checked(id){ let control; control=document.getElementById(id); if (control.checked){ return true; } else { return false; } } function calcular(){ let preciototal =0; let preciomodelo =0; let preciomotor =0; let precioextras = 0; if ( (!esta_checked("modelo_a")) && (!esta_checked("modelo_b") ) ){ alert("Debe marcar un modelo"); return ; } if (esta_checked("modelo_a")){ preciomodelo=7000; } if (esta_checked("modelo_b")){ preciomodelo=9000; } if (esta_checked("gasolina")){ preciomotor=2000; } if (esta_checked("diesel")){ preciomotor=4000; } if (esta_checked("metalizada")){ precioextras=1000; } if (esta_checked("sonido")){ precioextras=precioextras+500; } if (esta_checked("seguridad")){ precioextras=precioextras+1000; } preciototal=preciomodelo+preciomotor+precioextras; let zonaresultados; zonaresultados=document.getElementById( "zonaresultados"); zonaresultados.innerHTML="Precio:"+preciototal; } Calculo de impuestos ======================= Se desea crear una pequeña aplicación web que permita calcular los impuestos que se deben pagar a partir de unos datos, en concreto: * Se debe introducir el salario anual en un campo de tipo ``number``. * Hay dos radios que permiten indicar si el contribuyente tiene hijos o no. * Hay dos checkboxes que permiten saber si el contribuyente tiene derecho a algunas modificaciones llamadas B1 y B2. Las reglas para el calculo son: * Si el salario es menor de 20000 los impuestos son 0. * Si el salario está entre 20001 y 30000 los impuestos son el 10%. * Si el salario está entre 30001 y 50000 los impuestos son el 20%. * Si el salario es mayor de 50000 se paga el 38% * Si se tienen hijos los impuestos se reducen en 180 euros. * Si se tiene la bonificación B1 los impuestos se reducen en 355 euros. * Si se tiene la bonificación B2 los impuestos se reducen en 560 euros. * Se recuerda que las bonificaciones B1 y B2 son compatibles (de hecho hemos dicho que están en checkboxes). * La cantidad de impuestos puede ser negativa (que significa que le sale "a devolver") HTML calculador --------------- .. literalinclude:: ejercicios/js/calculo_impuestos_con_jquery/index.html :language: html JS Calculador (con JQuery (DAM)) ---------------------------------- .. literalinclude:: ejercicios/js/calculo_impuestos_con_jquery/js/programa.js :language: javascript JS Calculador (sin JQuery (ASIR)) ---------------------------------- .. literalinclude:: ejercicios/js/calculo_impuestos_sin_jquery/js/programa.js :language: javascript Comparador de telefonía =========================== Se desea crear una aplicación que permita al usuario saber qué compañía de telefonía le conviene más partiendo de los siguientes datos * La empresa A ofrece una tarifa que cuesta 20 euros al mes con los 1000 primeros minutos gratis y despues cada minuto cuesta 8 céntimos. * La empresa B ofrece una tarifa que cuesta 10 euros al mes con los 500 primeros minutos gratis y despues cada llamada cuesta 12 céntimos. Hacer una aplicación que permita al usuario introducir la cantidad de minutos que llamará para tres meses distintos que llamaremos "Mes 1", "Mes 2" y "Mes 3" y que le diga qué compañía le interesa más. HTML del comparador ----------------------- .. code-block:: html
Mes 1
Mes 2
Mes 3
JS del comparador -------------------- .. code-block:: javascript function extraer_numero(id){ let control; control=document.getElementById(id); let valor=control.value; let numero=parseInt(valor); return numero; } function precio_mes_empresa_a(minutos){ //Primero vemos si se pasa if (minutos<1000){ //Si no se pasa, el precio es 20 return 20; } //Si llegamos a este punto, es porque se pasa //Calculamos cuantos minutos se pasa let exceso=minutos-1000; //Y ese exceso es a 8 centimos/minutos let precio_exceso=exceso*0.08; //El precio de ese mes es //20 euros más lo que cueste el exceso let precio_mes=20+precio_exceso; //Devolvemos el calculo a quien lo pidiese return precio_mes; } function precio_mes_empresa_b(minutos){ //Primero vemos si se pasa if (minutos<500){ //Si no se pasa, el precio es 10 return 10; } //Si llegamos a este punto, es porque se pasa //Calculamos cuantos minutos se pasa let exceso=minutos-500; //Y ese exceso es a 12 centimos/minutos let precio_exceso=exceso*0.12; //El precio de ese mes es //10 euros más lo que cueste el exceso let precio_mes=10+precio_exceso; //Devolvemos el calculo a quien lo pidiese return precio_mes; } function calcular(){ let minutos_mes1; minutos_mes1=extraer_numero("mes1"); let minutos_mes2; minutos_mes2=extraer_numero("mes2"); let minutos_mes3; minutos_mes3=extraer_numero("mes3"); let coste_mes1_empresa_a; coste_mes1_empresa_a=precio_mes_empresa_a( minutos_mes1); coste_mes2_empresa_a=precio_mes_empresa_a( minutos_mes2); coste_mes3_empresa_a=precio_mes_empresa_a( minutos_mes3); //Calculamos el precio que costaria //esos minutos en la empresa A let coste_total_a; coste_total_a=coste_mes1_empresa_a+coste_mes2_empresa_a+coste_mes3_empresa_a; //Repetimos el proceso para la empresa B let coste_mes1_empresa_b; coste_mes1_empresa_b=precio_mes_empresa_b( minutos_mes1); coste_mes2_empresa_b=precio_mes_empresa_b( minutos_mes2); coste_mes3_empresa_b=precio_mes_empresa_b( minutos_mes3); //Calculamos ahora el precio que costaria //esos minutos en la empresa B let coste_total_b; coste_total_b=coste_mes1_empresa_b+coste_mes2_empresa_b+coste_mes3_empresa_b; let zonaresultados; zonaresultados=document.getElementById("zonaresultados"); let texto; texto="Con la A el precio es:" + coste_total_a; texto=texto+"
"; texto=texto+"Con la B el precio es:" + coste_total_b; zonaresultados.innerHTML=texto } Calculadora en Javascript ================================================================================ Se desea crear una calculadora en Javascript que tenga el siguiente interfaz .. figure:: ejemplos/tema4_js/calculadora/interfazcalculadora.png :scale: 50% :align: center :alt: Ejemplo de interfaz Ejemplo de interfaz de la calculadora en JS El usuario puede insertar números usando decimales hasta las centésimas y podrá seleccionar el cálculo que quiere hacer usando los elementos ``radio`` . El resultado deberá aparecer en algún elemento ``div`` sin utilizar por tanto elementos alert ni distraer la atención del usuario. Interfaz HTML para la calculadora -------------------------------------------------------------------------------- En el fichero siguiente se muestra un ejemplo de interfaz .. literalinclude:: ejemplos/tema4_js/calculadora/calculadora.html :language: html Programa JS para la calculadora -------------------------------------------------------------------------------- El siguiente fichero muestra una posible solucion: .. literalinclude:: ejemplos/tema4_js/calculadora/calculadora.js :language: javascript Póliza de seguros ================================================================================ Se pide crear una aplicación para el cálculo de una póliza de seguros en base a distintas situaciones. * El precio base es 175 euros. * El usuario puede tener el carnet menos de 6 años. En ese caso el precio se incrementa en 280 euros. * El usuario puede tener el carnet 6 años o más. En ese caso la póliza se reduce en 25 euros. * En una lista desplegable se puede elegir el tipo de vehículo: * Familiar: el precio no se modifica. * Comercial: el precio se incrementa en 165 euros. * Deportivo: el precio se incrementa en 280 euros. * Por último hay dos checkboxes para marcar distintas situaciones: * Si se tienen hijos a cargo el precio se reduce en un 5%. * Si se tienen padres a cargo el precio se reduce en un 3% * Se pueden marcar ninguna, una de ellas o las dos. Interfaz de la póliza de seguros -------------------------------------------------------------------------------- Debería quedar algo así: .. figure:: ejemplos/tema4_js/polizaseguros/polizaseguros.png :scale: 50% :align: center :alt: Ejemplo de interfaz de la póliza Ejemplo de interfaz de la póliza en JS .. literalinclude:: ejemplos/tema4_js/polizaseguros/polizaseguros.html :language: html JS de la póliza de seguros -------------------------------------------------------------------------------- .. literalinclude:: ejemplos/tema4_js/polizaseguros/polizaseguros.js :language: javascript Matrícula ================================================================================ Un centro de estudios desea ofrecer a sus alumnos la posibilidad de cursar algunas materias de forma flexible. * El usuario puede cursar las horas semanales que desee. Cada hora de clase cuesta 5 euros al mes. * Un usuario puede ser antiguo alumno. En ese caso se le hace un descuento del 12% sobre el precio final. * El usuario puede elegir las materias que desee: en concreto puede elegir de primero las asignaturas de "Matemáticas I" e "Historia" y de segundo "Matemáticas II" y "Física". * Está permitido matricularse de "Matemáticas I" y de "Matemáticas II" a la vez pero **no está permitido elegir "Matemáticas II" sin elegir "Matemáticas I"** . Si se hace esto **no debe verse el precio, sino alguna clase de mensaje de error** * El precio final mensual debe aparecer en un ``div`` . Interfaz de la matrícula -------------------------------------------------------------------------------- El resultado debe ser similar a esto: .. figure:: ejemplos/tema4_js/matricula/matricula.png :scale: 50% :align: center :alt: Ejemplo de interfaz de la matrícula Ejemplo de interfaz de la matrícula .. literalinclude:: ejemplos/tema4_js/matricula/matricula.html :language: html JS de la matrícula -------------------------------------------------------------------------------- .. literalinclude:: ejemplos/tema4_js/matricula/matricula.js :language: javascript