Sí, puedes. (Lo siento por responder a mi propia pregunta, pensé que esta era una solución interesante)
Encontré un esquema de un ejemplo de código aquí en la diapositiva # 12.
http://www.slideshare.net/jedisct1/abusing-javascript-to-speedup-mobile-web-sites
He implementado esto en http://m.bbref.com/ (todavía en fase beta)
Tienes que usar el control de versiones de la url script para limpiar la caché cuando se crea una nueva versión, pero esto funciona para las páginas con localStorage y también funcionará cuando localStorage no esté disponible. He agregado un código de depuración al pie de página para mostrar de dónde se carga el js.
He dividido esto en una secuencia de comandos para el encabezado y uno del pie de página. Estos aparecen en línea.
En la cabecera (lo he puesto aquí como usamos Modernizr añadir algunas clases a la etiqueta html y quiero que los que estaban allí lo más rápido posible para fines de representación. Podían trasladar a pie de página.
<script type="text/javascript">
// .001 is the current js version
// this script assumes it is in the root web directory.
var js_file = "site_lib.001.js";
// vars to store where the file is loaded from.
var _mob_load_js = false;
var _mob_ajax_load_js = false;
{
// if we have localStorage and the files exists there get it.
if(window.localStorage && window.localStorage[js_file]) {
// eval the js file.
try{
window.eval(window.localStorage[js_file]);
// successfully eval'ed the code, so
// we don't need to download it later.
_mob_load_js = true;
} catch (e) { _mob_load_js = false; }
}
else if (window.localStorage) {
// We have localStorage, but no cached file, so we
// load the file via ajax, eval it and then store
// the file in localStorage
// To remove previous versions, I remove all of our localStorage,
// This is extreme if we store other vars there.
window.localStorage.clear();
// standard ajax request.
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
// eval the js
try {
window.eval(xhr.responseText);
// successfully eval'ed the code, so
// we don't need to download it later.
_mob_ajax_load_js = true;
} catch (e) { _mob_ajax_load_js = false; }
try {
// store the js.
window.localStorage[js_file] = xhr.responseText;
} catch (e) {}
}
else {
return;
}
};
xhr.open("GET",js_file,true);
xhr.send();
}
};
</script>
y en el pie de página (por razones de rendimiento). pongo el método de carga estándar. tenga en cuenta que los navegadores que utilizan esta rama toda caché propiamente siempre y cuando tenga expira cabeceras establecidos.
<div id="sr_external_script"></div>
<script type="text/javascript">
// We haven't loaded the js yet, so we create a script
// tag and get the script the old fashioned way
if (!_mob_load_js && !_mob_ajax_load_js) {
var script=document.createElement("script");
script.type="text/javascript";
script.src=js_file;
document.getElementById("sr_external_script").appendChild(script);
// add a note to the footer
document.write('<div>loaded from server and not stored</div>');
}
else if (!_mob_load_js) {
// add a note to the footer
document.write('<div>loaded via ajax and stored in localStorage</div>');
}
else {
// add a note to the footer
document.write('<div>loaded from localStorage</div>');
}
</script>
he confirmado en Chrome y safari que el js se carga desde localStorage y el la funcionalidad del sitio funciona como se esperaba y no se realiza ninguna solicitud al servidor. Y he confirmado que cuando se ejecuta en IE o Firefox carga el script como se encuentra en el pie de página.
Nota: Agregué código para ajustar las evaluaciones en la captura de intentos, ya que tenía un problema en Firefox.
Sólo puede guardar cadenas en 'localStorage', y' eval() 'ing no es una buena práctica. De todos modos, podrías intentar crear un archivo JavaScript diseñado para iPhone para reducirlo. (jQuery es menos de 125 kb minificado, así que supongo que debe ser posible) – pimvdb
Sé que eval no es una buena práctica, pero el aumento de rendimiento que brinda esta técnica es sustancial. La mayoría de los js simplemente no están guardados en la caché de un safari móvil porque es demasiado grande. – Sean
"Es bien sabido que el almacenamiento en caché en el safari del iPhone está limitado a archivos de 15-25kb de tamaño" - [tal vez no más] (http://www.yuiblog.com/blog/2010/06/28/mobile) -browser-cache-limits /) –