AJAX и JavaScript. Загрузка контента без перезагрузки страницы

В данной статье речь пойдет о том, как сделать обновление контента без перезагрузки страницы, используя только JavaScript.

AJAX - инструмент для построения веб-приложений, обменивающихся данными с сервером в фоновом режиме. При этом пользователь получает приложение с динамическим обновлением контента, без перезагрузки всей страницы. Как видно из аббревиатуры, основным элементом AJAX является язык программирования JavaScript. На нем-то мы и реализуем возможность загрузки контента без перезагрузки страницы.

Простой пример программного кода на AJAX и JavaScript

Программа загружает на странице контент по выбору пользователя, без перезагрузки всей страницы полностью.

Содержимое файла index.html.

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
  4. <script>
  5. function showContent(link) {
  6. var cont = document.getElementById('contentBody');
  7. var loading = document.getElementById('loading');
  8. cont.innerHTML = loading.innerHTML;
  9. var http = createRequestObject();
  10. if( http )
  11. {
  12. http.open('get', link);
  13. http.onreadystatechange = function ()
  14. {
  15. if(http.readyState == 4)
  16. {
  17. cont.innerHTML = http.responseText;
  18. }
  19. }
  20. http.send(null);
  21. }
  22. else
  23. {
  24. document.location = link;
  25. }
  26. }
  27. // создание ajax объекта
  28. function createRequestObject()
  29. {
  30. try { return new XMLHttpRequest() }
  31. catch(e)
  32. {
  33. try { return new ActiveXObject('Msxml2.XMLHTTP') }
  34. catch(e)
  35. {
  36. try { return new ActiveXObject('Microsoft.XMLHTTP') }
  37. catch(e) { return null; }
  38. }
  39. }
  40. }
  41. </script>
  42. </head>
  43. <body>
  44. <p>Какую страницу желаете открыть?</p>
  45. <form>
  46. <input onclick="showContent('page1.html')" type="button" value="Страница 1">
  47. <input onclick="showContent('page2.html')" type="button" value="Страница 2">
  48. </form>
  49. <div id="contentBody">
  50. </div>
  51. <div id="loading" style="display: none">
  52. Идет загрузка...
  53. </div>
  54. </body>
  55. </html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
<script>
	function showContent(link) {

		var cont = document.getElementById('contentBody');
		var loading = document.getElementById('loading');

		cont.innerHTML = loading.innerHTML;

		var http = createRequestObject();
		if( http ) 
		{
			http.open('get', link);
			http.onreadystatechange = function () 
			{
				if(http.readyState == 4) 
				{
					cont.innerHTML = http.responseText;
				}
			}
			http.send(null);    
		}
		else 
		{
			document.location = link;
		}
	}

	// создание ajax объекта
	function createRequestObject() 
	{
		try { return new XMLHttpRequest() }
		catch(e) 
		{
			try { return new ActiveXObject('Msxml2.XMLHTTP') }
			catch(e) 
			{
				try { return new ActiveXObject('Microsoft.XMLHTTP') }
				catch(e) { return null; }
			}
		}
	}
</script>
</head>

<body>

	<p>Какую страницу желаете открыть?</p>
	
	<form>
		<input onclick="showContent('page1.html')" type="button" value="Страница 1">
		<input onclick="showContent('page2.html')" type="button" value="Страница 2">
	</form>
	
	<div id="contentBody">
	</div>

	<div id="loading" style="display: none">
	Идет загрузка...
	</div>
	
</body>
</html>

Рассмотрим принцип работы примера.

1. Функция createRequestObject() создает объект XMLHttpRequest() для браузеров Firefox, Opera и т.п. и его аналог для различных версий браузеров Internet Explorer. Этот объект нужен для передачи данных на сервер и получения от него ответа в фоновом режиме, без перезагрузки страницы.

2. Как видно в теле документа имеются два контейнера - contentBody и loading. В контейнер contentBody загружается непосредственно контент, а контейнер loading содержит контент, который служет заставкой и появляется на время загрузки основного требуемого контента.

3. Функция showContent() выводит контент в основной контейнер contentBody. Делает она это с использованием объекта XMLHttpRequest(). Методом open() осуществляется описание передачи данных на сервер. В качестве параметров указавается тип запроса (у нас - GET) и строка, передаваемая серверу (у нас - URL загружаемой страницы).

4. В силу особенностей объекта XMLHttpRequest(), для получения всего контента требуется дождаться, пока свойство readyState примет значение 4. Как только мы дожидаемся этого - сразу изменяем тело контейнера. Это и указано в функции-обработчике события onreadystatechenge().

5. После открытия запроса его надо отправить на сервер, это делается методом send().

6. Если создать объект XMLHttpRequest() по каким-либо причинам не вышло, то выполняется простая переадресация на указанную страницу, тем самым функция showContent() сохраняет свою работоспособность.

В тексте примере упоминаются ссылки на файлы page1.html и page2.html, которые загружаются в область контента. Они представляют собой простые HTML-страницы или текстовые файлы с контентом.