Показаны сообщения с ярлыком jQuery. Показать все сообщения
Показаны сообщения с ярлыком jQuery. Показать все сообщения

воскресенье, 5 февраля 2017 г.

Универсальный скрипт формы обратной связи для сайта на jQuery AJAX


Форма обратной связи для сайта на jQuery AJAXПривет друзья! Наконец-то, после десятка писем на почту с просьбой поделиться скриптом, решил рассказать вам про свой универсальный скрипт формы обратной связи, который работает на AJAX, имеет встроенную проверку полей формы на валидность и подойдет для любого сайта на любом движке, или даже на чистом html.
Сразу стоит сказать, что это не полностью моя разработка, изначально этот скрипт был найден на просторах буржунета, но впоследствии основательно мной переделанный. Так что часть авторства все же принадлежит мне ;)
Реализация формы обратной связи таким образом, когда ссылка на нее присутствует на каждой странице сайта и всегда в зоне видимости, очень удобна, а посетителям не придется долго её искать. Так же в эту форму можно добавить любые ваши контактные данные, например, ICQ, телефон или skype, в общем, все что захотите.
Форма обратной связи alaev.info
Итак, речь идет вот об этой штуковине --->
В работе вы можете увидеть эту форму на любой странице моего блога. Может быть, кто-то из вас ей даже пользовался.
Приступаем к делу. Чтобы получить такую же форму, вам потребуется выполнить два пункта — установка и настройка — они описаны ниже.

Архивы contactable UTF-8 и Windows-1251

Для сайта с кодировкой UTF-8: contactable.zip
Для сайта с кодировкой windows-1251: contactable_cp1251.zip
Как узнать кодировку своего сайта? Открываем сайт в браузере, нажимаем Ctrl+U (Просмотр исходного кода) и в самом начале находим строку:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
или
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Отсюда сразу понятно, какая у вас кодировка и, следовательно, какой архив необходимо скачать.

Как установить форму обратной связи?

В следующем разделе отдельно представлена установка для CMS WordPress.
Установка проходит в 7 шагов:
  1. Скачиваем архив в нужной кодировке и распаковываем.
  2. Вносим изменения в файлы mail.php и jquery.contactable.js (см. раздел настройка ниже).
  3. Папку contactable и все ее содержимое закидываем на сервер в удобное для вас место.
  4. В шаблоне своего сайта между тегами <head> и </head> вставляем следующий код:
    <link rel="stylesheet" href="http://site.ru/your/path/contactable/contactable.css" type="text/css" />
    где, http://site.ru/your/path/ надо заменить на путь к директории /contactable/ на вашем сервере.
  5. В шаблоне своего сайта ПОСЛЕ открывающего тега <body> вставляем следующий код:
    <div id="contactable"><!-- contactable html placeholder --></div>
  6. В шаблоне своего сайта ПЕРЕД закрывающим тегом </body> вставляем следующий код:
    <!--start contactable js -->
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js?ver=1.7.1"></script>
    <script type="text/javascript" src="http://site.ru/your/path/contactable/jquery.validate.min.js"></script>
    <script type="text/javascript" src="http://site.ru/your/path/contactable/jquery.contactable.js"></script>
    <script type="text/javascript">$(function(){$('#contactable').contactable();});</script>
    <!--end contactable js -->
    где, http://site.ru/your/path/ надо заменить на путь к директории contactable/ на вашем сервере.
    Очень важный момент! Если у вас на сайте уже подключена библиотека jQuery (а в большинстве случаев это так), то второй раз подключать ее нельзя. В таком случае в коде выше надо убрать строку:
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js?ver=1.7.1"></script>
    Иначе могут возникнуть конфликты — или форма не заработает, или сайт может «развалиться».
  7. Сохраняем файл шаблона. Обновляем любую страницу сайта и начинаем тестировать форму обратной связи!
Все готово!

Установка формы обратной связи для сайта на WordPress

Решил отдельно написать о том, как более удобно и правильно подключить данный скрипт для блога на движке WordPress.
  1. Скачиваем архив. WordPress по умолчанию представлен в кодировке UTF-8, по этому не ошибитесь с архивом ;)
  2. Редактируем файлы mail.php и jquery.contactable.js (см. раздел настройка ниже).
  3. Папку contactable вместе с содержимым заливаем в папку на сервере /wp-content/plugins/. То есть должно получиться так /wp-content/plugins/contactable/
  4. Идем в админке во «Внешний вид» -> «Редактор», выбираем файл header.php, находим там </head> и ВЫШЕ вставляем:
    <script type="text/javascript">$(document).ready(function(){$('#contactable').contactable();});</script>
    Жмем «Обновить файл»;
  5. Там же в редакторе открываем файл functions.php и в самый конец, перед ?> вставляем:
    /*** Добавляем в wp_head свои css ***/
     function my_css() {
      echo '<link rel="stylesheet" type="text/css" href="http://site.ru/wp-content/plugins/contactable/contactable.css" media="screen" />'."\n";
     }
     add_action('wp_head', 'my_css', 5);
    где, http://site.ru/ надо заменить на адрес своего сайта.
    Данной функцией мы добавим в <head> </head> css файл стилей формы.
    Далее, опять же перед ?> вставляем:
    /*** Добавляем в wp_head свои js скрипты ***/
     if( !is_admin()){
      wp_deregister_script('jquery');
      wp_register_script('jquery', ("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"), false, '1.7.1');
      wp_enqueue_script('jquery');
      wp_enqueue_script('validate', '/wp-content/plugins/contactable/jquery.validate.min.js', 'jquery', '1.8.0');
      wp_enqueue_script('contactable', '/wp-content/plugins/contactable/jquery.contactable.js', 'jquery', '1.2.1');
     }
    Этим кодом мы делаем следующее: на всех страницах (кроме админки) мы отключаем стандартную вордпрессовскую библиотеку jquery, а вместо нее подключаем самую новую с серверов Гугла (не переживайте на счет того, что js будет подгружаться с внешнего сервера, во-первых, сервера Гугла самые надежные в мире, во-вторых, мы даже немного снизим нагрузку на свой сервер); далее после подключения jquery, сразу подключаются два js-скрипта формы связи с условием их подключения строго после jquery (это тот случай, когда порядок подключения скриптов имеет больше значение, и если не подключить jquery перед скриптами формы, то форма не заработает).
    Жмем «Обновить файл».
  6. Очищаем кеш, если у вас установлен плагин WP Super Cache или подобный.
  7. Обновляем любую страницу своего блога и видимо форму ;)
Как видите, ничего сложного в установке нет.

Настройка формы

Перед тем как заливать файлы из архива к себе на сервер (третий шаг установки), надо внести в них некоторые правки.
  1. Открываем файл jquery.contactable.js и находим там следующий код:
      var defaults = {
       url: 'http://site.ru/your/path/contactable/mail.php',
       name: 'Ваше имя',
       email: 'Ваш E-mail',
       message : 'Сообщение',
       subject : 'Feedback from MySite',
                  page : location.href,
       submit : 'Отправить письмо',
       recievedMsg : 'Благодарю вас за письмо',
       notRecievedMsg : 'Извините, но при отправке письма произошла ошибка, попробуйте позже',
       disclaimer: 'Пожалуйста, не стесняйтесь отправлять сообщения. Я буду очень признателен за все отзывы и с радостью отвечу на все ваши вопросы!',
       hideOnSubmit: true
     
      };
    Как минимум нам надо изменить для переменной url путь к директории contactable/ на вашем сервере. Эта процедура аналогична четвертому пункту установки. Остальные переменные можете изменять по своему усмотрению.
  2. Открываем файл mail.php и находим там следующий код:
     $contactMessage =
    "Имя отправителя: $name <$emailAddr>
     
    $comment
     
    Письмо отправлено со страницы: $page
    IP отправителя: $_SERVER[REMOTE_ADDR]";
     
      //send the email
      mail('admin@site.ru', $subject, $contactMessage, $headers);
    Здесь вам необходимо прописать свой контактный e-mail, на который будут сыпаться письма. То есть заменяем admin@site.ru на свой ящик.
    Переменная $contactMessage содержит шаблон письма, которое вы будет получать. По умолчанию в шаблоне присутствуют имя и ящик отправителя, само сообщение, страница с которой было отправлено письмо (мне показалось, что это интересная информация для анализа) и IP адрес. Все это можете отредактировать как вам захочется.
  3. По желанию можете изменять внешний вид самой формы, ее цвета и т.д., все css-стили хранятся в файле contactable.css
  4. На этом настройка завершена.

Всякие дополнительные фишки

  1. Если вы хотите, чтобы после отправки сообщения показывалось не только «Спасибо за письмо», но и происходило перемещение пользователя на заданную страницу, необходимо проделать следующее:
    Открываем файл jquery.contactable.js и находим:
       $(this_id_prefix+'#callback').show().append(options.recievedMsg);
    и НИЖЕ добавляем:
       document.location.href="http://alaev.info";
    где нужно вместо http://alaev.info прописать адрес вашей страницы, куда вы хотите переместить пользователя.

Что еще стоит сказать про этот скрипт?

  • Форма обратной связи с капчей уже не рулит, потому что данный скрипт работает только при включенном javascript, а у ботов он выключен, соответственно пользователям никакую капчу вводить не придется, а у вас не будет спама.
  • После установки у вас может возникнуть проблема с кодировкой, поэтому проследите, что вы скачали подходящий архив (я специально подготовил две версии для скачивания). Сохраняйте файлы после редактирования в правильной кодировке (в большинстве случаев принудительно указывать кодировку не придется, но мало ли).
  • На вопрос «А как сделать чтобы это было справа, а не слева?» отвечаю сразу — исходники открыты, колупайте на здоровье!
  • Да, эта форма обратной связи не поддерживает аттачи. Но я считаю, что этого и не надо.
  • А как сделать, чтобы после отправки сообщения форма не исчезала и можно было отправить еще одно сообщение без перезагрузки страницы? Найдите строку hideOnSubmit: true и замените на hideOnSubmit: false
  • Эта форма не работает на локальном сервере, только на сайтах в сети.
  • Пока все, но я буду добавлять сюда интересные вопросы из ваших комментариев, чтобы другие их больше не задавали ;)
Вот и все, надеюсь, для вашего сайта эта форма пригодится, пользуйтесь на здоровье!
У вас что-то не работает? Форма не отображается или отображается криво? Не выезжает и не заезжает обратно? Не устраивает стиль и внешний вид?
Придется разбираться самостоятельно и внимательно читать комментарии ниже.
На подобные вопросы в комментариях автор поста (то есть Я) не отвечает.

пятница, 26 февраля 2016 г.

Использование jQuery "поверх" микроданных

Практическое использование HTML5-микроданных: Часть 1. Использование jQuery "поверх" микроданных


В спецификации микроданных приведены две цели, которые могут побудить к использованию микроданных: позволить типовым скриптам предоставлять сервисы, адаптированные для соответствующей страницы; обеспечить единообразную обработку контента от множества сотрудничающих авторов одним скриптом. Эта серия из двух статей научит вас использовать микроданные обоими вышеуказанными способами. В первой части описывается использование типовых скриптов "поверх" микроданных. В этой статье рассматривается написание HTML-фрагмента, который обеспечивает получение интерактивной карты событий и помогает поисковым машинам Google, Bing и Yahoo лучше отображать вашу страницу в результатах поиска с использованием Rich Snippets.

Введение

Библиотеки, подобные jQuery, революционизировали способы создания сайтов разработчиками. Они резко ускорили формирование крупномасштабных наборов готовых к применению скриптов, которые разработчикам достаточно добавить к своим HTML-страницам. Микроданные могут продвинуть эту революции еще на один шаг — они упрощают создание скриптов, которые беспрепятственно работают на любом сайте, вне зависимости от различий в HTML-шаблонах.

Часто используемые сокращения

  • CSV: Comma separated value(значения, разделенные запятыми)
  • JSON: JavaScript Object Notation
  • RDF: Resource Description Framework
  • RDFa: RDF in attributes (RDF в атрибутах)
  • SEO: Search engine optimization (оптимизация для поисковых систем)
Например, для демонстрации на карте запланированных мероприятий ("событий") jQuery-плагины интегрируются с картами Google, что облегчает создание интерактивной карты на вашем сайте. Единственно, что требуется от разработчика — создать файл с соответствующими местоположениями в структурированном формате, таком как JSON или CSV. Однако наличие этих данных в виде отдельного файла в структурированном формате может порождать проблемы, если вы хотите отображать информацию страницы и в виде HTML. Чтобы поддерживать контент и в виде HTML, и в виде файла данных, вы должны написать скрипт, который осуществлял бы трансляцию между HTML-страницей и файлом данных. В противном случае вам придется дважды выполнять одну и ту же работу. Этот подход способен очень быстро привести к рассинхронизации между HTML-файлом и файлом данных.
Поддержание синхронизации между файлами является одним главных преимуществ таких форматов HTML-данных, как микроданные и RDFa. Вы можете написать HTML-код обычным образом, а затем добавить несколько атрибутов в соответствующие HTML-теги, чтобы использовать этот код в качестве хранилища для своих данных. Эти форматы HTML-данных являются веб-стандартами, которые разработаны и санкционированы такими организациями, как WHATWG и W3C, поэтому разработчики уже создают инструменты, понимающие, как извлекать данные из HTML. Вы сможете с легкостью использовать эти готовые инструменты на своем сайте.
Поскольку микроданные начали активно применяться лишь недавно, на данный момент выпущено лишь несколько плагинов с их поддержкой. Характерным примером является плагин jQuery UI Map, который поддерживает карты описанного выше типа.

Создание карты событий, готовой к применению Rich Snippets

Достаточно одного небольшого сегмента HTML-кода, чтобы не только получить интерактивную карту событий, но и улучшить поисковую оптимизацию (SEO).
Как рассказывалось в одной из прошлых статей (соответствующая ссылка приведена в разделе Ресурсы), микроданные можно использовать с терминами из словаря Schema.org, чтобы помочь поисковым машинам лучше понимать ваш контент. Этот подход позволяет поисковым машинам показывать элементы Rich Snippets, которые вводят самую важную информацию о странице непосредственно в результаты поиска. Аннотации, которые добавляются для получения Rich Snippets, могут нести двойную нагрузку. Помимо улучшения результатов поиска, вы можете использовать их на своей странице для улучшения отображения.
С этой целью этого вы будете использовать jQuery-плагин. Я включила соответствующие файлы в пример кода для загрузки, который содержит несколько измененную версию этого плагина.

Базовый перечень событий

Давайте создадим перечень событий для мероприятий DrupalCamp, проводимых по всему миру. Для начала создайте HTML-страницу с двумя событиями (см. листинг 1).
Листинг 1. Базовый HTML-перечень с двумя событиями
<!DOCTYPE html>
  <head>
    <title>Upcoming DrupalCamps</title>
  </head>
  <body id="doc">
    <h1>Upcoming DrupalCamps</h1>

    <!-- Event 1: DrupalCamp Toulouse -->
    <div>
      <h2><a href="http://example.com/drupalcamp_fr">DrupalCamp Toulouse 2011</a></h2>
      <img src='images/drupalicon_fr.png' />
      <p>Vous l&rsquo;attendiez tous, le DrupalCamp Toulouse aura bien lieu, 
r&#233;uni avec 2 autres &#233;v&#233;nements sous la bannière 
"Capitole du Libre": le DrupalCamp, une Ubuntu Party, une Akademy 
(&#233;v&#232;nement KDE).</p>
      <div>
        ENSEEIHT, Toulouse, Haute-Garonne, FR
      </div>
      <div>
        <time datetime="2011-11-26T09:00:00+01:00">November 26, 10:00am</time> &ndash;
        <time datetime="2011-11-27T17:00:00+01:00">November 27, 6:00pm</time>
      </div>
    </div>

    <!-- Event 2: DrupalCamp Ohio -->
    <div>
      <h2><a href="http://example.com/drupalcampohio">Drupalcamp Ohio 2011</a></h2>
      <img src='images/drupalicon_oh.png' />
      <p>The Central Ohio Drupal User Group (CODUG) is proud to announce 
Ohio&rsquo;s first Drupalcamp. On Saturday, December 3rd, we&rsquo;ll hold an 
all-day camp with keynote speaker, breakout sessions and Birds of Feather groups at The 
Ohio State University&rsquo;s Nationwide and Ohio Farm Bureau 4-H Center.</p>
      <div>
        The Ohio State University, Columbus, Ohio, US
      </div>
      <div>
        <time datetime="2011-12-03T09:00:00-05:00">December 3, 9:00am</time> &ndash;
        <time datetime="2011-12-03T17:00:00-05:00">5:00pm</time>
      </div>
    </div>

  </body>
</html>
Обратите внимание, что вы пометили даты с помощью специального элемента. Это новый элемент time, который является частью базового стандарта HTML5. Он позволяет добавлять к страницам точное время, что упрощает их разбор и их использование приложениями. В нашем примере Google использует эти элементы time для выбора из страницы трех очередных событий для отображения в Rich Snippets. Примечание. На момент публикации этой статьи продолжалось обсуждение замены элемента time на более "типовой" элемент данных. Если это произойдет, то в показанном ниже коде элемент "time" будет заменен элементом "data", а элемент "datetime" будет заменен элементом "value".
Элемент datetime формируется следующим образом. Сначала идет дата в формате YYYY-MM-DD. Затем следует символ "T", отделяющий дату от времени, которое представлено в формате HH:MM:SS. Затем задается смещение относительно времени UTC (всеобщее скоординированное время). Например, во Франции зимнее время на 1 час опережает время UTC, таким образом, сдвиг добавляет +01:00 к концу строки datetime. В Огайо зимнее время на 5 часов отстает от UTC, таким образом, сдвиг добавляет -05:00 к концу строки datetime. Моменту "9 утра 3 декабря 2011 года по центральному поясному времени США" соответствует машиночитаемое значение 2011-12-03T09:00:00-05:00.
Сохраните этот файл в каталоге jquery-ui-map/demos своего веб-сервера и загрузите его в свой браузер. На рис. 1 показаны подробности обоих событий, описанных в листинге 1.
Рисунок 1. Базовая страница с двумя событиями
Screen capture of basic page listing two events

Подготовка событий к применению Rich Snippets

Страница с элементом time содержит некоторый объем информации, понятной машине. Теперь посмотрим, как это дополнение изменило отображение результатов машиной Google. Перейдите к инструменту Google Rich Snippets Testing Tool и введите URL-адрес своей страницы (см. рис. 2). Вместо подробностей события вы видите ошибки генерации предварительного просмотра, поскольку страница не имеет разметки авторства, разметки rich snippet и информации об авторе.
Рисунок 2. Отсутствие результатов для базовой HTML-страницы в инструменте тестирования Rich Snippets
No results for basic HTML in the Rich Snippets testing tool
Даже если машина Google знает, что ваша страница содержит элементы time, она не знает, что они представляют собой моменты начала и окончания событий. Чтобы помочь Google понять это, вам нужно добавить несколько терминов Schema.org (см. листинг 2). Публикация разметки Schema.org с микроданными более подробно рассматривается в предыдущей статье (соответствующая ссылка приведена в разделе Ресурсы).
Листинг 2. Ввод в элемент Event блока <div> для каждого события
<!-- Event 1: DrupalCamp Toulouse -->
<div itemscope itemtype="http://schema.org/Event">
  ...
</div>

<!-- Event 2: DrupalCamp Ohio -->
<div itemscope itemtype="http://schema.org/Event">
  ...
</div>
Затем добавьте к событию такие свойства, как url и name. Обратите внимание, что к name добавляется тег <span>, чтобы обеспечить место для добавления атрибута itemprop. Кроме того, вы добавляете свойство image. Для данного Rich Snippet в этом нет необходимости, однако вы используете это свойство позднее.
Листинг 3. Добавление свойств url и name к событиям
<!-- Event 1: DrupalCamp Toulouse -->
<div itemscope itemtype="http://schema.org/Event">
  <h2><a href="http://example.com/drupalcamp_fr" itemprop="url"><span 
itemprop="name">DrupalCamp Toulouse 2011</span></a></h2>
  <img itemprop="image" src='images/drupalicon_fr.png' />
  ...
</div>

<!-- Event 2: DrupalCamp Ohio -->
<div itemscope itemtype="http://schema.org/Event">
  <h2><a href="http://example.com/drupalcampohio" itemprop="url"><span 
itemprop="name">Drupalcamp Ohio 2011</span></a></h2>
  <img itemprop="image" src='images/drupalicon_oh.png' />
  ...
</div>
Теперь вы можете добавить момент начала и (по желанию) момент окончания. Поскольку вы использовали элемент time, у вас уже есть машиночитаемое значение для начала и для окончания. Теперь вам нужно лишь добавить термины Schema.org, чтобы помочь Google узнать, "что к чему" (см. листинг 4).
Листинг 4. Добавление свойств startDate и endDate к элементам time
<!-- Event 1: DrupalCamp Toulouse -->
<div itemscope itemtype="http://schema.org/Event">
  ...
  <div>
    <time itemprop="startDate" datetime="2011-11-26T09:00:00+01:00">November 26, 
10:00am</time> &ndash;
    <time itemprop="endDate" datetime="2011-11-27T17:00:00+01:00">November 27, 
6:00pm</time>
  </div>
</div>

<!-- Event 2: DrupalCamp Ohio -->
<div itemscope itemtype="http://schema.org/Event">
  ...
  <div>
    <time itemprop="startDate" datetime="2011-12-03T09:00:00-05:00">December 3, 
9:00am</time> &ndash;
    <time itemprop="endDate" 
datetime="2011-12-03T17:00:00-05:00">5:00pm</time>
  </div>
</div>
Снова протестируйте эту страницу в инструменте Testing Tool. Поскольку эти URL-адреса указывают не на тот домен, на который указывает базовый URL-адрес, вы видите предупреждения, которые препятствуют отображению Rich Snippet (рис. 3).
Рисунок 3. Предупреждения, препятствующие отображению Rich Snippet
Screen capture of warning that prevents the Rich Snippet display
Google требует, чтобы ссылки на события указывали на страницы в том же домене. Это требование призвано противодействовать спамерским методикам. Если вы замените домен example.com своим доменом и осуществите повторное тестирование, вы должны увидеть отображение Rich Snippet (см. рис. 4).
Рисунок 4. Rich Snippet отображает оба события с датами их начала
Screen capture of Rich Snippet displaying both events with their start dates
Примечание. Даже если инструмент тестирования демонстрирует Rich Snippet, у вас нет гарантии, что Rich Snippet будет показан в реальных результатах поиска. Вы должны сообщить Google о необходимости просмотра вашего сайта до вывода Rich Snippet для ваших страниц в результатах поиска. Для получения дополнительной информации обратитесь к FAQ.

Добавление плагина jQuery UI Map

Поскольку мероприятия DrupalCamps проводятся во всем мире, вашим посетителям потребуется карта, показывающая, какие из этих мероприятий находятся от них в пределах разумного расстояния. Для реализации этой карты необходимо добавить еще немного информации.
Во-первых, настройте карту для отображения. Добавьте в документ блок <div> для размещения карты под заголовком страницы и над списком событий (листинг 5).
Листинг 5. Добавление блока <div> для карты
<body id="doc">
  <h1>Upcoming DrupalCamps</h1>

  <div>
    <div id="map_canvas"></div>
  </div>

 <!-- Event 1: DrupalCamp Toulouse -->
Чтобы преобразовать этот блок <div> в интерактивную карту, вам нужно добавить несколько JavaScript-файлов. Также добавьте несколько CSS-файлов, задающих высоту блока #map_canvas <div>, чтобы его можно было увидеть. Соответствующие локальные файлы включены в исходный код (см. раздел Загрузка).
Листинг 6. Добавление внешних CSS-файлов, JavaScript-библиотек и jQuery-файлов
<head>
  <title>Upcoming DrupalCamps</title>

  <!-- External Stylesheets -->
  <link rel="stylesheet" type="text/css" 
href="http://yui.yahooapis.com/3.2.0/build/cssreset/reset-min.css" />
  <link rel="stylesheet" type="text/css" 
href="http://yui.yahooapis.com/3.2.0/build/cssbase/base-min.css" />
  <link rel="stylesheet" type="text/css" 
href="http://yui.yahooapis.com/3.2.0/build/cssfonts/fonts-min.css" />
  <link rel="stylesheet" type="text/css" href="css/main.css" />

  <!-- Google Maps API and jQuery, served by Google -->
  <script type="text/javascript" 
src="http://maps.google.com/maps/api/js?sensor=false"></script>
  <script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>
  <!-- jQuery UI Maps files for placing markers and for parsing Microdata -->
  <script type="text/javascript" src="../web/jquery.fn.gmap.js"></script>
  <script type="text/javascript" 
src="../ui/jquery.ui.map.services.js"></script>
  <script type="text/javascript" 
src="../ui/jquery.ui.map.microdata.js"></script>
  ...
Затем добавьте jQuery-блок, который получает #map_canvas div при инициализации страницы и превращает эту страницу в карту (см.листинг 7). Позднее вы расширите эту функцию.
Листинг 7. Инициализация карты
...
  <!-- Grab the #map_canvas div and turn it into a map -->
  <script type="text/javascript">
    $(function() {
      map = $('#map_canvas');

      map.gmap().bind('init', function () {
      });
    });
  </script>
</head>
После перезагрузки страницы вы увидите карту (см. рис. 5). Пока на ней не отмечено никаких событий; для отображения этих событий вам еще необходимо добавить определенную информацию.
Рисунок 5. Базовая карта без каких-либо маркеров
Screen capture of a basic map without any markers

Добавление местоположений в микроданные

Прежде чем вы сможете наносить на карту маркеры, вам необходимо добавить в микроданные местоположения соответствующих событий. Пока мы рассматриваем каждый адрес как одиночную строку. Следует, однако, отметить, что адрес состоит из нескольких отдельных частей. Необходимо представить эту структуру в микроданных, чтобы можно было легко и единообразно получать правильные значения даже в том случае, если структура HTML-кода будет впоследствии изменена. Сначала добавьте свойство location (местоположение), которое имеет значение Place (см. листинг 8).
Листинг 8. Добавление свойства location к событию
<!-- Event 1: DrupalCamp Toulouse -->
<div itemscope itemtype="http://schema.org/Event">
  ...
  <div itemprop="location" itemscope itemtype="http://schema.org/Place">
    ENSEEIHT, Toulouse, Haute-Garonne, FR
  </div>
  ...
</div>
Значение Place может включать название и почтовый адрес. Почтовый адрес представляет собой элемент со своими собственными свойствами, такими как улица (streetAddress), город (addressLocality), регион(addressRegion) и страна (addressCountry). Этот элемент должен быть представлен в двухбуквенном коде страны согласно стандарту ISO 3166−1 alpha-2. В листинге 9 эти свойства разделены с помощью тегов span.
Листинг 9. Использование тегов span
<!-- Event 1: DrupalCamp Toulouse -->
<div itemscope itemtype="http://schema.org/Event">
  ...
  <div itemprop="location" itemscope itemtype="http://schema.org/Place">
    <span itemprop="name">ENSEEIHT</span><br /> 
    <span itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
      <span itemprop="streetAddress">Rue Sylvain Dauriac</span><br />
      <span itemprop="addressLocality">Toulouse</span>,
      <span itemprop="addressRegion">Haute-Garonne</span>,
      <span itemprop="addressCountry">FR</span>
    </span>
  </div>
  ...
</div>
Вы можете отформатировать адреса для других событий аналогичным образом.

Нанесение местоположений на карту

Теперь вы готовы к нанесению маркеров на карту. Сначала осуществите разбор микроданных на странице в объекты, которые вы сможете использовать. С этой целью укажите, какой тип элемента верхнего уровня является источником нужных вам данных. Элементы верхнего уровня в микроданных могут рассматриваться как корневые элементы; они не являются свойствами любого другого элемента, но имеют собственные свойства. Укажите http://schema.org/Event. Это обеспечит возвращение объекта для каждого события Event (см. листинг 10).
Листинг 10. Разбор микроданных в объекты
<script type="text/javascript">
    $(function() {
      map = $('#map_canvas');

      map.gmap().bind('init', function () {
        // Process the microdata for each Event into an object.
        map.gmap('microdata', 'http://schema.org/Event', function(result, item, index) {
          window.console.log(result);
        });
      });
    });
</script>
Созданный из микроданных объект вы сможете увидеть в JavaScript-консоли таких браузеров, как Firefox и Chrome. Каждый элемент в микроданных транслируется в объект со своим объектом свойств, который содержит все значения itemprop этого элемента. Поскольку свойства в микроданных могут иметь несколько значений, значения itemprop обрабатываются как массивы (см. рис. 6).
Рисунок 6. Исследование объекта в JavaScript-консоли браузера Chrome
Screen capture of the object source in the JavaScript console of Chrome
Этот объект имеет все свойства, необходимые вам для получения географических координат местоположения, которые, в свою очередь, необходимы вам для размещения маркера для соответствующего события. Чтобы получить эту информацию, извлеките из объекта части адреса и объедините их в адресной строке, которую сможет понять машина Google. Затем вы можете использовать инструмент Google Geocoder с целью получения координат для этого адреса. Библиотека jQuery UI Map предоставляет функцию упаковщика (wrapper), которую вы можете использовать для исполнения запроса к Geocoder.
Примечание. При получении неопределенной ошибки дважды щелкните мышью, чтобы убедиться в наличии всех требуемых свойств у всех перечисленных событий (см. листинг 11).
Листинг 11. Исполнение запроса к Geocoder для адреса
<script type="text/javascript">
    $(function() {
      map = $('#map_canvas');

      map.gmap().bind('init', function () {
        // Process the Microdata for each Event into an object.
        map.gmap('microdata', 'http://schema.org/Event', function(result, item, index) {
          // Traverse from the Event to the Place and from the Place to the
          // Address to get the properties.
          var placeName = result.properties.location[0].properties.name[0];
          var streetAddress = 
result.properties.location[0].properties.address[0].properties.streetAddress[0];
          var city = 
result.properties.location[0].properties.address[0].properties.addressLocality[0];
          var state = 
result.properties.location[0].properties.address[0].properties.addressRegion[0];
          var country = 
result.properties.location[0].properties.address[0].properties.addressCountry[0];

          // Join the address parts into a comma-separated string.
          var address = [placeName, city, state, country].join(', ')

          // Run the Geocoder request for the address.
          map.gmap('search', {'address': address } , function(result, status) {
            window.console.log(result);
            // We will place the marker here.
          });
        });
      });
    });
</script>
Посмотрите на результат в консоли – вы увидите, что сервис возвратил одно или несколько местоположений, соответствующих вашему адресу. Вы будете использовать только первое из этих местоположений, поскольку оно обладает максимальным соответствием. Объект имеет свойство geometry, которое содержит необходимую вам информацию о географических координатах (см. листинг 12).
Листинг 12. Нанесение маркеров
<script type="text/javascript">
    $(function() {
      map = $('#map_canvas');
      map.gmap().bind('init', function () {
        // Process the Microdata for each Event into an object.
        map.gmap('microdata', 'http://schema.org/Event', function(result, item, index) {
          // Traverse from the Event to the Place and from the Place to the
          // Address to get the properties.
          var placeName = result.properties.location[0].properties.name[0];
          var streetAddress =
result.properties.location[0].properties.address[0].properties.streetAddress[0];
          var city = 
result.properties.location[0].properties.address[0].properties.addressLocality[0];
          var state = 
result.properties.location[0].properties.address[0].properties.addressRegion[0];
          var country = 
result.properties.location[0].properties.address[0].properties.addressCountry[0];

          // Join the address parts into a comma-separated string.
          var address = [placeName, city, state, country].join(', ')

          // Run the Geocoder request for the address.
          map.gmap('search', {'address': address } , function(result, status) {
            if (status == google.maps.GeocoderStatus.OK) {
              // Create a LatLng object.
              var lat = result[0].geometry.location.lat();
              var lng = result[0].geometry.location.lng();
              var latlng = new google.maps.LatLng(lat, lng);
  
              // Place the marker.
              var markerOptions = { 
                'bounds':true,
                'position': latlng
              };
              map.gmap('addMarker', markerOptions);
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            }
          });
        });
      });
    });
</script>
После перезагрузки страницы вы должны увидеть маркеры местоположений, как на рис. 7.
Рисунок 7. Маркеры, нанесенные на карту
Screen capture of markers placed on the map

Придание карте интерактивных возможностей

Карта будет еще более полезной, если пользователь сможет нажимать на тот или иной маркер для получения сведений о соответствующем событии — например, даты и ссылки на мероприятие. Добавление этих функциональных возможностей не составляет никакого труда.
Сначала извлеките из разобранных микроданных нужную вам дополнительную информацию о соответствующем событии (см. листинг 13).
Листинг 13. Получение дополнительной информации
<script type="text/javascript">
    $(function() {
      map = $('#map_canvas');
      map.gmap().bind('init', function () {
        // Process the Microdata for each Event into an object.
        map.gmap('microdata', 'http://schema.org/Event', function(result, item, index) {
          var eventName = result.properties.name[0];
          var logo = result.properties.image[0];
          var url = result.properties.url[0];
          var start = result.properties.startDate[0];

          ...
      });
    });
</script>
Прежде чем добавлять маркер к карте, создайте HTML-блок с подробностями события (см. листинг 14).
Листинг 14. Создание HTML-блока для информационного окна
            // Run the Geocoder request for the address.
            map.gmap('search', {'address': address } , function(result, status) {
              if (status == google.maps.GeocoderStatus.OK) {
                // Create a LatLng object.
                var lat = result[0].geometry.location.lat();
                var lng = result[0].geometry.location.lng();
                var latlng = new google.maps.LatLng(lat, lng);
    
                var eventDetails = '';
                eventDetails += '<div class="iw">';
                eventDetails += '<img src="'+logo+'"></img>';
                eventDetails += '<h2><a href="'+url+'">'+eventName+'</a></h2>';
                eventDetails += new Date(start).toDateString();
                eventDetails += '</div>';
    
                // Place the marker.
                ...
Затем добавьте подробности события к маркеру, который вы создаете. Воспользуйтесь jQuery-функцией .click, чтобы указать, какое действие следует выполнять при нажатии посетителя на соответствующий маркер. В этой функции используйте helper-функциюopenInfoWindow из состава библиотеки jQuery UI Map для формирования окна и просто передайте свой HTML-код в качестве контента для этого окна (см. листинг 15).
Листинг 15. Добавление информационного окна InfoWindow в качестве click-события
            // Place the marker.
            ...
            map.gmap('addMarker', markerOptions).click( function() {
              map.gmap('openInfoWindow', { 'content': eventDetails }, this ); 
            });
После выполнения этой задачи перезагрузите страницу, а затем нажмите на маркер. Вы увидите всплывающее окно с подробностями события (см. рис. 8).
Рисунок 8. Click-событие при нажатии на маркер
Screen capture of window with event details after user clicks the event marker
Для улучшения внешнего вида добавьте несколько CSS-правил. Они включены в загружаемый код примера (см. раздел Загрузка). В конечном итоге ваша карта будет выглядеть, как показано на рис. 9.
Рисунок 9. Итоговый вид карты
Screen capture of final map with two event markers, a pop-up window, and full event details

Заключение

Посредством jQuery-плагинов микроданные упрощают динамическое использование данных на веб-странице, например, использование данных на картах Google Maps. Спецификация микроданных определяет типовые скрипты, которые вы сможете использовать в качестве плагинов на разных сайтах, не связанных друг с другом. Кроме того, микроданные упрощают комбинирование данных с нескольких различных сайтов при создании новых приложений. В следующей статье я продемонстрирую, как можно использовать Drupal для создания такого