He estado tratando de implementar una función básica de almacenamiento de cookies en Javascript, que funciona según lo previsto en la mayoría de los navegadores, pero no en Safari (8.0.3). Lo he reducido al siguiente ejemplo, donde todos los demás navegadores cambian el texto a la fecha que está almacenada en la cookie, pero Safari no almacena ninguna cookie y muestra una cadena vacía (no hay mensajes de error en el consola tampoco). Safari está configurado para aceptar todas las cookies.

Si ingreso el código en el banco de pruebas en W3Schools.com, funciona en todos los navegadores, ¿está relacionado de alguna manera con el dominio? (En JSFiddle no parece funcionar en absoluto, ya que la consola se queja de que myFunction no está definido).

Solo he encontrado dos problemas anteriores del mismo tipo, pero en un caso la solución fue agregar la parte "; path = /", que ya está aquí, y en el otro había una coma en lugar de un punto y coma.

<!DOCTYPE html>
<html>
<body>
<p id="doesitwork" onclick="myFunction()">Does it work?</p>
<script>
function myFunction() {
    d = new Date();
    document.cookie = (d + "; expires=" + "May 31 2016 23:59:59 GMT+09:00" + "; path=/");
    var x = document.cookie;
    document.getElementById("doesitwork").innerHTML = x;
}
</script>
</body>
</html>
4
Sam Derboo 7 may. 2016 a las 14:16

4 respuestas

La mejor respuesta

Bueno, no estás configurando un par de valor de nombre

document.cookie = (d + "; expires=" + "May 31 2016 23:59:59 GMT+09:00" + "; path=/");

Debería ser algo como

document.cookie = "time=" + d + "; expires=" + "May 31 2016 23:59:59 GMT+09:00" + "; path=/";
0
epascarello 7 may. 2016 a las 11:34

Puedes echar un vistazo a este bonito artículo y te muestran un función para crear, leer y eliminar cookies, también muestra JS y jQuery puros. El código en el blog se muestra así:

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

// Read cookie
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;
}

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

Creando cookies como esta:

createCookie("cookie-name", "cookie-value", 30);

Leyendo una cookie como esta:

readCookie("cookie-name");
// Usually you set it as a variable and then use it somewhere
var colorTheme = readCookie("color-theme");
// Then do some conditional crap with it
if (colorTheme == "Blue") {
    // Add a class to the body or elswere
} else {
    // Add a different class maybe...
}
1
Riddell 7 may. 2016 a las 11:26

La mejor manera de mostrar / ocultar cookies en todo el navegador, incluido el navegador móvil también.

Demostración: http://jsfiddle.net/a4fur7k3/1/

Notas: Por defecto, el mensaje debe estar oculto

HTML

    <div id="es_cookie_msg"  style="display:none;">
        <div class="es-cookie-msg-container">
                      <!-- Cookie Message -->
                        <span class="es-cookie-msg-text">We use cookies to help ensure our website meets your needs. By continuing to use this site you agree to our policy.
</span>   
            <!-- Close button -->
            <a id="es_cookie_close_btn" href="#" class="es-cookie-button">
                <svg class="es_cookie_close_icon" width="64" version="1.1" xmlns="http://www.w3.org/2000/svg" height="64" viewBox="0 0 64 64" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 64 64">
                    <g>
                    <path fill="" d="M28.941,31.786L0.613,60.114c-0.787,0.787-0.787,2.062,0,2.849c0.393,0.394,0.909,0.59,1.424,0.59   c0.516,0,1.031-0.196,1.424-0.59l28.541-28.541l28.541,28.541c0.394,0.394,0.909,0.59,1.424,0.59c0.515,0,1.031-0.196,1.424-0.59   c0.787-0.787,0.787-2.062,0-2.849L35.064,31.786L63.41,3.438c0.787-0.787,0.787-2.062,0-2.849c-0.787-0.786-2.062-0.786-2.848,0   L32.003,29.15L3.441,0.59c-0.787-0.786-2.061-0.786-2.848,0c-0.787,0.787-0.787,2.062,0,2.849L28.941,31.786z"></path>
                    </g>
                </svg>
            </a>
        </div>
    </div>

jQuery

jQuery( document ).ready(function() {
  jQuery('#es_cookie_close_btn').click(function() {
      jQuery('#es_cookie_msg').slideUp();
      // Set cookie
      cookieHelper.create('accepted', true);
  });
});

jQuery(function () {
  // If cookie hasnt reveioly been accepted, show banner
  if( !cookieHelper.read('accepted') ) {
      jQuery('#es_cookie_msg').slideDown();
  }
});

// Cookies set inside object
var cookieHelper = {
  // Cookies
  create: function (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=/";
  },

  read: function(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;
  },

  erase: function(name) {
      createCookie(name, "", -1);
  }
}
-2
Mayank Dudakiya 22 jun. 2019 a las 06:27

Por defecto, la cookie no está permitida para el navegador Safari iOS. Tenemos que habilitar la configuración de cookies desde el navegador Safari

Por lo tanto, hemos implementado el almacenamiento local (concepto de JavaScript) para superar los problemas de cookies en el navegador Safari.

6
sugansoft 13 jul. 2017 a las 04:43