В этой статье я хочу рассказать о библиотеке, которая позволяет сделать неактивной часть web страницы или всю ее целиком.
Библиотека называется jQuery BlockUI Plugin и, как следует из названия, представляет собой плагин к jQuery.
Принцип работы следующий. Библиотека создает дополнительный слой (overlay) над всей страницей или каким-то блоком на ней.
Этот слой может содержать сообщение, картинку, диалог или вообще другую страницу с любыми элементами управления.
Если вы видели, как работают библиотеки типа Lightbox, то представляете, о чем идет речь.
Приведу простой пример. Допустим, необходимо заблокировать доступ к странице на время выполнения Ajax запроса.
Для этого нужно подключить файл библиотеки, и написать небольшую функцию. Рассмотрим код страницы.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Заголовок</title> <link rel="stylesheet" type="text/css" href="styles.css" media="all" /> <script type="text/javascript" src="jquery-1.2.3.js"></script> <script type="text/javascript" src="jquery.blockUI.js"></script> <script type="text/javascript"> $().ajaxStop($.unblockUI); $(document).ready( function () { $('#sendData').click( function() { $.blockUI({message: $('#topLayer'), css: { 'font-size': '0.7em' }}); $('#result').load('check.php', {'name': $('#nameField').val()}); } ); } ); </script> </head> <body> <form action="#" method="post"> <p> <label for="nameField">Имя: </label> <input type="text" name="nameField" id="nameField" size="30" /> </p> <p> <input type="button" name="sendData" id="sendData" value="Отправить" /> </p> </form> <div id="result"></div> <div id="topLayer" style="display:none;"> <h1>Ваш запрос обрабатывается. Пожалуйста, подождите...</h1> </div> </body> </html>
Как видите – это обычная страница.
В строках 7 и 8 мы подключили jQuery и BlockUI. После этого написали скрипт, который управляет дополнительным слоем.
Но прежде чем переходить к нему, рассмотрим структуру страницы.
У нас есть три блока.
1) Форма с текстовым полем и кнопкой. При нажатии на кнопку необходимо отправить ajax запрос php скрипту (о нем чуть позже).
2) Блок, в который будет помещен ответ сервера (строка 36).
3) Блок с текстом, который будет показан на дополнительном слое (строки 38-40). Для того, чтобы этот блок не был виден на странице мы установили стиль display:none
.
Возвращаемся к скрипту (строки 9-22).
Прежде всего, предусматриваем отключение дополнительного слоя сразу после завершения Ajax запроса (строка 10). Как видите, для этого достаточно вызвать $.unblockUI
.
Затем назначаем обработчик нажатия на кнопку «Отправить» (строки 14-19). Этот обработчик создает дополнительный слой (с помощью функции $.blockUI
) и отправляет запрос.
В параметрах функции мы указываем:
message
– текст, который появится на дополнительном слое (в нашем случае – содержимое блока topLayer).
css
– стили, которые будут применяться к этому слою.
Естественно, это не все параметры. Полный список размещен на этой странице.
Следующий шаг – отправка ajax запроса. Исключительно для целей тестирования я написал небольшой php скрипт, который просто возвращает количество букв во введенном имени. Кроме того, скрипт создает 3-х секундную задержку, чтобы можно было рассмотреть дополнительный слой.
<?php sleep(3); echo 'Имя состоит из '.mb_strlen($_POST['name']).' символа(ов)'; ?>
Вот и все. После завершения запроса страница будет разблокирована.
Небольшое дополнение.
Любой блок web страницы можно заблокировать так же легко, как и всю ее целиком.
Например, при выполнении ajax запроса пользователю будет понятнее, если неактивной станет только форма, а не вся страница целиком. Для данного примера это можно сделать так:
$('form').block({ message: .... }); $('form').unblock();
Если библиотека вас заинтересовала, советую посмотреть и другие примеры.
Скачать пример.
Если есть желание поэкспериментировать, качайте архив с примером (и библиотеками).
Удачи!