2013-01-15 5 views
8

Posso in qualche modo seguire le modifiche ai cookie (per il mio dominio) nel mio lato client javascript. Per esempio una funzione che viene chiamato se un cookie viene modificato, cancellato o aggiuntoposso essere informato delle modifiche dei cookie nel lato client javascript

In ordine di preferenza

  • standard di cross browser
  • cross browser
  • browser specifico
  • estensione/plugin

Perché? perché i cookie da cui dipendo in window/tab # 1 possono essere modificati in window/tab # 2.

Ho scoperto che chrome consente alle estensioni di essere notificate delle modifiche ai cookie. Ma questo è il mio preferito opzione meno

+0

cookie non può avviare la comunicazione alle rispettive pagine web. È responsabilità della pagina web che dovrebbe tenere traccia del contenuto dei cookie. – srijan

risposta

4

Una possibilità è quella di scrivere una funzione che controlla periodicamente il cookie di modifiche:

var checkCookie = function() { 

    var lastCookie = document.cookie; // 'static' memory between function calls 

    return function() { 

     var currentCookie = document.cookie; 

     if (currentCookie != lastCookie) { 

      // something useful like parse cookie, run a callback fn, etc. 

      lastCookie = currentCookie; // store latest cookie 

     } 
    }; 
}(); 

window.setInterval(checkCookie, 100); // run every 100 ms 
  • Questo esempio utilizza una chiusura per la memoria persistente. La funzione esterna viene eseguita immediatamente, restituendo la funzione interna e creando un ambito privato.
  • window.setInterval
+0

sembra la mia unica opzione portatile – pm100

0

leggermente migliorata (mostra un console.log per ogni cambiata cookie):

var checkCookie = function() { 

var lastCookies = document.cookie.split(';').map(function(x) { return x.trim().split(/(=)/); }).reduce(function(a, b) { 
     a[ b[ 0 ] ] = a[ b[ 0 ] ] ? a[ b[ 0 ] ] + ', ' + b.slice(2).join('') : 
     b.slice(2).join(''); return a; }, {}); 


return function() { 

    var currentCookies = document.cookie.split(';').map(function(x) { return x.trim().split(/(=)/); }).reduce(function(a, b) { 
     a[ b[ 0 ] ] = a[ b[ 0 ] ] ? a[ b[ 0 ] ] + ', ' + b.slice(2).join('') : 
     b.slice(2).join(''); return a; }, {}); 


    for(cookie in currentCookies) { 
     if (currentCookies[cookie] != lastCookies[cookie]) { 
      console.log("--------") 
      console.log(cookie+"="+lastCookies[cookie]) 
      console.log(cookie+"="+currentCookies[cookie]) 
     } 

    } 
    lastCookies = currentCookies; 

}; 
}(); 

window.setInterval(checkCookie, 100); 
Problemi correlati