これは予期されたブラウザの動作ですか?
それは確かに意図された動作です。http://diveintohtml5.info/offline.html#debuggingを参照してください
if even a single resource listed in your cache manifest file fails to download properly, the entire process of caching your offline web application will fail. Your browser will fire the error event, but there is no indication of what the actual problem was.
私が考えることができる1つの解決策はbeforeunload
、 the が または のいずれかであるかどうかをwindow.applicationCache.status
確認することです。checking
downloading
または、ユーザーの localStorage にフラグを設定して、error
イベント (以下を参照) を使用して最後の試行が失敗したことを示し、すべてが正常にロードされるまでファイルの再フェッチを試みることができる場合があります。
キャッシュするものがたくさんある場合は、進行状況バーと、ページの読み込み中にユーザーに辛抱するように求めるテキストを表示できます。進行状況バーについては、キャッシュ処理関数の進行状況イベントでevent.loaded
使用できます。event.total
var appCache = window.applicationCache;
// Fired after the first cache of the manifest.
appCache.addEventListener('cached', handleCacheEvent, false);
// Checking for an update. Always the first event fired in the sequence.
appCache.addEventListener('checking', handleCacheEvent, false);
// An update was found. The browser is fetching resources.
appCache.addEventListener('downloading', handleCacheEvent, false);
// The manifest returns 404 or 410, the download failed,
// or the manifest changed while the download was in progress.
appCache.addEventListener('error', handleCacheError, false);
// Fired after the first download of the manifest.
appCache.addEventListener('noupdate', handleCacheEvent, false);
// Fired if the manifest file returns a 404 or 410.
// This results in the application cache being deleted.
appCache.addEventListener('obsolete', handleCacheEvent, false);
// Fired for each resource listed in the manifest as it is being fetched.
appCache.addEventListener('progress', handleCacheEvent, false);
// Fired when the manifest resources have been newly redownloaded.
appCache.addEventListener('updateready', handleCacheEvent, false);
function handleCacheEvent(e){
if(e.type && (e.type=='progress' || e.type=='ProgressEvent')){
console.log('percent:', Math.round(e.loaded/e.total*100)+'%', 'total:', e.total, 'loaded:',e.loaded);
}
}