网站在 iPad / iPhone 上显示 JavaScript 错误,在 3G 下但在 WiFi 下没有

Posted

技术标签:

【中文标题】网站在 iPad / iPhone 上显示 JavaScript 错误,在 3G 下但在 WiFi 下没有【英文标题】:Web site exhibits JavaScript error on iPad / iPhone under 3G but not under WiFi 【发布时间】:2011-03-17 23:28:30 【问题描述】:

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

这是为什么?

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

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

【问题讨论】:

iPad 是否根据连接类型更改用户代理字符串?也许服务器正在相应地提供不同的页面? “Javascript 错误” - 需要详细说明吗? 当前错误是:“ReferenceError: 找不到变量:liftAjax”。我之前在页面上有 Google Analytics 代码,并且与未终止的 cmets 相关的不同 JavaScript 错误在包含的 ga.js 代码中表现出来。 (但仅限 3G 连接时) 现在又在 ga.js 代码中显示屏幕错误。 为了清楚起见 - 该网站不再显示错误,因为我应用了下面的修复程序。同样令人感兴趣的是同一问题的另一个独立案例:oh7lzb.blogspot.com/2010/07/… 【参考方案1】:

我对此进行了进一步调查,发现问题在于英国移动运营商 O2(Apple 最初的独家 iPhone 运营商)在将 Web 内容发送到 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>

请注意,与以往一样,如果页面以 XHTML 形式提供,document.write 将不起作用。

【讨论】:

很好看。我注意到 O2 在通过 3G 提供服务时会压缩站点(当我在 iPhone 上使用网络共享时也会发生这种情况),但我没有意识到它们有时会导致 JavaScript 错误。我已经就此联系过他们;祈祷他们会在某个时候解决问题。 @Paul - O2 有没有就这件事回复你?我刚刚在它制作的网站上使用 jQuery 遇到了同样的问题,它破坏了它。他们有什么反馈吗?可能忽略了你不是吗... @ppumkin:你看过 sroebuck 关于这个问题的博文吗?这里有一个很好的总结:stuartroebuck.blogspot.com/2010/07/… @ppumkin:这里有一个解决方法:stuartroebuck.blogspot.com/2010/08/… @PaulD.Waite 谢谢。 5 年后他们仍然在努力【参考方案2】:

对于任何需要在 ASP.NET 中解决此问题的人,这将按照 http://stuartroebuck.blogspot.com/2010/08/official-way-to-bypassing-data.html 为使用 URL 重写模块 2.0 http://learn.iis.net/page.aspx/665/url-rewrite-module-20-configuration-reference 的 javascript 文件设置 Cache-Control 标头。

<system.webServer>
        <rewrite>
            <outboundRules>
                <rule name="Compression header" preCondition="Match JS Files">
                    <match serverVariable="RESPONSE_Cache-Control" pattern="(.*)" />
                    <action type="Rewrite" value="no-transform" />
                </rule>
                <preConditions>
                    <preCondition name="Match JS Files">
                        <add input="RESPONSE_CONTENT_TYPE" pattern="(javascript)$" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>

也可以使用 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");
    

<configuration>
   <system.web>
      <httpModules>
         <add name="AddHeaderModule" type="your.namespace.AddHeaderModule" />
      </httpModules>
   </system.web>
</configuration>

【讨论】:

以上是关于网站在 iPad / iPhone 上显示 JavaScript 错误,在 3G 下但在 WiFi 下没有的主要内容,如果未能解决你的问题,请参考以下文章

在 iPad 和 iPhone 上显示 UIwebview

缩略图图像不显示在 iPhone 或 iPad 上,但在 Android 上显示

使用 plist 文件在 iPhone / iPad 上安装应用程序时如何正确显示图标和进度?

iOS 智能应用横幅 - 在 iPad 上显示,而不是在 iPhone 上

如果在 iPad 上查看,iOS 6 Smart Banner for Phone 应用程序会在网站上显示吗?

iphone/ipad前端开发技巧