Опубликован: 01.09.2010 | Уровень: для всех | Доступ: платный | ВУЗ: Сибирский федеральный университет
Лекция 14:

Перспективы и расширения HTML

Canvas

Этот новый HTML-элемент предоставляет API для рисования. В отличие от SVG, Canvas оперирует не объектами (текст, линия, кривая), а точками, т.е. выполнение, например, команды fillRect создаст на холсте нарисованный прямоугольник, но не предоставит нового объекта, аналогичного rect в SVG, которым можно было бы манипулировать при помощи набора свойств и методов DOM, и который мог бы реагировать на внешние события. Зато работа Canvas с точечной графикой более эффективна, чем в SVG. Несколько команд рисования показано в примере 21.1.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Canvas 2D</title>
	<style type="text/css">
		div {
			position: absolute;
			top: 50%;
			left: 50%;
			width: 600px;
			height: 400px;
			margin: -200px 0 0 -300px;
		}
	</style>
</head>
<body>
	<!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->

	<script type="text/javascript">
		window.onload = function() {
			/*получаем ссылку на холст*/
			var canvas = document.getElementById('myCanvas');
			/*контекст*/
			var context = canvas.getContext('2d');
			/*создаём градиент*/
			var myGradient = context.createLinearGradient(0, 0, 600, 400);
			/*добавляем цветовые позиции к градиенту*/
			myGradient.addColorStop(0, "green");
			myGradient.addColorStop(1, "white");
			/*устанавливаем созданный градиент как стиль заливки*/
			context.fillStyle = myGradient;
			/*заливаем прямоугольную область*/
			context.fillRect(0, 0, 600, 400);

			/*определяем стиль текста*/
			context.font = "bold 50px sans-serif";
			/*цвет обводки*/
			context.strokeStyle = 'black';
			/*толщина линий*/
			context.lineWidth = '3.0';
			/*цвет заливки*/
			context.fillStyle = 'yellow';
			/*выравнивание текста*/
			context.textAlign = "center";
			context.textBaseline = "middle";
			/*рисуем обводку текста*/
			context.strokeText('Hello, World!', 300, 200);
			/*рисуем заливку текста*/
			context.fillText('Hello, World!', 300, 200);

		}
	</script>

	<div>
		<canvas id="myCanvas" width="600" height="400">
	      </canvas>
	</div>

</body>
</html>
Листинг 21.1. Рисование при помощи Canvas

В настоящее время элемент Canvas поддерживается большинством популярных браузеров, за исключением IE. Однако, IE поддерживает язык разметки векторной графики VML, который позволяет частично эмулировать Canvas, и для эмуляции создана Javascript-библиотека ExplorerCanvas (см. пример 21.1 - в нём к HTML-странице подключается скрипт excanvas.js ). Таким образом, этот элемент с некоторыми ограничениями использовать можно.

Ссылка на спецификацию: http://www.w3.org/TR/html5/the-canvas-element.html

Хранилище DOM

Ещё один полезный механизм, заложенный в проект спецификации HTML 5 и уже реализованный в IE8, а также в ряде других браузеров - хранилище DOM.

С помощью хранилища DOM, как и с помощью файлов Cookie, веб-разработчики могут сохранять данные на стороне клиента для конкретного сеанса ( sessionStorage ) или специфические данные домена ( localStorage ) в виде пар имя-значение.

Хранилище DOM может предоставить значительно больше дискового пространства, чем файлы Cookie. В Internet Explorer в файлах Cookie можно сохранить только 4 КБ данных. В хранилище DOM в IE8 предоставляется приблизительно 10 МБ для каждой области хранения (в других браузерах - несколько меньше).

С функциональной точки зрения хранилища DOM значительно отличаются от файлов Cookie. Из хранилища DOM значения не передаются на сервер с каждым запросом, как в файлах Cookie, и срок действия данных в локальной области хранения никогда не истекает. В отличие от файлов Cookie в хранилище DOM проще осуществлять доступ к отдельным фрагментам данных с использованием стандартного интерфейса, который приобретает все более широкую поддержку у поставщиков браузеров.

Пример 14.2 иллюстрирует основные приёмы работы с хранилищем.

<!DOCTYPE html>
<html>
<head>
  <title>Сохранение сеанса</title>

  <script type="text/javascript">
    var list;
    window.onload = function() {
      //сохраняем ссылку на список (она будет использоваться часто)
      list = document.getElementById('list');
      var StorageSupported = false;
      //определяем, поддерживается ли хранилище:
      //некоторые браузеры создают исключение при обращении к sessionStorage -
      //поэтому помещаем проверку в блок try/catch
      try {
        if (sessionStorage) StorageSupported = true;
      }
      catch (e) { }


      if (StorageSupported) {
        //поддержка есть - сообщим об этом
        document.getElementById('msg').innerHTML = 
          'Ваш браузер ' + 'поддерживает'.fontcolor('green') + ' хранилище сеанса';
        //проходим в цикле по всем элементам, уже сохранённым в хранилище (если есть)
        for (var n = 0; n < sessionStorage.length; n++) {
          var key = sessionStorage.key(n);
          //помещаем их ключи и значения в список list
          list.options[list.options.length] = new Option(key + ': ' + sessionStorage[key], key);
        }
      }
      else {
        //поддержки нет - также сообщаем об этом
        document.getElementById('msg').innerHTML = 
          'Ваш браузер ' + 'не поддерживает'.fontcolor('red') + ' хранилище сеанса';
        //получаем ссылку на массив элементов формы
        var formElems = document.forms[0].elements;
        //и делаем их недоступными (disabled)
        for (i = 0; i < formElems.length; i++) {
          formElems[i].disabled = 'disabled';
        }
      }
    }

    //это событие возникает (если браузер его поддерживает) при изменении в хранилище
    document.onstorage = function() {
      //опустошаем список
      while (list.hasChildNodes()) { list.removeChild(list.firstChild); }

      //и воссоздаём его на основе изменившегося хранилища
      for (var n = 0; n < sessionStorage.length; n++) {
        var key = sessionStorage.key(n);
        list.options[list.options.length] = new Option(key + ': ' + sessionStorage[key], key);
      }
    }
  </script>

</head>
<body>
  <h1>
    Страница 1</h1>
  <h2 id="msg">
  </h2>
  <form action="">
  <p>
    Здесь вы можете ввести произвольный текст, который будет сохранён в хранилище
    сеанса под ключом <code>info1</code>:</p>
  <textarea cols="50" rows="5" id="info1" onkeyup="if(value) sessionStorage.setItem('info1', value);"></textarea>
  <p>
    Здесь вы можете ввести произвольный текст, который будет сохранён в хранилище
    сеанса под ключом <code>info2</code>:</p>
  <textarea cols="50" rows="5" id="info2" onkeyup="if(value) sessionStorage.setItem('info2', value);"></textarea>
  <p>
    Здесь вы можете ввести произвольный текст, который будет сохранён в хранилище
    сеанса под ключом <code>info3</code>:</p>
  <textarea cols="50" rows="5" id="info3" onkeyup="if(value) sessionStorage.setItem('info3', value);"></textarea>
  <p>
    <label>
      Ключи, существующие в хранилище сеанса:<br />
      <br />
      <select id="list" size="3" style="width: 200px;">
      </select>
    </label>
    <br />
    <input type="button" value="Поместить в textarea" onclick="if(list.value) 
  document.getElementById(list.value).value = sessionStorage[list.value]" />
    <input type="button" value="Удалить выделенный" 
    onclick="if(list.value) sessionStorage.removeItem(list.value);" />
    <br />
    <input type="button" value="Удалить все" onclick="sessionStorage.clear();" />
    <input type="button" value="Обновить список" onclick="document.onstorage()" />
    <br />
    <br />
    <a href="Ext_sessionStorage_page2.htm">Перейти на страницу 2</a></p>
  </form>
</body>
</html>
Листинг 21.2. Сохранение сеанса при помощи механизма sessionStorage
Упражнения.

Введите произвольный текст в области ввода. При необходимости нажмите кнопку "Обновить список" (браузер IE8 обрабатывает событие onstorage, остальные - пока нет). Список отображает введённые блоки текста, сохранённые в хранилище сеанса.

Перейдите на страницу 2: а) в той же вкладке; б) в новой вкладке: в) начав новый сеанс (если используется IE8). Проследите в каждом случае: 1) отображаются ли в списке блоки, сохранённые на странице 1; 2) изменится ли список на странице 1, если его изменить на странице 2 (в случае "а" должен).

Откройте код страницы 1 в редакторе и измените везде sessionStorage на localStorage. Запустите изменённую страницу и убедитесь, что данные в локальном хранилище доступны даже после перезапуска браузера.

Пользоваться рассматриваемой технологией следует с осторожностью, поскольку лишь последние версии популярных браузеров её поддерживают. Поэтому на хранилище DOM следует возлагать задачи, связанные с повышением удобства пользователя (например, запоминание состояния страницы), но не с принципиальными моментами, касающимися функционирования приложения.

Ссылки:

http://dev.w3.org/html5/webstorage

http://msdn.microsoft.com/ru-ru/library/cc197062(VS.85).aspx

http://blogs.msdn.com/giorgio/archive/2009/11/29/ie8-and-html-5.aspx

Юрий Шах
Юрий Шах

Профессиональный веб-дизайн: Введение в современные веб-технологии
Самостоятельная работа 4

"3. Создание внешней таблицы.

Теперь создайте таблицу с двумя строками. Во второй строке создайте две ячейки - в первую переместите таблицу цифр, а во вторую - таблицу знаков."

Как в ячейку <td> поместить таблицу? Таблица же сама состоит из ячеек. Исходя из задания следует, что <td> может быть родителем для <td>, но это противоречит правилам HTML?
Если не прав - поправьте.
Также прошу разъяснить, как именно выполнить занное условие - поместить в табличную ячейку таблицу цифр, а в другую ячейку - таблицу знаков? 

Елена Сапегова
Елена Сапегова

После прохождения теоретической части пришло письмо об окончании теоретической части курса, будет ли практическая часть?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989