网站在3G下的iPad/iPhone上展示JavaScript错误,但不在WiFi下

sro*_*uck 24 iphone proxy wifi ipad 3g

在3G下连接到iPad上的http://www.manage-us.com [曾经]导致JavaScript错误,如果启用了开发人员控制台,则可以看到该错误.如果在WiFi连接下使用同一台iPad访问同一页面,则不会显示错误.[错误现在已经消失,因为我应用了下面的修复程序!].

为什么是这样?

我尝试在Mac上的Safari和Mac上的iPad模拟器上模拟低带宽(使用dummynet).这不会重现问题.

我目前怀疑这是我的英国移动运营商(O2)引入的问题,已知通过代理缓存(例如降级图像文件)修改某些内容.如果您通过其他移动运营商通过3G在iPad或iPhone上进行连接时可以确认您没有遇到此问题.

sro*_*uck 34

我对此进行了进一步调查,发现问题在于英国移动运营商O2(Apple的原始独家iPhone运营商)在将其发送到iPhone和iPad之前修改了网络内容.可能在将其发送到运行移动浏览器的任何设备之前.

他们非确定性地将一些CSS和JavaScript内联到网页的主要源文件中.这可能会因为算法中的错误或者从源文件中剥离空格而导致源文件中的语法错误而产生错误,否则这些错误是良性的.

这些修改还剥离了受版权保护的JavaScript库和css库的版权信息,并对传递优化进行了破坏.

例如,假设用户正在访问您站点上的一系列页面,这些页面都链接到jQuery库.O2不是让您的移动浏览器在本地缓存库,而是在每个页面上内联库,强制您的手机为每个页面反复加载整个库.

我在这里写了一篇关于这个问题的博客,希望能引起更多关注:http: //stuartroebuck.blogspot.com/2010/07/mobile-proxy-cache-content-modification.html

我的解决方法是使用document.write()在加载时插入JavaScript库依赖项并防止O2内联它们.这看起来效果很好.例如:

<script type="text/javascript">
// <![CDATA[
// Using document.write to load JavaScript dependencies to bypass O2 network inlining of JavaScript.
function loadJS(file){document.write("<" + "script type='text/javascript' src='" + file + "'></" + "script>")}
loadJS("/js/jquery-1.4.2.min.js");
loadJS("/js/myJSLibrary.js");
// ]]>
</script>
Run Code Online (Sandbox Code Playgroud)

请注意,document.write如果页面作为XHTML提供,将无法工作.

  • @ppumkin:以及解决方法:http://stuartroebuck.blogspot.com/2010/08/official-way-to-bypassing-data.html (4认同)
  • @ PaulD.Waite谢谢你.5年后他们仍在使用它 (2认同)