Publicado en Internet

Comprobar si existe un archivo en el servidor con JavaScript

Como ya sabrás, JavaScript se ejecuta en el cliente, por lo que no puedes preguntar por cosas del servidor. Sin embargo, sería muy bueno tener una función que nos dijera si un archivo existe en el servidor para poder tomar decisiones al respecto.

Pues bien, la solución nos la da AJAX. Pedimos la cabecera del archivo que queremos comprobar y si nos devuelve un 404 es que no existe, así de fácil. Sé que al leer AJAX tendemos a tirar por jQuery, pero en este caso, al ser algo tan sencillo voy a explicarlo en JavaScript puro, que siempre es más rápido que tener que cargar un framework.

function existeUrl(url) {
   var http = new XMLHttpRequest();
   http.open('HEAD', url, false);
   http.send();
   return http.status!=404;
}

Como puedes ver, ni siquiera necesitas cargar el archivo ya que solicitamos sólo el ‘HEAD’ (no hacemos ni GET ni POST), por lo que aunque sea de 100 megas tendrás una respuesta rápida. La misma función se podría hacer preguntando si el status es 200, que sería que existe el fichero y la cabecera del mismo es correcta.

Por cierto, el false del open es para que la consulta sea síncrona y así el return se ejecute cuando haya terminado de solicitar la cabecera, no vaya a ser que la conexión sea muy pobre y no le de tiempo a hacer el send antes de tener la respuesta del open. La url es relativa al sitio web.

Publicado en Internet, Tecnología

Validar IBAN en JavaScript

IBAN

Si a estas alturas no has adaptado todavía tus aplicaciones web a la nueva normativa es porque te ha pillado el toro, sin discusión. Pero más allá de este pequeño detalle, si necesitas comprobar el IBAN con JavaScript y no logras dar con la tecla, no te preocupes, intentar dividir un número de 26 cifras en JavaScript es una tarea bastante compleja, como ya habrás descubierto si has caído aquí. Por suerte hay una forma diferente de calcular el módulo que con el operador ‘%’. Vamos allá.

// Función que devuelve los números correspondientes a cada letra
function getNumIBAN(letra){
   var letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   return letras.search(letra) + 10;
}

// Función que calcula el módulo sin hacer ninguna división
function mod(dividendo, divisor){
   var cDividendo = '';
   var cResto = '';
   
   for (var i in dividendo){
      var cChar = dividendo[i];
      var cOperador = cResto + '' + cDividendo + '' + cChar;
     
      if (cOperador < parseInt(divisor)){
         cDividendo += '' + cChar;
      }else{
         cResto = cOperador % divisor;
         if (cResto == 0){
            cResto = '';
         }
         cDividendo = '';
      }
   }
   cResto += '' + cDividendo;
   if (cResto == ''){
      cResto = 0;
   }
   return cResto;
}

// El típico trim que inexplicamente JavaScript no trae implementado
function trim(texto){
   return texto.replace(/^\s+/g,'').replace(/\s+$/g,'');
}

// Función que comprueba el IBAN
function validaIBAN(IBAN){
   IBAN = IBAN.toUpperCase();
   IBAN = trim(IBAN); // Quita espacios al principio y al final
   IBAN = IBAN.replace(/\s/g, ""); // Quita espacios del medio
   var num1,num2;
   var isbanaux;
   if (IBAN.length != 24){ // En España el IBAN son 24 caracteres
      return false;
   }else{
      num1 = getNumIBAN(IBAN.substring(0, 1));
      num2 = getNumIBAN(IBAN.substring(1, 2));
      isbanaux = IBAN.substr(4) + String(num1) + String(num2) + IBAN.substr(2,2);
      resto = mod(isbanaux,97);
      return (resto==1);
   }
}

Con esto deberías tener suficiente, siempre se pueden hacer más comprobaciones para afinar un poco, como validar que los dos primeros caracteres sean letras y el resto números, o adaptar comprobaciones de longitud y posición para cada país, pero eso ya se lo dejo a cada uno, que aquí lo complicado es lo del módulo.

Para terminar, voy a dejar la explicación de la normativa, supongo que ya la conoceréis de sobra pero nunca está demás leerlo sin parafernalia lingüística:

El IBAN está compuesto por 2 letras que son el código del país, 2 números que hacen de dígitos de control y hasta un máximo de 30 posiciones más para la cuenta, la cantidad exacta depende del país. En España son 20 dígitos para la cuenta, así que tendremos los IBAN de 24 caracteres en total.

La manera de comprobar que un IBAN es correcto es siguiendo los siguientes pasos (ejemplo: ES38 0081 0283 4100 0111 1416):

  • Transformar las letras en números según la siguiente serie: A = 10, B = 11, C = 12, etc. Por lo tanto para España sería E = 14 y S = 28
  • Pasar tanto los códigos de las letras del país como los dígitos de control al final de la numeración, quedando así: 0081 0283 4100 0111 1416 142838
  • Obtener el resto de dividir éste último número entre 97 (mod 97)
  • Si el resto es 1, el IBAN es correcto, en otro caso no lo es

Espero que os sirva y ante cualquier duda ya sabéis, comentarios aquí abajo.

Publicado en Tecnología

ReplaceAll en JavaScript

En todo lenguaje de programación es necesario un método para reemplazar caracteres por otros. En JavaScript tenemos replace() que funciona de la siguiente manera:

var textoOrigen = 'Hola mundo!';
var textoDestino = textoOrigen.replace('mundo','gente');
// RESULTADO: textoDestino = 'Hola gente!'

Hasta aquí todo bien, pero el método replace() sólo reemplaza la primera ocurrencia, es decir, si quisiéramos reemplazar todas las ‘o’ por ‘u’, en el ejemplo anterior, la cadena resultante sería ‘Hula mundo!’. Para solucionar este asunto y que se reemplancen todas las ‘o’ tendremos que utilizar una expresión regular:

var textoOrigen = 'Hola mundo!';
var textoDestino = textoOrigen.replace(new RegExp('o','g'),'u');
// RESULTADO: textoDestino = 'Hula mundu!'

La manera cómoda de utilizar esto sería:

var textoDestino = textoOrigen.replace(/o/g,'u');

Teniendo en cuenta que la ‘o’ va sin comillas. Esta segunda forma de expresarlo parece mejor, pero en ocasiones no lo es. Al prescindir de las comillas no podríamos poner una variable, lo cual sí podemos hacer con la primera solución.

Si no estás muy puesto en expresiones regulares, la ‘g’ te parecerá extraña, pero es la que indica que tiene que realizar la acción en todas las ocurrencias, que es precisamente lo que queremos. A continuación el resto de opciones:

g: realiza una búsqueda global (todas las ocurrencias)
m: realiza una búsqueda en múltiples líneas
i: realiza la búsqueda sin diferenciar mayúsculas y minúsculas

Se pueden utilizar a la vez, por ejmplo, RegExp(‘Mundo’,’gi’); Lo cual buscaría todas las ocurrencias de ‘Mundo’ sin importar las mayúsculas y minúsculas, es decir, valdría cualquiera de estas: ‘mundo’, ‘MUNDO’, ‘MunDo’, etc.

También os dejo una lista de caracteres especiales que pueden utilizarse como primer parámetro de RegExp:

. Cualquier caracter que no sea salto ni fin de línea
\w Caracter de texto
\W Caracter que no sea texto
\d Dígito
\D No dígito
\s Espacio
\S No espacio
\b Principio o fin de palabra
\B No es principio ni fin de palabra
\0 NULL
\n Intro
\f Avance de página
\r Retorno de carro
\t Tabulación
\v Tabulación vertical
\xxx Caracter especificado por el número octal xxx
\xdd Caracter especificado por el número hexadecimal xx
\uxxxx Caracter unicode especificado por el hexadecimal xxxx

Esto es todo amigos. El mundo de las expresiones regulares es enorme y fascinante, así que se puede conseguir casi cualquier cosa, pero para lo que nos concierne, con la ‘g’ tenemos suficiente. Si tenéis alguna duda estaré encantado de intentar solucionarla en los comentarios.