javascript - 缓存 list 更新因 'ondownloading' 事件而挂起

标签 javascript html html5-appcache

我有一个使用 HTML5 应用程序缓存的离线应用程序。在大多数情况下,它运行良好。我有一些客户端在多个设备(桌面、IOS、Android 等)上访问该应用程序

最初的问题是,每当客户端的 Web 服务器因维护或任何其他目的而重新启动时,应用程序就会停止在某些设备上运行。他们刚刚收到运行时服务器错误。我们能够通过在服务器重新启动时在启动时务实地更新缓存 list 文件来解决此问题。我们从未弄清楚为什么重新启动服务器需要在某些设备上更新缓存,但它确实有效,因此我们将其搁置以供稍后研究。

现在我们有一个新问题。有些Android设备当服务器重新启动时,不会更新缓存。如果手动更新缓存 list 而不重新启动服务器,则缓存更新正常,但如果服务器重新启动,Android 在“检查监听器”和“下载监听器”期间按预期工作,但它永远不会移动到“进度监听器”。它不会陷入错误“错误监听器”,它只是完成 ondownloading 函数然后停止。

这是我的代码: 以下所有代码均位于外部js文件中,并在aspx项目母版页的头部调用registerCacheMethod。

    var updatePhase = 'none';
    var cacheCount = -1;


    function handleCacheUpdated()
    {
        updatePhase = 'handleCacheUpdated()';
        $('#modal_body_progress').html('Cache Updated Successfully');

        alert('The application was updated. Login required.');

        window.location.href = 'Login.aspx';
    }


function handleOnDownloading()
{

          updatePhase = 'Downloading';

          $('#modal_body_Header').html('Cache Update');

          $('#modal_body_text').html('Please do not close the browser or navigate away from this page while updating.');


          $('#modal_body_progress').html('Updating...');

          $('#modal_popup_container').css('display','inline');

          cacheCount = 0;

     return false;
}
function handleOnProgress()
{
    updatePhase = 'Progress';
    cacheCount++;
    $('#modal_body_progress').html('Updating Entry: ' + cacheCount);
    return false;
}
function handleCacheError(e)
{
    $('#modal_body_progress').html('Error Loading Entry: (Count: ' + cacheCount + ', Phase: ' + updatePhase + ')');


    return false;
}

    function handleNoUpdate()
    {
        updatePhase = 'No Update';
    }
    function handleChecking()
    {
        updatePhase = 'Checking';
    }
    function handleCacheObsolete()
    {
        updatePhase = 'CacheObsolete';
    }

 function registerCacheMethods(method)
    {

        try
        {
            var cache = window.applicationCache;
            if (cache == undefined) 
            {
                alert('This browser does not support Application Cache');
                return false;
            }
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            /*
            * Between the poll and registering of the event you might miss the CACHEREADY event. This block will handle this.
            */
            if (cache.status === applicationCache.UPDATEREADY)
            {
                handleCacheUpdated();
                return false;
            }
            cache.addEventListener('updateready', handleCacheUpdated, false);
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            cache.addEventListener('cached', handleCacheUpdated, false);
            cache.addEventListener('noupdate', handleNoUpdate, false);
            cache.addEventListener('downloading', handleOnDownloading, false);
            cache.addEventListener('progress', handleOnProgress, false);
            cache.addEventListener('error', handleCacheError, false);
            cache.addEventListener('obsolete', handleCacheObsolete, false);
            cache.addEventListener('checking', handleChecking, false);
        }
        catch (EX)
        {
            return false;
        }
    }

编辑

我设法找到了更多关于此的信息。第一,我找到了有问题的设备和浏览器。该问题发生在运行 Android 4.3 的 Samsung Galaxy S3 上。有了这个新信息,我发现有人已经问过类似的问题Here

最佳答案

我相信您在这里遇到了 IIS(或您使用的 Web 服务器)配置问题。首先,当您忽略第一次重新启动问题时,您基本上打开了一扇新的门来获取新的错误,可能这就是为什么每种浏览器类型的行为不同的原因。我建议您首先关注重新启动问题。如果我没记错的话,请确保您的 Web 服务器或(客户端自己的 Web 服务器)必须配置为设置 *.appcache 文件的过期 header 以立即过期。 &您永远不应该手动访问缓存文件。对于 apache 这个指令有效。

ExpiresByType text/cache-manifest“访问加 0 秒”

关于javascript - 缓存 list 更新因 'ondownloading' 事件而挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994369/

相关文章:

html - 在具有指定字体的 UILabel 中显示 html 标签

ruby-on-rails-3 - 如何水平对齐从 rails 循环生成的 Div

javascript - 如何使用 javascript 或 angularjs 显示嵌套 json 结构中的名称值?

javascript - 使用 chrome.bluetooth API 连接到设备

javascript - Ionic 2 - 属性不存在类型错误

javascript - Safari 不使用应用程序缓存 list

service-worker - 缓存存储与应用程序缓存

javascript - 如何根据用户输入发送API请求

html - 如何使<ul> <li>在内容中居中且没有左右边距

jquery - 当我使用 Appcache Manifest 请求外部资源时,为什么 jQuery 会抛出错误?