JavaScript. Подробное руководство, 6-е издание, стр. 400

<b>    // На этот раз нам требуется получить индекс по названиям городов</b>

<b>    var index = store.index(”cities&quot;);</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(&quot;zipcodes&quot;);</b>

<b>  output.innerHTML = &quot;Найденные индексы:&quot;;</b>

<b>  lookupZipcodes(city, function(o) {</b>

<b>    var div = document.createElement(&quot;div&quot;);</b>

<b>    var text = o.zipcode + &quot;: + o.city + &quot;, &quot; + 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(&quot;div&quot;);</b>

<b>  statusline.style.cssText =</b>

<b>    &quot;position:fixed; left:0px; top:0px; width:100%;&quot; +</b>

<b>    &quot;color:white; background-color: black; font: bold 18pt sans-serif;&quot; +</b>

<b>    &quot;padding: 10px; &quot;;</b>

<b>  document.body.appendChild(statusline);</b>

<b>  function status(msg) { statusline.innerHTML = msg.toString(); };</b>

<b>  status(&quot;Инициализация базы данных почтовых индексов&quot;);</b>

<b>  // Единственное место, где можно определить или изменить структуру</b>

<b>  // базы данных IndexedDB - обработчик onsucess запроса setVersion.</b>

<b>  var request = db.setVersion(&quot;1&quot;); // Попробовать изменить версию БД</b>

<b>  request.onerror = status; // Вывести сообщение в случае ошибки</b>

<b>  request.onsuccess = function() { // Иначе вызвать эту функцию</b>

<b>    // База данных почтовых индексов включает единственное хранилище.</b>

<b>    // Оно хранит объекты следующего вида: {</b>

<b>    // zipcode: &quot;02134&quot;, // Отправьте на телепередачу Zoom!<a name="read_bookmark_60_back" href="#read_bookmark_60" class="note">[60]</a>:-)</b>