2012-07-14 7 views
5

Si tiene un título mejor para esta pregunta, siéntase libre de editarlo.location.reload with cache

Durante mucho tiempo, siempre he usado location.reload() para volver a cargar la página, es lo más lógico que hacer, ¿no?

Pero recientemente me di cuenta de que no es el equivalente a F5, como había pensado al principio, sino más de Ctrl + F5. Todas las imágenes y otros archivos vinculados se volvieron a solicitar del servidor, cuando todo lo que quería hacer era volver a cargar la página.

Descubrí que podía usar location.replace(location.href) y esto parece lograr el efecto que quiero: volver a cargar la página pero recuperar los archivos vinculados de la memoria caché.

¿Es esto ideal? ¿Hay una mejor manera que esto? ¿He pasado por alto las trampas que este método puede tener?

(nota: Ya tengo gestión de almacenamiento en memoria caché de archivos vinculados, tales como scripts, añadiendo el filemtime como una cadena de consulta)

+0

window.location.reload (false); se volverá a cargar desde la memoria caché ... – Drewness

+0

@TGxANAHEiiMx ["Si es falso o no se especifica, el navegador puede volver a cargar la página desde su caché."] (https://developer.mozilla.org/en/DOM/window. ubicación): tenga en cuenta el uso de "may" y "la página"; no dice nada sobre "will" o archivos vinculados. –

+0

Ah, punto tomado. No es el mejor, ya que te estás acercando desde un punto de vista de 'mejores prácticas' y no solo una situación 'funcional' ... – Drewness

Respuesta

4

En respuesta a mi propia pregunta, hay una trampa masiva: Cuando la ubicación contiene un hash, el navegador saltará a ese hash en lugar de volver a cargar la página.

La solución que he implementado es el siguiente:

reload = (function() { 
    var m = location.search.match(/[?&]__hash=([^&]+)/); 
    if(m) location.hash = unescape(m[1]); 
    return function() { 
      var h = location.hash; 
      if(h == "") { 
        location.replace(location.href); 
      } 
      else { 
        var s = location.search; 
        s = s.replace(/[?&]__hash=[^&]+/,''); 
        s += (s == "" ? "?" : "&")+"__hash="+escape(h); 
        location.replace(location.pathname+s); 
      } 
    }; 
})(); 

Suponiendo que nada en el lado del servidor utiliza $_GET['__hash'], esto puede ser utilizado con seguridad.