PHP, JS: Формирование страницы на основе якоря (#)

24 Дек 2010

Видели наверное в Twitter‘е урлы вида «http://twitter.com/#!/krasnoyarcev», и именно та запись, что находится после символа «#» определяет какая информация будет загружена.

Мне понадобилась подобная система. Необходимо загружать информацию которая определяется как раз таки этим якорем (то что после #).

Для чего это нужно?

Допустим у Вас на сайте реализована навигация без перезагрузки страницы, изменять адресную строку с помощью клиентских технологий Вы не можете, ну разве что добавлять хеш в URL, используя якоря в ссылках (то, что нам нужно). А теперь Вы захотели поделиться ссылкой с Васей, копируем содержимое адресной строки (В ней присутствует якорь) и передаете Васе по любой линии связи. Вася переходит по ссылке и если Вы не предусмотрели такой вариант, то видит он совсем не то, чем Вы хотели с ним поделиться.

Техническая сторона вопроса

Чтобы информация сразу формировалась на сервере и выдавалась уже в нужном виде, необходимо, чтобы якорь передавался на сервер, а по простому сделать это средствами php не возможно. Тут даже суперглобальный массив $_SERVER[] нам ничем не поможет.

На помощь приходит JavaScript. Здесь я предпочитаю использовать библиотеку JQuery.

В Твиттере страница имеет следующий вид: панель сверху, которая грузится сразу и остальная часть страницы, которая подгружается уже после окончательной загрузки страницы. То есть перед тем как подгружать весь контент, загружается пустая страница с верхней панелью.

Недогруженная страница Твиттера

С помощью Аякс мы может послать запрос серверу, который вернет ту информацию, которую нужно вставить в пустое место.

Для начала набросаем главную страницу.

Файл index.php:

<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=utf-8">
		<title>Пример скрипта с http://it-guest.net.ru</title>
		<script type="text/javascript" src="jquery-1.4.2.js"></script>
		<script type="text/javascript" src="jscripts.js"></script>
		<style>
			#panel {
				text-align: center;
			}
 
			#space {
				color: #997486;
				text-align: center;
			}
		</style>
	</meta></head>
	<body>
		<div id="panel">
		Тут панель
		</div>
		<div id="space">
		</div>
	</body>
</html>

Тут всё понятно, в блок с id = space будем пихать полученную с помощью JS информацию.

Определимся с форматом якоря: «#id-%id%», где %id% это номер страницы, которую нужно грузить. Напишем скрипт на JavaScript, который будет получать всю информацию после символа #, отправлять файлу get.php post-запрос в виде id и возвращать соответствующую этому id информацию.

Файл jscripts.js:

$(document).ready(function(){
	var r = /#id-([0-9]{1,9})/i // регулярное выращение проверяющее правильность якоря
	var t = r.exec(window.location.hash); // выполняем рег. выражение для хеша (то, что после символа # включая его)
	if(t[1]!=0 &amp;&amp; t[1] != ''){ // проверяем вернуло ли регулярное выражение id
		$.post("get.php", {"id": t[1]},function(data){ // посылаем обработчику get.php id
			$("#space").html(data); // заполняем блок текстом, который вернул обработчик
		});
	}
})

Файл get.php:

< ?php
header('Content-type: text/html; charset=utf-8');
switch($_POST['id']) {
	case 1: echo 'Страница №1';
	break;
	case 2: echo 'Страница №2';
	break;
	case 3: echo 'Страница №3';
	break;
	case 4: echo 'Страница №4';
	break;
}
?>

Скачать все скрипты из статьи в одном файле

Забобрить!
Запомнить эту страницу на Закладок.нет!
www.vaau.ru
Уважаемый читатель! Если мой блог Вам понравился, то предлагаю подписаться на обновление по RSS или по E-mail. У меня так же есть аккаунт в Twitter, за которым Вы можете следовать.

Один комментарий

# Канат Гайлимов оставил(а) комментарий 25 Дек 2010 в 14:19

круто :) я в свич еще добавил дефолтное действие, например заголовок 404

P.S. В Хроме кнопка сохранить с бордером

Ответить

Добавить комментарий

Псевдоним*:
Эл. почта*:
Сайт: