Tengo un problema con safari carga viejos videos de youtube cuando el botón es pulsado. He intentado añadir onunload=»» (mencionado aquí La prevención de la caché en el botón atrás en Safari 5) para el cuerpo de la etiqueta, pero no funciona en este caso.

Es hay alguna manera para evitar safari carga de la memoria caché en una página determinada?

6 Comentarios

  1. 161

    El problema es causado por de atrás hacia adelante caché. Se supone que es para guardar el estado completo de la página cuando el usuario navega por lejos. Cuando el usuario navega por la espalda con botón atrás de la página se puede cargar desde la memoria caché muy rápidamente. Esto es diferente de la normal de caché que sólo almacena en caché de código HTML.

    Cuando la página se carga por bfcache onload evento no se activa. En su lugar, usted puede comprobar el persisted propiedad de la onpageshow evento. Se establece en false en caso de carga de la página inicial. Cuando se carga la página de bfcache se establece en true.

    Kludgish solución es forzar la recarga cuando se carga la página de bfcache.

    window.onpageshow = function(event) {
        if (event.persisted) {
            window.location.reload() 
        }
    };

    Si usted está usando jQuery, a continuación, hacer:

    $(window).bind("pageshow", function(event) {
        if (event.originalEvent.persisted) {
            window.location.reload() 
        }
    });
    • Esta es la única solución que he encontrado hasta ahora, pero es bastante imperfecto como la página se muestra brevemente antes de volver a cargar, y la solución es fácilmente derrotada por la desactivación de javascript. Alguien ha logrado encontrar una solución más completa?
    • Esto no parece funcionar en Chrome para Android (no a prueba de cualquier otro navegador móvil por lo que la limitación mi declaración)
    • Para IE 11, tuve que usar window.location = window.location en lugar de window.location.reload(), por razones que supongo perdido en las brumas del tiempo.
    • Para resolver el problema con la visibilidad de la página, justo antes de la onpageshow istrigger puede utilizar el evento onbeforeunload. Durante este evento puede cambiar el cuerpo de la opacidad a 0. Así que, sí, pero la página se hará una breve visible, pero con la opacidad a 0. (la ventana.onbeforeunload = () => { document.cuerpo.opacidad = 0; } ). Esto funciona con Safari 11.
    • No funciona en Chrome (el escritorio también) debido a un error de bugs.chromium.org/p/chromium/issues/…
  2. 6

    Sí, el navegador Safari no manejar de vuelta/prólogo botón de caché de la misma como Firefox y Chrome no. Especialmente iframes como vimeo o youtube, los vídeos se almacenan en la caché apenas pesar de que hay una nueva iframe.src.

    He encontrado tres maneras de manejar esto. Elegir el mejor para su caso.
    Soluciones que se han probado en Firefox 53 y Safari 10.1

    1. Detectar si el usuario está usando la parte de atrás/prólogo botón, a continuación, volver a cargar toda la página o volver a cargar la caché de sólo iframes mediante la sustitución de la src

    if (!!window.performance && window.performance.navigation.type === 2) {
                //value 2 means "The page was accessed by navigating into the history"
                console.log('Reloading');
                //window.location.reload(); //reload whole page
                $('iframe').attr('src', function (i, val) { return val; }); //reload only iframes
            }

    2. recargar toda la página si la página se almacena en caché

    window.onpageshow = function (event) {
            if (event.persisted) {
                window.location.reload();
            }
        };

    3. eliminar la página de la historia para que los usuarios no puede visitar la página de nuevo mediante los botones atrás/adelante

    $(function () {
                //replace() does not keep the originating page in the session history,
                document.location.replace("/Exercises#nocache"); //clear the last entry in the history and redirect to new url
            });
  3. 4

    Todos aquellos respuesta son un poco de la hack. En los modernos navegadores (safari) sólo en onpageshow solución de trabajo,

    window.onpageshow = function (event) {
            if (event.persisted) {
                window.location.reload();
            }
        };

    pero en lento dispositivos a veces, usted verá una fracción de segundo anterior en caché de la vista antes de que se volverá a cargar. Manera adecuada de tratar con este problema es establecer correctamente Cache-Control en la respuesta del servidor a un fuelle

    'Cache-Control', 'no-cache, max-age=0, must-revalidate, no-store'

  4. 1

    Puede utilizar un ancla, y ver el valor de la ubicación del documento href;

    Empezar con http://acme.co/, agregar algo a la ubicación, como ‘#b’;

    Así que, ahora que su URL es http://acme.co/#b, cuando una persona golpea el botón volver, se vuelve a http://acme.co, y el intervalo de verificación de la función ve la falta de la etiqueta de hash que nos fijemos, borra el intervalo, y carga la URL de referencia con un sello de tiempo añadido.

    Hay algunos efectos secundarios, pero te dejo con la figura de aquellos 😉

    <script>
    document.location.hash = "#b";
    var referrer = document.referrer;
    
    //setup an interval to watch for the removal of the hash tag
    var hashcheck = setInterval(function(){
        if(document.location.hash!="#b") {
    
        //clear the interval
        clearInterval(hashCheck);
    
        var ticks = new Date().getTime();
        //load the referring page with a timestamp at the end to avoid caching
        document.location.href.replace(referrer+'?'+ticks);
        }
    },100);
    </script>

    Esto no está probado, pero debería funcionar con un mínimo de ajustes.

    • divertido , el único aún solución de trabajo obtiene una calificación negativa
  5. 0

    El comportamiento está relacionado con Safari Atrás/Adelante del caché. Usted puede aprender acerca de ello en la correspondiente documentación de Apple: http://web.archive.org/web/20070612072521/http://developer.apple.com/internet/safari/faq.html#anchor5

    La propia Apple revisión sugerencia es agregar un vacío iframe en tu página:

    <iframe style="height:0px;width:0px;visibility:hidden" src="about:blank">
        this frame prevents back forward cache
    </iframe>

    (El anterior aceptado la respuesta parece válida demasiado, sólo quería chip de la documentación y la otra solución posible)

  6. 0

    Primero de todos insertar campo en el código:

    <input id="reloadValue" type="hidden" name="reloadValue" value="" />

    a continuación, ejecute de jQuery:

    jQuery(document).ready(function()
    {
            var d = new Date();
            d = d.getTime();
            if (jQuery('#reloadValue').val().length == 0)
            {
                    jQuery('#reloadValue').val(d);
                    jQuery('body').show();
            }
            else
            {
                    jQuery('#reloadValue').val('');
                    location.reload();
            }
    });

Dejar respuesta

Please enter your comment!
Please enter your name here