<b> // На этот раз нам требуется получить индекс по названиям городов</b>
<b> var index = store.index(”cities");</b>
<b> // Этот запрос может вернуть несколько результатов, поэтому, чтобы</b>
<b> // получить их все, следует использовать объект курсора. Чтобы создать</b>
<b> // курсор, нужно создать объект диапазона, представляющий диапазон ключей</b>
<b> var range = new IDBKeyRange.only(city); // Диапазон с одним ключом</b>
<b> // Все, что выше, выполняется синхронно.</b>
<b> // Теперь нужно запросить курсор, который возвращается асинхронно,</b>
<b> var request = index.openCursor(range); // Запросить курсор</b>
<b> request.onerror = logerr; // Сообщать об ошибках</b>
<b> request.onsuccess = function() { // Передать курсор этой функции</b>
<b> // Этот обработчик событий будет вызван несколько раз, по одному</b>
<b> // для каждой записи, соответствующей запросу, и еще один раз</b>
<b> // с пустым курсором, указывающим на окончание результатов,</b>
<b> var cursor = request.result // Курсор в свойстве</b>
<b> request.result if (!cursor) return; // Нет курсора = нет результатов</b>
<b> var object = cursor.value // Получить совпавшую запись</b>
<b> callback(object); // Передать ее указанной функции</b>
<b> cursor.continue(); // Запросить следующую запись</b>
<b> };</b>
<b> });</b>
<b>}</b>
<b>// Эта функция используется обработчиком onchange в документе ниже.</b>
<b>// Она выполняет запрос к БД и отображает результаты</b>
<b>function displayCity(zip) {</b>
<b> lookupCity(zip, function(s) { document.getElementById('city').value=s; });</b>
<b>}</b>
<b>// Это другая функция, используемая обработчиком onchange в документе ниже.</b>
<b>// Она выполняет запрос к БД и отображает результаты</b>
<b>function displayZipcodes(city) {</b>
<b> var output = document.getElementById("zipcodes");</b>
<b> output.innerHTML = "Найденные индексы:";</b>
<b> lookupZipcodes(city, function(o) {</b>
<b> var div = document.createElement("div");</b>
<b> var text = o.zipcode + ": + o.city + ", " + o.state;</b>
<b> div.appendChild(document.createTextNode(text));</b>
<b> output.appendChild(div);</b>
<b> });</b>
<b>}</b>
<b>// Настраивает структуру базы данных и заполняет ее данными, затем передает базу данных </b>
<b>// функции f(). Эта функция вызывается функцией withDB(), если база данных еще не была </b>
<b>// инициализирована. Это самая хитрая часть программы, поэтому мы оставили ее напоследок, </b>
<b>function initdb(db, f) {</b>
<b> // Загрузка информации о почтовых индексах и сохранение ее в базе данных может</b>
<b> // потребовать некоторого дополнительного времени при первом запуске этого</b>
<b> // приложения. Поэтому необходимо вывести сообщение, извещающее о выполнении операции,</b>
<b> var statusline = document.createElement("div");</b>
<b> statusline.style.cssText =</b>
<b> "position:fixed; left:0px; top:0px; width:100%;" +</b>
<b> "color:white; background-color: black; font: bold 18pt sans-serif;" +</b>
<b> "padding: 10px; ";</b>
<b> document.body.appendChild(statusline);</b>
<b> function status(msg) { statusline.innerHTML = msg.toString(); };</b>
<b> status("Инициализация базы данных почтовых индексов");</b>
<b> // Единственное место, где можно определить или изменить структуру</b>
<b> // базы данных IndexedDB - обработчик onsucess запроса setVersion.</b>
<b> var request = db.setVersion("1"); // Попробовать изменить версию БД</b>
<b> request.onerror = status; // Вывести сообщение в случае ошибки</b>
<b> request.onsuccess = function() { // Иначе вызвать эту функцию</b>
<b> // База данных почтовых индексов включает единственное хранилище.</b>
<b> // Оно хранит объекты следующего вида: {</b>
<b> // zipcode: "02134", // Отправьте на телепередачу Zoom!<a name="read_bookmark_60_back" href="#read_bookmark_60" class="note">[60]</a>:-)</b>