Согласно спецификации, ваша точечная нотация правильная.Предполагается, что браузер должен выполнить шаги для извлечения ключа из значения с использованием пути к ключу , что должно привести к желаемой функциональности.
Chrome 12 работает, как описано.Я не смог заставить Firefox 4.0 или 5.0 вести себя таким образом, и подозреваю, что это ошибка в их реализации (иначе спецификация отличалась, когда они это реализовали).
Firefox 4.0 - 5.0 ДЕЛАЕТ правильноразбирать ключевой путь, если он не содержит периодов.Как вы говорите, это означает, что у вас должны быть ключи на верхнем уровне вашего объекта, если вы хотите, чтобы он работал в Firefox.
Вот пример рабочего кода (для Chrome 12 и Firefox 4.0 - 5.0), который иллюстрируетразница:
(function () {
var db, idb = window.mozIndexedDB || window.webkitIndexedDB;
idb.open("test").onsuccess = function (ev) {
db = ev.target.result;
db.setVersion("1.0").onsuccess = setUpDatabase;
};
function setUpDatabase(ev) {
var x, store;
for (x = 0; x < db.objectStoreNames.length; x += 1) {
db.deleteObjectStore(db.objectStoreNames[x]);
}
var store = db.createObjectStore("test", {
keyPath: (window.mozIndexedDB) ? 'moz' : 'doc.webKit'
});
store.add({ moz: 1, doc: { webKit: 3, name: 'webkit!' }});
store.add({ moz: 3, doc: { webKit: 1, name: 'mozilla!' }});
// Wait for the setVersion transaction to end...
// This is an example. Typically control would return to the
// event loop after this point.
window.setTimeout(getSomeValue, 1000);
};
function getSomeValue() {
db.transaction("test").objectStore("test").get(3).onsuccess = showValue;
}
function showValue(ev) {
var value = ev.target.result.doc;
alert('name: ' + value.name);
// Don't forget to close your connections!
db.close();
}
}());