2011-05-06 13 views
10

¿Cuál es el mejor enfoque específico de JS o JQuery para monitorear una cookie durante toda la vida de la página en el navegador y desencadenar un evento cuando la cookie se 'cambia?Monitor de cookies Jquery

Respuesta

14

Hasta donde yo sé, no es posible enlazar directamente un evento change (o similar) a una cookie. En cambio, me gustaría obtener este enfoque:

Cree un sondeo que compare el valor de la cookie con el valor conocido previamente cada X milisegundos.

// basic functions from the excellent http://www.quirksmode.org/js/cookies.html 
function readCookie(name) { 
    var nameEQ = name + "="; 
    var ca = document.cookie.split(';'); 
    for(var i=0;i < ca.length;i++) { 
     var c = ca[i]; 
     while (c.charAt(0)==' ') c = c.substring(1,c.length); 
     if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 
    } 
    return null; 
} 

///////////////////////////////// 
// ACTUAL FUN STUFF BELOW 
///////////////////////////////// 

var cookieRegistry = []; 

function listenCookieChange(cookieName, callback) { 
    setInterval(function() { 
     if (cookieRegistry[cookieName]) { 
      if (readCookie(cookieName) != cookieRegistry[cookieName]) { 
       // update registry so we dont get triggered again 
       cookieRegistry[cookieName] = readCookie(cookieName); 
       return callback(); 
      } 
     } else { 
      cookieRegistry[cookieName] = readCookie(cookieName); 
     } 
    }, 100); 
} 

uso sería entonces algo como esto:

listenCookieChange('foo', function() { 
    alert('cookie foo has changed!'); 
}); 

Nota: esto no ha sido probado y es sólo una pequeña demostración de cómo iba a abordar el problema.

EDIT: He probado esto ahora y funciona.See example :)

+1

Nota: Esto solo se activa en eventos de cambio de cookies. Necesitaba comprobar también ** la creación de cookies ** y modifiqué el código así: '... if (cookieRegistry [cookieName] || readCookie (cookieName)! = Null) {...' –

+0

Hola Aron, gracias por esto bien! Realmente gracias. Es 2017 y estoy enfrentando un problema con la regla de eslint sobre 'consistente-return' para' listenCookieChange() 'donde' setInterval' es. ¿Podrías actualizar tu respuesta para hacer feliz a eslint? Deshabilitar eslint funciona. – Sylar

-1

Hay un jQuery complemento para cookies.

http://plugins.jquery.com/project/Cookie

No es difícil acceder a las cookies en un documento HTML, viven en document.cookie.

<!-- Add cookie --> 
$.cookie('cookieName':'cookieValue'); 

<!-- get cookie --> 
$.cookie('cookieName'); 

<!-- removecookie --> 
$.cookie('cookieName', null); 

Además, hay opciones de argumentos para agregar una cookie, p. Ej. expiración.

Sin embargo, en respuesta a su pregunta, no creo que pueda aplicar un detector de eventos a las cookies, lamentablemente.

+1

Su código tiene mala sintaxis. Está utilizando comentarios html en javascript y los dos puntos entre ''cookieName'' y'' cookieValue'' en el primer ejemplo deben ser una coma. Esa puede ser la razón del voto a la baja. – benekastah

1

Sepa qué, esto ayudó a algo raro. Intenté usar Google Translate (http://translate.google.com/translate_tools?hl=es) en una aplicación web móvil y cada vez que se cambia el idioma, se siguió insertando una barra en la parte superior como el primer elemento secundario del documento. cuerpo . Ahora estoy rastreando la cookie 'googtrans' y haciendo esto

listenCookieChange('googtrans', function() { 
    $(document.body).css('top','0px'); 
});