Autor Tema: cómo crear y borrar cookies en JavaScript document.cookie concepto CU01188E  (Leído 5095 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Hola a toda la comunidad de aprenderaprogramar.com

Aquí os expongo una posible solución del ejercicio CU01188E del curso JavaScript

Citar
EJERCICIO

Un programador ha desarrollado este código. Revísalo y responde a las siguientes preguntas:

Código: [Seleccionar]
function createCookie(name,value,days) {

                if (days) {

                               var date = new Date();

                               date.setTime(date.getTime()+(days*24*60*60*1000));

                               var expires = "; expires="+date.toGMTString();

                }

                else var expires = "";

                document.cookie = name+"="+value+expires+"; path=/";

}

 
function eraseCookie(name) { createCookie(name,"",-1); }

Citar
a) ¿Para qué sirve la función createCookie? Explica paso a paso qué es lo que hace esta función.

Principalmente es para crear una cookie y borrarla al cerrarse el navegador.
Primero lo que hacemos es comprobar si el parámetro "days" existe. En caso afirmativo ejecutamos el código que le corresponde. Es decir, creamos un objeto de tipo Date con el valor del momento en el que se crea dicho objeto. Posteriormente modificamos dicho objeto mediante la propiedad ".setTime()" a un día anterior (86.400.000 son los milisegundos que tiene un día).  Y finalmente establecemos el parámetro "expires" del objeto cookie a la fecha anterior al día actual (con lo cual se borrará).
Si no existe el parámetro "days" inicializamos la variable "expires" a una cadena vacía (lo que hará como parámetro del objeto Cookie que se borre la cookie al cerrar el navegador ).
Tanto si existe el parámetro "days", como si no, creamos una cookie con la siguiente instrucción:

Código: [Seleccionar]
document.cookie = name+"="+value+expires+"; path=/"; 

Código: [Seleccionar]
b) ¿Para qué sirve la función eraseCookie? Explica paso a paso qué es lo que hace esta función.
La función "eraseCookie(name)" pasa el parámetro "name" e invoca la función "createCookie()" con un valor negativo al parámetro "days" cual hará borrar la cookie.

Citar
c) Escribe el código de una función de nombre mostrarTodasLasCookies() que muestre el nombre y valor de todas las cookies existentes. Por ejemplo, si hay dos cookies deberá mostrarse algo como esto:

Hay 2 cookies en el documento

Cookie 1 con nombre: cookieNombreUsuario y valor: Alberto

Cookie 2 con nombre cookieEdadUsuario y valor 8

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

function mostrarTodasLasCookies() {
document.cookie = "cookieNombreUsuario = Alberto; expires = Thu, 12 Aug 2049 20:47:11 UTC; path = /;";
document.cookie = "cookieEdadUsuario = 8; expires = Thu, 12 Aug 2049 20:47:11 UTC; path = /;";
var numeroCookies = document.cookie.split(';');
var msg = 'Hay '+numeroCookies.length+' cookies en el documento.\n\n';
for(var i=0; i<numeroCookies.length; i++){
var cookieNombre = numeroCookies[i].substring(0, numeroCookies[i].indexOf('='));
msg = msg + 'Cookie '+(i+1)+' con nombre: '+cookieNombre;
var cookieValor = numeroCookies[i].substring((numeroCookies[i].indexOf('=')+1), numeroCookies[i].length);
msg = msg + ' y valor: '+cookieValor+'\n\n';
}
alert(msg);
}

</script>
</head>
<body>
<div id="numeroCookiescabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplo JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;"><a href="#" onclick="mostrarTodasLasCookies()">Mostrar todas las cookies</a></div>
</body>
</html>

Citar
d) Usando las funciones createCookie, eraseCookie y  mostrarTodasLasCookies() crea un script que pida 3 nombres y valores de cookies al usuario, y cree las cookies correspondientes. A continuación deberá mostrar las cookies existentes y sus valores. Finalmente, deberá borrar la última cookie existente y volver a mostrar todas las cookies y sus valores.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

function datosCookies(){
var cookie = [];
var valor = [];
for(var i=0; i<3; i++){
cookie[i] = prompt('Entra nombre cookie:');
valor[i] = prompt('Entrar valor cookie:');
createCookie(cookie[i],valor[i],1);
}
mostrarTodasLasCookies();
eraseCookie(cookie[2])
mostrarTodasLasCookies();
}

function mostrarTodasLasCookies() {
var numeroCookies = document.cookie.split(';');
var msg = 'Hay '+numeroCookies.length+' cookies en el documento.\n\n';
for(var i=0; i<numeroCookies.length; i++){
var cookieNombre = numeroCookies[i].substring(0, numeroCookies[i].indexOf('='));
msg = msg + 'Cookie '+(i+1)+' con nombre: '+cookieNombre;
var cookieValor = numeroCookies[i].substring((numeroCookies[i].indexOf('=')+1), numeroCookies[i].length);
msg = msg + ' y valor: '+cookieValor+'\n\n';

}
alert(msg);
}

function createCookie(name,value,days) {
        if (days){
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = '';
            expires=''+date.toGMTString();
        }else
        var expires = "";

        document.cookie = name+'='+value+expires+"; path=/";
}

function eraseCookie(name){createCookie(name,'',-1);}

</script>
</head>
<body>
<div id="numeroCookiescabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplo JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;"><a href="#" onclick="datosCookies()">Mostrar todas las cookies</a></div>
</body>
</html>

Graicas.
« Última modificación: 01 de Mayo 2016, 18:03 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola!

En la pregunta a) ¿Por qué hablas de una fecha pasada? date.getTime()+(days*24*60*60*1000) está sumando una cantidad, entonces será una fecha futura no? A no ser que como parámetro se pase un valor negativo, en ese caso el efecto es el que se comenta en la opción b)

En la b) sí se usa un parámetro negativo para days, y ocurrirá como comentas.

La c) bien

En la d) esta función la veo confusa:

Código: [Seleccionar]
function datosCookies(){
var cookie = [];
var valor = [];
for(var i=0; i<3; i++){
cookie[i] = prompt('Entra nombre cookie:');
valor[i] = prompt('Entrar valor cookie:');
createCookie(cookie[i],valor[i],1);
}
mostrarTodasLasCookies();
eraseCookie(cookie[2])
mostrarTodasLasCookies();
}

Si una función debe hacer una cosa ¿Qué es lo que hace esta función? No parece adecuado que además de pedir y crear muestre borre y vuelva a mostrar. Sí es lo que pide el ejercicio, pero no parece un buen diseño de código y de nombres de funciones. La función no hace lo que dice su nombre. El código está bien pero el diseño parece mejorable

En esta línea tienes document.cookie = name+'='+value+expires+"; path=/"; con lo cual el nombre de la cookie lleva la fecha y así una cookie que le introducimos el nombre mivalor aparecerá como mivalor1Mon, 02 May 2096 15:54:38 GMT o algo similar con lo cual ya no es el nombre que hemos introducido. Podemos verlo de dos maneras: si queremos respetar el código que expone el ejercicio estaría bien así. O si preferimos no respetarlo, haríamos una modificación en el código para quedarnos únicamente con el nombre sin llevar la fecha añadida.

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes, César.

Antes de empezar la contestación a tu corrección quería agradecerte tu tiempo dedicado.

Sobre lo que me comentas de la respuesta a). Digo que es una fecha pasada porque partí de la base que todos los milesegundos los multiplicabamos por "-1" que es el valor  del parámetro "days" que recibe la función "createCookie()" . Me basé en este caso concreto. Quizás tenía que haber hecho unos comentarios absteniéndome de este caso y hacerlos en general.

Sobre el apartado d), sí me había hecho un lío. Ahora veo mi error. Después de corregir el error el código quedará así:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

var ultimaCookie;

function datosCookies(){
var cookie = [];
var valor = [];
for(var i=0; i<3; i++){
cookie[i] = prompt('Entra nombre cookie:');
valor[i] = prompt('Entrar valor cookie:');
createCookie(cookie[i],valor[i],1);
};
var ultimaCookie = difinirUltimaCookie();
}

function difinirUltimaCookie(){
var numeroCookies = document.cookie.split(';');
ultimaCookie = numeroCookies[numeroCookies.length-1].substring(1, numeroCookies[numeroCookies.length-1].indexOf('='));
}

function mostrarTodasLasCookies() {
var numeroCookies = document.cookie.split(';');
var msg = 'Hay '+numeroCookies.length+' cookies en el documento.\n\n';
for(var i=0; i<numeroCookies.length; i++){
var cookieNombre = numeroCookies[i].substring(0, numeroCookies[i].indexOf('='));
msg = msg + 'Cookie '+(i+1)+' con nombre: '+cookieNombre;
var cookieValor = numeroCookies[i].substring((numeroCookies[i].indexOf('=')+1), numeroCookies[i].length);
msg = msg + ' y valor: '+cookieValor+'\n\n';

};
alert(msg);
}

function createCookie(name,value,days) {
        if (days){
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }else{
        var expires = "";
    }

        document.cookie = name+'='+value+expires+"; path=/";
}

function eraseCookie(){
alert(ultimaCookie);
createCookie(ultimaCookie,'',-2);
}

</script>
</head>
<body>
<div id="numeroCookiescabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplo JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;"><a href="#" onclick="datosCookies()">Crear cookies</a> <a href="#" onclick="mostrarTodasLasCookies()">Mostrar todas las cookies</a> <a href="#" onclick="eraseCookie()">Borrar la última cookie</a></div>
</body>
</html>

Pero me surge una duda, si en la función "datosCookies()" asigno un valor a la variable "ultimaCookie" sin definirla, la función "eraseCookie()" no conoce la variable "ultimaCookie". Es decir, si dejo el código así no funciona:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

var ultimaCookie;

function datosCookies(){
var cookie = [];
var valor = [];
for(var i=0; i<3; i++){
cookie[i] = prompt('Entra nombre cookie:');
valor[i] = prompt('Entrar valor cookie:');
createCookie(cookie[i],valor[i],1);
};
ultimaCookie = difinirUltimaCookie();
}

function difinirUltimaCookie(){
var numeroCookies = document.cookie.split(';');
ultimaCookie = numeroCookies[numeroCookies.length-1].substring(1, numeroCookies[numeroCookies.length-1].indexOf('='));
alert(ultimaCookie);
}

function mostrarTodasLasCookies() {
var numeroCookies = document.cookie.split(';');
var msg = 'Hay '+numeroCookies.length+' cookies en el documento.\n\n';
for(var i=0; i<numeroCookies.length; i++){
var cookieNombre = numeroCookies[i].substring(0, numeroCookies[i].indexOf('='));
msg = msg + 'Cookie '+(i+1)+' con nombre: '+cookieNombre;
var cookieValor = numeroCookies[i].substring((numeroCookies[i].indexOf('=')+1), numeroCookies[i].length);
msg = msg + ' y valor: '+cookieValor+'\n\n';

};
alert(msg);
}

function createCookie(name,value,days) {
        if (days){
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }else{
        var expires = "";
    }

        document.cookie = name+'='+value+expires+"; path=/";
}

function eraseCookie(){
createCookie(ultimaCookie,'',-2);
}

</script>
</head>
<body>
<div id="numeroCookiescabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplo JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;"><a href="#" onclick="datosCookies()">Crear cookies</a> <a href="#" onclick="mostrarTodasLasCookies()">Mostrar todas las cookies</a> <a href="#" onclick="eraseCookie()">Borrar la última cookie</a></div>
</body>
</html>

Por qué ocurre este fenómeno? Por qué tengo que definir otra vez la variable "ultimaCookie" dentro de la función "datosCookies()" si ya la había definido anteriormente como una variable global. Además, si la vuelvo a definir dentro de una función no se convierte en una varible local? No entiendo.

También intenté pasar la variable "ultimaCookie" de la función "mostrarTodasLasCookies()" a la función "eraseCookie()" mediante el método ".bind()", pero ésta última no la conoce. Tampoco lo entiendo.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

function datosCookies(){
var cookie = [];
var valor = [];
for(var i=0; i<3; i++){
cookie[i] = prompt('Entra nombre cookie:');
valor[i] = prompt('Entrar valor cookie:');
createCookie(cookie[i],valor[i],1);
};
}


function mostrarTodasLasCookies() {
var numeroCookies = document.cookie.split(';');
var msg = 'Hay '+numeroCookies.length+' cookies en el documento.\n\n';
for(var i=0; i<numeroCookies.length; i++){
var cookieNombre = numeroCookies[i].substring(0, numeroCookies[i].indexOf('='));
msg = msg + 'Cookie '+(i+1)+' con nombre: '+cookieNombre;
var cookieValor = numeroCookies[i].substring((numeroCookies[i].indexOf('=')+1), numeroCookies[i].length);
msg = msg + ' y valor: '+cookieValor+'\n\n';

};
alert(msg);
var ultimaCookie = numeroCookies[numeroCookies.length-1].substring(1, numeroCookies[numeroCookies.length-1].indexOf('='));
var borrarCookie = eraseCookie.bind(undefined, ultimaCookie);
}

function createCookie(name,value,days) {
        if (days){
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }else{
        var expires = "";
    }

        document.cookie = name+'='+value+expires+"; path=/";
}

function eraseCookie(){
alert(ultimaCookie);
createCookie(ultimaCookie,'',-2);
}

</script>
</head>
<body>
<div id="numeroCookiescabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplo JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;"><a href="#" onclick="datosCookies()">Crear cookies</a> <a href="#" onclick="mostrarTodasLasCookies()">Mostrar todas las cookies</a> <a href="#" onclick="eraseCookie()">Borrar la última cookie</a></div>
</body>
</html>

Gracias

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
No hay manera de que funcioné con ".bind()". No sé dónde estoy fallando:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

function datosCookies(){
var cookie = [];
var valor = [];
for(var i=0; i<3; i++){
cookie[i] = prompt('Entra nombre cookie:');
valor[i] = prompt('Entrar valor cookie:');
createCookie(cookie[i],valor[i],1);
};
}


function mostrarTodasLasCookies() {
var numeroCookies = document.cookie.split(';');
var msg = 'Hay '+numeroCookies.length+' cookies en el documento.\n\n';
for(var i=0; i<numeroCookies.length; i++){
var cookieNombre = numeroCookies[i].substring(0, numeroCookies[i].indexOf('='));
msg = msg + 'Cookie '+(i+1)+' con nombre: '+cookieNombre;
var cookieValor = numeroCookies[i].substring((numeroCookies[i].indexOf('=')+1), numeroCookies[i].length);
msg = msg + ' y valor: '+cookieValor+'\n\n';

};
alert(msg);
var ultimaCookie = numeroCookies[numeroCookies.length-1].substring(1, numeroCookies[numeroCookies.length-1].indexOf('='));
eraseCookie.bind(undefined, ultimaCookie);
}

function createCookie(name,value,days) {
        if (days){
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }else{
        var expires = "";
    }

        document.cookie = name+'='+value+expires+"; path=/";
}

function eraseCookie(ultimaCookie){
alert(ultimaCookie);
createCookie(ultimaCookie,'',-2);
}

</script>
</head>
<body>
<div id="numeroCookiescabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplo JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;"><a href="#" onclick="datosCookies()">Crear cookies</a> <a href="#" onclick="mostrarTodasLasCookies()">Mostrar todas las cookies</a> <a href="#" onclick="eraseCookie()">Borrar la última cookie</a></div>
</body>
</html>

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Diría que estás haciendo un mal uso de nombres  ::)

   var ultimaCookie;

   function datosCookies(){
      var cookie = [];
      var valor = [];
      for(var i=0; i<3; i++){
         cookie[i ] = prompt('Entra nombre cookie:');
         valor[i ] = prompt('Entrar valor cookie:');
         createCookie(cookie[ i],valor[ i],1);
      };
      ultimaCookie = difinirUltimaCookie();
   }

   function difinirUltimaCookie(){
      var numeroCookies = document.cookie.split(';');
      ultimaCookie = numeroCookies[numeroCookies.length-1].substring(1, numeroCookies[numeroCookies.length-1].indexOf('='));
      alert(ultimaCookie);
   }


No lo he verificado pero veo muchas repeticiones de ultimaCookie, parece que estuvieras creando un conflicto que podrías solucionar si no repitieras el nombre de variable. ¿Cuándo haces el alert, en qué ámbito obtienes la respuesta? Hay algo raro en que llames a una función para obtener el valor de una variable y que dentro de la función que has llamado vuelvas a usar esa variable...


Saludos!
Responsable de departamento de producción aprenderaprogramar.com

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Hola, César.

Mi idea era, con crea una variable global, ahorrarme que defina en cada función la última cookie. Es decir, después de crear las cookies quería definir cuál es la última cookie y asignarla a una variable global para ser conocida por todas las demás funciones.

Sobre el uso del alert(), muchas veces lo hago para comprobar que valor tienen las variables. En este caso creía que la variable "ultimaCookie" estaba en el ámbito de la función "definirUltimaCookie()", quiero decir, que allí fue su última modificación y creía que se tenía que quedar  con el valor: "numeroCookies[numeroCookies.length-1].substring(1, numeroCookies[numeroCookies.length-1].indexOf('='))".

No sé si he entendido bien la pregunta.

Gracias

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola! Creo que te has hecho un pequeño lío con lo que te comenté.

La idea era como te muestro en este código, fíjate en los cambios y si te quedan dudas las comentamos.

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo aprenderaprogramar.com</title>
<script type="text/javascript">

function datosCookies(){
var cookie = [];
var valor = [];
for(var i=0; i<3; i++){
cookie[i] = prompt('Entra nombre cookie:');
valor[i] = prompt('Entrar valor cookie:');
createCookie(cookie[i],valor[i],1);
};

}

function difinirUltimaCookie(){
var numeroCookies = document.cookie.split(';');
return numeroCookies[numeroCookies.length-1].substring(1, numeroCookies[numeroCookies.length-1].indexOf('='));
}

function mostrarTodasLasCookies() {
var numeroCookies = document.cookie.split(';');
var msg = 'Hay '+numeroCookies.length+' cookies en el documento.\n\n';
for(var i=0; i<numeroCookies.length; i++){
var cookieNombre = numeroCookies[i].substring(0, numeroCookies[i].indexOf('='));
msg = msg + 'Cookie '+(i+1)+' con nombre: '+cookieNombre;
var cookieValor = numeroCookies[i].substring((numeroCookies[i].indexOf('=')+1), numeroCookies[i].length);
msg = msg + ' y valor: '+cookieValor+'\n\n';

};
alert(msg);
}

function createCookie(name,value,days) {
        if (days){
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }else{
        var expires = "";
    }

        document.cookie = name+'='+value+expires+"; path=/";
}

function eraseCookie(){
var ultimaCookie = difinirUltimaCookie();
alert ('Borrando la última cookie existente: '+ultimaCookie)
createCookie(ultimaCookie,'',-2);
}

</script>
</head>
<body>
<div id="numeroCookiescabecera">
<h2>Cursos aprenderaprogramar.com</h2>
<h3>Ejemplo JavaScript</h3>
</div>
<div id="pulsador" style="color: blue;"><a href="#" onclick="datosCookies()">Crear cookies</a> <a href="#" onclick="mostrarTodasLasCookies()">Mostrar todas las cookies</a> <a href="#" onclick="eraseCookie()">Borrar la última cookie</a></div>
</body>
</html>

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenos días, César.

Qué fácil era y cómo no me había dado cuenta que tenía que utilizar la instrucción "return" en la función "definirUltimaCookie" para invocarla luego en la función "eraseCookie". Claro, fácil, si lo sabes, jejeje.

Es que la instrucción "return" aún me tiene un poquito confundido. No estoy acostumbrado a trabajar con la misma.

Gracias, César. Creo que ya me ha quedado claro.

Un saludo :)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".