带有 iOS 8/ Safari 的 IndexedDB
Posted
技术标签:
【中文标题】带有 iOS 8/ Safari 的 IndexedDB【英文标题】:IndexedDB with iOS 8/ Safari 【发布时间】:2014-12-04 16:48:12 【问题描述】:我们有一个测试用例来测试不同浏览器和操作系统的 indexeddb。 这只是简单的测试:
open database, add some data, retrieve some data
就是这样。它在 Chrome (39)、Firefox(新版本)、带有 OSX 9.5 的 MacBook Pro、基于 android 的浏览器中完美运行。
当我们在 ios 8 中尝试使用 Ipad3 时,页面没有做任何事情。而且我们也看不到任何错误。
任何想法,如何解决问题?
我们使用了应该有帮助的 indexeddb.shim.js 文件,但仍然无法正常工作。
if (!window.indexedDB)
window.alert("Your browser doesn't support a stable version of IndexedDB.")
var request = indexedDB.open("kitta db1");
request.onupgradeneeded = function()
//create Store and etc
;
request.onsuccess = function()
db = request.result;
;
iOS 8 中的错误:
类型错误:null不是Object就行了:
var request = indexedDB.open("kitta db1");
知道如何解决吗?
【问题讨论】:
【参考方案1】:看起来变量 indexedDB 为空。 polyfill 这样做:
e.indexedDB=e.indexedDB||e.webkitIndexedDB||e.mozIndexedDB||e.oIndexedDB||e.msIndexedDB
所以它将变量设置为这些值之一。如果这些值都是 undefined/null,则 indexedDB 变量保持为 null。
测试这些变体是否具有值(减去 Microsoft、Opera 和 Mozilla)的简单方法如下:
console.log('indexedDB: ', indexedDB);
console.log('webkitIndexedDB: ', webkitIndexedDB);
如果 webkitIndexedDB 未定义而 indexedDB 未定义,那么 iOS 显然不支持 indexedDB。
一个简单的search on caniuse.com 表示支持iOS8 和iOS8.1 上的indexedDB but buggy。
【讨论】:
两者都返回 IDBFactory 我猜这意味着它们不为空并且 iOS 支持两者。我听说过这个错误,但有什么解决方法或 API 可以修复它吗? 如果它们不为空,那么您可能不需要使用 shim。您的周围代码还有其他问题导致 indexedDB 变量未定义。也许需要 indexedDB.open 的版本参数。也许使用窗口正在做一些意想不到的事情。尝试使用不带空格的数据库名称。 我只是尝试了一切:版本号,尝试所有数据库名称的组合,仍然是同样的错误。与其他设备和浏览器完美兼容,但不适用于带有 Safari 的 iOS 8.1。它适用于 MacBook Pro 上的 Safari,虽然对我来说有点奇怪。以上是关于带有 iOS 8/ Safari 的 IndexedDB的主要内容,如果未能解决你的问题,请参考以下文章
带有自定义控件的视频无法在 iOS 上播放(Safari 和 Chrome)
带有 flexbox 的引导列在 iOS 和 Safari 上的宽度不合适
在 iOS 9 上从表视图打开 safari 视图控制器并在 iOS 8 或 7 上在 safari 中打开