На этом шаге мы рассмотрим понятие сериализации и метод .serialize().
Передача данных на сервер часто связана с заполнением форм пользователем. Вместо того чтобы полагаться на обычный механизм отправки формы, который выполняет загрузку ответа сервера в окно браузера как отдельную страницу, мы можем использовать средства поддержки технологии AJAX, входящие в библиотеку jQuery, чтобы отправлять данные формы асинхронно и помещать возвращаемые данные внутрь текущей страницы.
Чтобы продемонстрировать такую возможность, создадим простую форму:
<div class="letter" id="letter-f"> <h3>F</h3> <form> <input type="text" name="term" value="" id="term" /> <input type="submit" name="search" value="search" id="search" /> </form> </div>
На этот раз сценарий PHP будет возвращать несколько словарных статей, содержащих искомый термин, как подстроку в заголовке словарной статьи. Данные будут иметь ту же структуру, что и прежде, но логика их выборки будет немного иной:
foreach ($entries as $term => $entry) { if (strpos($term, strtoupper($_REQUEST['term'])) !== FALSE) { $html = '<div class="entry">'; $html .= '<h3 class="term">'; $html .= $term; $html .= '</h3>'; $html .= '<div class="part">'; $html .= $entry['part']; $html .= '</div>'; $html .= '<div class="definition">'; $html .= $entry['definition']; if (isset($entry['quote'])) { foreach ($entry['quote'] as $line) { $html .= '<div class="quote-line">'. $line .'</div>'; } if (isset($entry['author'])) { $html .= '<div class="quote-author">'. $entry['author'] .'</div>'; } } $html .= '</div>'; $html .= '</div>'; print($html); } }
Функция strpos() проверяет наличие в слове искомой подстроки. Теперь мы можем реализовать реакцию на событие отправки формы и подготовить параметры запроса, получив данные из дерева DOM:
$(document).ready(function() { $('#letter-f form').submit(function() { $('#dictionary').load('f.php', {'term': $('input[name="term"]').val()}); return false; }); });
Эта реализация дает желаемый эффект, но поиск полей ввода по имени и добавление их значений в отображение выглядит довольно громоздко. В частности, такая реализация плохо масштабируется по мере усложнения формы. К счастью, библиотека jQuery предлагает упрощенную реализацию этой часто встречающейся идиомы. Метод .serialize() воздействует на объект jQuery и преобразует соответствующие элементы DOM в строку запроса, которая может передаваться в составе запроса AJAX. Мы можем сделать наш обработчик события отправки формы более универсальным, как показано ниже:
$(document).ready(function() { $('#letter-f form').submit(function() { $.get('f.php', $(this).serialize(), function(data) { $('#dictionary').html(data); }); return false; }); });
Рис.1. Вид страницы после выполнения операции поиска
Рис.2. Вид страницы с операцией выполнения поиска
Полный текст этого примера можно взять здесь.Теперь тот же самый сценарий сможет отправлять данные формы даже при увеличении количества полей в форме. После выполнения поиска на странице отображаются найденные словарные статьи, как показано на рисунке 1.
На следующем шаге мы рассмотрим слежение за ходом выполнения запроса.