Il sito Web mostra errori JavaScript su iPad / iPhone sotto 3G ma non sotto WiFi

Collegandosi a http://www.manage-us.com su un iPad con 3G [usato per] si genera un errore JavaScript che può essere visto se la console di sviluppo è stata abilitata. Se si accede alla stessa pagina utilizzando lo stesso iPad con una connessione WiFi, non viene visualizzato alcun errore. [L’errore è ora passato perché ho applicato la correzione qui sotto!].

Perchè è questo?

Ho provato a simulare una larghezza di banda ridotta (usando dummynet) su Safari su Mac e sul simulatore iPad su Mac. Questo non riproduce il problema.

Attualmente sospetto che questo sia un problema introdotto dal mio operatore di telefonia mobile nel Regno Unito (O2), che è noto per modificare alcuni contenuti attraverso una cache proxy come il downgrade dei file di immagine. Se è ansible confermare che non si verifica questo problema durante la connessione tramite 3G su iPad o iPhone tramite un altro operatore mobile che sarebbe utile.

Ho studiato ulteriormente e ho scoperto che il problema è che l’operatore mobile britannico O2 (l’originale operatore iPhone esclusivo per Apple), modifica i contenuti web prima di inviarli a iPhone e iPad. Probabilmente prima di inviarlo a qualsiasi dispositivo che esegue un browser mobile.

Sono inline non deterministicamente alcuni dei CSS e JavaScript nei principali file sorgenti delle pagine web. Questo può creare errori a causa di errori nel loro algoritmo o la conseguenza di rimuovere lo spazio bianco dai file sorgente con errori sintattici nei file sorgente che erano altrimenti benigni.

Queste modifiche eliminano anche i messaggi di copyright dalle librerie javascript e dalle librerie css protette da copyright e creano scompiglio con le ottimizzazioni della consegna.

Ad esempio, immagina se un utente sta visitando una sequenza di pagine sul tuo sito che si collegano tutte alle librerie jQuery. Invece di lasciare che il browser mobile memorizzi nella cache la libreria, O2 inline la libreria su ogni pagina, costringendo il telefono a caricare l’intera libreria più e più volte per ogni pagina.

Ho scritto un blog sul problema qui nella speranza se attirando un po ‘più attenzione su questo: http://stuartroebuck.blogspot.com/2010/07/mobile-proxy-cache-content-modification.html

La mia soluzione alternativa è usare document.write() per inserire le dipendenze della libreria JavaScript al momento del caricamento e impedire a O2 di inlining. Questo sembra funzionare abbastanza bene. per esempio:

  

Nota che, come sempre, document.write non funzionerà se la pagina viene pubblicata come XHTML.

Per chiunque abbia bisogno di una soluzione a questo in ASP.NET, questo imposta l’intestazione Cache-Control come da http://stuartroebuck.blogspot.com/2010/08/official-way-to-bypassing-data.html per i file javascript usando URL Rewrite Module 2.0 http://learn.iis.net/page.aspx/665/url-rewrite-module-20-configuration-reference .

               

In alternativa si può fare usando un HttpModule

 public class AddHeaderModule : IHttpModule { public void Init(HttpApplication context) { context.EndRequest += OnEndRequest; } void OnEndRequest(object sender, System.EventArgs e) { if(HttpContext.Current.Response.ContentType.Contains("javascript")) HttpContext.Current.Response.Headers.AddHeader("Cache-Control", "no-transform"); } } 

e