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

<b>                                     IDBTransaction.READ_WRITE);</b>

<b>        // Получить ссылку на хранилище из объекта транзакции</b>

<b>        var store = transaction.objectStore(&quot;zipcodes&quot;);</b>

<b>        // Теперь обойти в цикле строки в файле с почтовыми индексами,</b>

<b>        // создать на их основе объекты и добавить их в хранилище.</b>

<b>        for(var і = 0; і &lt; lines.length; i++) {</b>

<b>          var fields = lines[i].split(&quot;,&quot;);// Значения через запятую</b>

<b>          var record = { // Сохраняемый объект</b>

<b>            zipcode: fields[0], // Все свойства - строки</b>

<b>            city: fields[1],</b>

<b>            state: fields[2],</b>

<b>            latitude: fields[3],</b>

<b>            longitude: fields[4]</b>

<b>          };</b>

<b>          // Вся прелесть IndexedDB API в том, что хранилище</b>

<b>          // объектов *по-настоящему* просто использовать.</b>

<b>          // Следующая строка добавляет запись:</b>

<b>          store.put(record); // Или add(), чтобы избежать затирания</b>

<b>        }</b>

<b>        status(&quot;Инициализация базы данных, загружено записей:</b>

<b>               + numlines + &quot;.&quot;);</b>

<b>      }</b>

<b>      if (e.type == &quot;load&quot;) {</b>

<b>        // Если это было последнее событие load, значит, мы отправили в базу</b>

<b>        // данных все сведения о почтовых индексах. Но, так как мы только</b>

<b>        // что обработали порядка 40000 записей, они все еще могут записываться</b>

<b>        // в хранилище. Поэтому мы выполним простой запрос. Когда он будет</b>

<b>        // успешно выполнен, это послужит сигналом, что база данных готова</b>

<b>        // к работе, и наконец можно удалить строку сообщения и вызвать</b>

<b>        // функцию f(), которая так давно была передана функции withDB()</b>

<b>        lookupCity(&quot;02134&quot;,</b>

<b>          function(s) { // Allston, MA</b>

<b>             document.body.removeChild(statusline); withDB(f);</b>

<b>        });</b>

<b>      }</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

<b>&lt;/script&gt;</b>

<b>&lt;/head&gt;</b>

<b>&lt;body&gt;</b>

<b>&lt;р&gt;Введите почтовый индекс, чтобы отыскать город:&lt;/р&gt;</b>

<b>Индекс: &lt;input onchange=&quot;displayCity(this.value)&quot;&gt;&lt;/input&gt;</b>

<b>Город: &lt;output id=&quot;city&quot;&gt;&lt;/output&gt;</b>

<b>&lt;/div&gt;</b>

<b>&lt;div&gt;</b>

<b>  &lt;р&gt;Введите название города (с учетом регистра символов, без названия штата),</b>

<b>   чтобы отыскать все города с этим названием и их почтовые индексы:&lt;/р&gt;</b>

<b>   Город: &lt;input onchange=&quot;displayZipcodes(this.value)&quot;&gt;&lt;/input&gt;</b>

<b>  &lt;div id=&quot;zipcodes&quot;&gt;&lt;/div&gt;</b>

<b>&lt;/div&gt;</b>

<b>&lt;р&gt;&lt;і&gt;Зтот пример работает только в Firefox 4 и Chrome 11.&lt;/i&gt;&lt;/p&gt;</b>

<b>&lt;р&gt;&lt;і&gt;Выполнение первого запроса может занять длительное время.&lt;/і&gt;&lt;/р&gt;</b>

<b>&lt;р&gt;&lt;і&gt;Вам может потребоваться запустить Chrome с </b>

<b>ключом --unlimited-quota-for-indexeddb&lt;/i&gt;&lt;/p&gt;</b>

<b>&lt;/body&gt;</b>

<b>&lt;/html&gt;</b>

22.9. Веб-сокеты

В главе 18 демонстрируется, как клиентские сценарии на языке JavaScript могут взаимодействовать с серверами по сети. Все примеры в этой главе используют протокол HTTP, а это означает, что все они ограничены исходной природой протокола HTTP: этот протокол, не имеющий информации о состоянии, состоит из запросов клиента и ответов сервера. Протокол HTTP фактически является узкоспециализированным сетевым протоколом. Более универсальные сетевые взаимодействия через Интернет (или через локальные сети) часто реализуются с использованием долгоживущих соединений и обеспечивают двунаправленный обмен сообщениями через TCP-сокеты. Довольно небезопасно предоставлять клиентскому сценарию на языке JavaScript доступ к низкоуровневым ТСР-сокетам, однако спецификация «WebSocket АРІ» определяет безопасную альтернативу: она позволяет клиентским сценариям создавать двунаправленные соединения с серверами, поддерживающими протокол веб-сокетов. Это существенно упрощает решение некоторых сетевых задач.

Прикладной интерфейс веб-сокетов удивительно прост в использовании. Сначала необходимо создать сокет с помощью конструктора

<b>WebSocket():</b>