Duda pequeño ejercicio javascript!

Kissler

A ver si me podeis echar una manita con esto que estoy algo perdido.

Tengo este ejercicio :

<html>
<head>
<title>Exemple crides</title>

<script type="text/javascript">
var producte = "";
var marca = "";
var unitats = "";
var carret = new Array(); //array donde se almacenan los productos
var i=0; //indice del array


function compra() { 

do {
   
   validar(unitats)
   	   producte = prompt ("Introduix el nom del producte","");
    	   
   if  ( producte.toLowerCase() != "fi" )
    marca = prompt ("Introdueix la marca que vols", ""); //toLowerCase sirve para convertir el string a minusculas
   if  ( producte.toLowerCase() != "fi" && marca.toLowerCase() != "fi" ) 
   unitats = prompt( "introdueix la quantitat que vols","");
   if ( producte.toLowerCase() != "fi" && marca.toLowerCase() != "fi" && unitats.toLowerCase() != "fi" )
    {
	
		carret[i] = producte + ', ' + marca + ', ' + unitats; 
		if (isNaN(unitats)) continue;
		else 
		i++; //aumentamos el indice del array
	}
   
	
}while ( producte.toLowerCase() != "fi" && marca.toLowerCase() != "fi" && unitats.toLowerCase() != "fi") 

mostraCarret(); //funció mostrem els valors del carret
   
} function validar (unitats) {
if (isNaN(unitats)) alert("Has de usar per unitats nomes nombres, repetix de nou !") } function mostraCarret() { document.write("Contigunt del carret: <br />"); for ( var z = 0; z < i; z++ ) { document.write(carret[z]+"<br />"); } } </script> </head> <body bgcolor="#FFFFFF" text="#000000"> <p>Pitja el boto per començar la compra: <input type="button" name="boto1" value="Llista Compra" onClick="javaScript:compra()"> </body> </html>

Tenia que añadirle una funcion que en el apartado unitats (unidades)solo me dejara meter numeros, lo he hecho de la manera que veis, ademas me piden que en los dos primeros campos (producte,marca) no pueda usar signos raros (&%$?¿!¡š _) . Como lo implementarias?

Gracias

tirano

Si utilizas la etiqueta code mejor que mejor

1 respuesta
Kissler

#2 desconocia que existiera, gracias!

elkaoD

#1 Regular Expressions.

1 1 respuesta
Kissler

#4 que es eso? Puedes explicar? este es mi 1º curso y puesto que me saltado la primera assignatura de programacion por convalidacion (hace años no me acuerdo nada) en esta que es para web, voy perdidissimo.

Gracias

1 respuesta
B

#5: Pues eso, expresiones regulares. Busca por wikipedia y demás. Una vez que sepas cómo es la ER que necesitas, solo tienes que buscar cómo decirle a Javascript que compruebe eso.

Un saludo.

Kissler

hice esto

<html>
<head>
<title>Exemple crides</title>

<script type="text/javascript">
var producte = "";
var marca = "";
var unitats = "";
var carret = new Array(); //array donde se almacenan los productos
var i=0; //indice del array


function compra() { 

do {
   
   valida (producte);   
   if  ( producte.toLowerCase() != "fi" )
    marca = prompt ("Introdueix la marca que vols", ""); //toLowerCase sirve para convertir el string a minusculas
   if  ( producte.toLowerCase() != "fi" && marca.toLowerCase() != "fi" ) 
   unitats = prompt( "introdueix la quantitat que vols","");
   if ( producte.toLowerCase() != "fi" && marca.toLowerCase() != "fi" && unitats.toLowerCase() != "fi" )
    {
	
		carret[i] = producte + ', ' + marca + ', ' + unitats; 
		if (isNaN(unitats) ) continue;
		
		else 
		i++; //aumentamos el indice del array
	}
   
	
}while ( producte.toLowerCase() != "fi" && marca.toLowerCase() != "fi" && unitats.toLowerCase() != "fi") 

mostraCarret(); //funció mostrem els valors del carret
   
} function valida(producte) { var RegExPattern = [a-z][0-9]; do { producte = prompt ("Introduix el nom del producte",""); if (producte.match(RegExPattern) = null) alert("Posa ve el nom nanu") } while (producte.match(RegExPattern) = null)
} function validar (unitats) {
if (isNaN(unitats)) alert("Has de usar per unitats nomes nombres, repetix de nou !") } function mostraCarret() { document.write("Contigunt del carret: <br />"); for ( var z = 0; z < i; z++ ) { document.write(carret[z]+"<br />"); } } </script> </head> <body bgcolor="#FFFFFF" text="#000000"> <p>Pitja el boto per començar la compra: <input type="button" name="boto1" value="Llista Compra" onClick="javaScript:compra()"> </body> </html>

Pero nose porque no puedo ni probarlo.. le doy al boton y no hace nada.. alguien sabe ver donde la he cagado? Gracias

EnZo

var RegExPattern = /[a-z][0-9]/;

Aunque la regexp está mal formada para lo que necesitas.

1 respuesta
Kissler

como seria #8 ? Gracias!

1 respuesta
Khanser

#9 http://www.w3schools.com/jsref/jsref_obj_regexp.asp http://regexpal.com/ http://www.regular-expressions.info/reference.html

2 respuestas
Kissler

#10 Gracias pero tengo que ser gilipollas no lo entiendo jeje

1 respuesta
Kissler

#10 sino te es mucha molestia podrias explicarme a modo para tontos como aplicarlo a mi ejercicio?

Gracias

1 respuesta
tOWERR

Comentarios en castellano y los textos de los prompt en catalá.

spoiler
Khanser

#11 te lo pongo más fácil porque lo que es hacértelo, no te lo va a hacer nadie, ayudarte en cambio, todo lo que necesites.

Api javascript para ER: http://www.w3schools.com/jsref/jsref_obj_regexp.asp
Web para probar ER: http://regexpal.com/
Información sobre ER: http://www.regular-expressions.info/reference.html

*ER : Expresión Regular

1 respuesta
Khanser

#12 Primero empieza por buscar información sobre ERs, qué són, para qué sirven y como se construyen. Después busca la ER que necesitas, y por último busca como usarla en javascript. Si te fijas, los 3 pasos se corresponden a 3 webs que te he pasado antes :D

Kissler

#14 Gracias voy a mirarlo

R

Sacado de SO, de este thread


function validateNumber(evt) {
    var e = evt || window.event;
    var key = e.keyCode || e.which;

if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
// numbers   
key >= 48 && key <= 57 ||
// Numeric keypad
key >= 96 && key <= 105 ||
// Backspace and Tab and Enter
key == 8 || key == 9 || key == 13 ||
// Home and End
key == 35 || key == 36 ||
// left and right arrows
key == 37 || key == 39 ||
// Del and Ins
key == 46 || key == 45) {
    // input is VALID
}
else {
    // input is INVALID
    e.returnValue = false;
    if (e.preventDefault) e.preventDefault();
}
}

additional you could add comma, period and minus (,.-)

  // comma, period and minus, . on keypad
  key == 190 || key == 188 || key == 109 || key == 110 ||


HTML

<input type="text" onkeydown="validateNumber(event);"/ >

Kissler

Al final lo hice asi

function validaCaractersEspecials(texto, nombre) {
   var RegExPattern = /^[A-Za-z0-9ÁÉÍÓÚáéíóúÑñ\s]*$/; //contenedor de abacedario, y numerico
   var validacion = texto.match(RegExPattern);

if (validacion == null) {  
						  alert("Introdueix correctament el nom de " + nombre);
						  return false;
						  
						}else{ return true; }

}

funciona , Ahora tengo que hacer una ventana que muestre el resultado osea el array, me sale todo bien , me abre la ventana me muestra el array , pero nose xq sale un undefined alfinal del todo. Alguna idea?

 function taula()
 {
	 
  ventanilla= window.open("", "ventana2", "toolbar=no, scrollbar=yes" );  
ventanilla.document.write(mostraCarret()); ventanilla.document.write('<input type="button" value="Cerrar" onclick="window.close()">'); ventanilla.document.close(); } function mostraCarret() { ventanilla.document.write("Contigut del carret: <br /><br />"); for ( var z = 0; z < i-1; z++ ) { ventanilla.document.write(carret[z]+"<br />"); } }

Gracias

Kissler

Probando y no me pregunteis porque he puesto al final de la funcion mostraCarret return false; y veia que envezde salir undefined, me salia false y si ponia true pues true... aplicando mi super logica he puesto return ""; y no sale nada xD ha sido tal que asi :

function mostraCarret()
 {
	ventanilla.document.write("Contigut del carret: <br /><br />"); 		
	for ( var z = 0; z < i-1; z++ )
	   { 	   	
	     ventanilla.document.write(carret[z]+"<br />");
	   return "";
	   }

 }

Alguien sabe explicarme el motivo de porque pasaba eso? xq creo que esto que he hecho es una gitanada en toda regla.

Gracias

1 respuesta
Metaza

¿Programas en catalán? :O

B

Igual de inútil que hacerlo en castellano.

#24: Es que es estúpido no hacerlo en inglés. Si bien es cierto que gran parte de tu código no la verá nadie más, no pierdes nada y, de hacerlo libre, puede verlo gente de todo el mundo.

1 respuesta
Kissler

Es cosa que por suerte o por desgracia , la uni la hago en catalan , apuntes en catalan o ingles y mira este profe parece que prefiere expresarse en catalan asi que asi se lo hare.

elkaoD

#19 en efecto, gitanada en toda regla. Ese for ahí no pinta nada, ¿no? Estás saliendo del for en la primera iteración. Eso no te muestra más de una entrada en la "tabla". ¿O te has confundido y el return era fuera del for? (lo más probable.)

Lo de que te muestre algo es porque estás llamando tal que así:

ventanilla.document.write(mostraCarret());

Como mostraCarret devuelve null o undefined, pues te lo imprime. Como ahora devuelves "", está haciendo:

ventanilla.document.write("");

Es decir, escribir nada, que es lo que esperabas... pero es más fácil esto a secas:

mostraCarret();

O el origina ventanilla.document.write(mostraCarret()); pero mostraCarret no llama DENTRO a document.write, sino que hace return de lo que quieras imprimir (ver ejemplo a continuación.)


Esto es lo que CREO intuir que sería tu código bien hecho, procura sacar algo en claro:

function taula(carret) {
  var ventanilla = window.open("", "ventana2", "toolbar=no, scrollbar=yes" );  
ventanilla.document.write(buildCarret(carret)); ventanilla.document.write('<input type="button" value="Cerrar" onclick="window.close()">'); ventanilla.document.close(); } function mostraCarret(carret) { var carretText = "Contigut del carret: <br /><br />"; for ( var z = 0; z < carret.length; z++ ) {
carretText += carret[z] + "<br />"; } return carretText; } // Llamar usando "taula(carret);" // Donde declares "carret" hazlo con var

Cosas a mejorar por tu parte:

  1. Declara las variables con "var"

OJO, esto hará que tu variable sólo esté disponible entre los {} donde se declara (esto se llama variable local.) Para solventarlo, pasa la variable que quieras de función en función por un argumento (véase "carret" en mi ejemplo.)

Esto tiene la ventaja (entre otras, aunque aún no las veas) de que podrás imprimir varios "carrets" distintos sólo poniendo "taula(carret1);", "taula(carret2);", etc.

  1. Entiende bien como funcionan las funciones, qué es return, etc.
1 1 respuesta
Metaza

#21 Yo lo hago en inglés, no por nada si no porque creo que queda más legible.

1 respuesta
Kissler

#23 Gracias , mis conocimientos son bastante basicos aun de ahi que haga chapuzas pero con tu explicacion me ha quedado algunas cosas mas claras.

Merci

P.D. una ultima cosa sino te sabe mal, la siguiento que tengo que hacer, es mostrar el array de carret ordenado, no me suena a ver visto ninguna funcion en mis apuntes para eso. Alguna pista de que puedo usar?

Gracias

1 respuesta
elkaoD

#25 http://lmgtfy.com/?q=javascript+sort+array

1 respuesta
Kissler

#26 jajajaja Gracias, desconocia ni que existiera la funcion Sort esa.

Usuarios habituales