javascript Базовый. Занятие 07

34
Темы лекции: Работа с cookie и графикой. Практическое задание: Работа с cookie и графикой. Тренер: Игорь Шкулипа, к.т.н. JavaScript. Базовый курс Занятие 7

Upload: igor-shkulipa

Post on 21-Mar-2017

98 views

Category:

Education


0 download

TRANSCRIPT

Page 1: JavaScript Базовый. Занятие 07

Темы лекции: Работа с cookie и графикой.

Практическое задание: Работа с cookie и графикой.

Тренер: Игорь Шкулипа, к.т.н.

JavaScript. Базовый курс

Занятие 7

Page 2: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 2

Cookies

Cookie - это небольшая порция текстовой информации, которую серверпередает браузеру. Браузер будет хранить эту информацию ипередавать ее серверу с каждым запросом как часть HTTP заголовка.Одни значения cookie могут храниться только в течение одной сессии,они удаляются после закрытия браузера. Другие, установленные нанекоторый период времени, записываются в файл.

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

Например, в случае авторизованного доступа к чему либо через WWW вcookies сохраняется login и password в течение сессии, что позволяетпользователю не вводить их снова при запросах каждого документа,защищенного паролем.

На использовании cookies также часто строят функции оформлениязаказов в онлайновых магазинах и т.д.

Page 3: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 3

document.cookie

Для чтения и записи cookie используется свойство document.cookie.Однако, оно представляет собой не объект, а строку в специальномформате, для удобной манипуляций с которой нужны дополнительныефункции.

Эта строка состоит из пар ключ=значение, которые перечисляютсячерез точку с запятой с пробелом “; “.

Значит, чтобы прочитать cookie, достаточно разбить строку по ; , изатем найти нужный ключ. Это можно делать либо через split и работус массивом, либо через регулярное выражение.

Page 4: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 4

Запись в document.cookie

В document.cookie можно писать. При этом запись не перезаписываетсуществующие cookie, а дополняет к ним.

У cookie также есть ряд важных настроек, которые желательно указать, так какзначения по умолчанию у них неудобны.

Эти настройки указываются после пары ключ=значение, каждое — после точки сзапятой:

• path=/ - путь, внутри которого будет доступ к cookie. Если не указать, тоимеется в виду текущий путь и все пути ниже него. Как правило,используется path=/, то есть cookie доступно со всех страниц сайта.

• domain=site.com - домен, на котором доступно cookie. Если не указать, тотекущий домен. Допустимо указывать текущий домен site.com и егоподдомены, например forum.site.com.

• expires=Tue, 19 Jan 2038 03:14:07 GMT - дата истечения куки в форматеGMT. Получить нужную дату можно, используя объект Date. Его можноустановить в любое время, а потом вызвать toUTCString(). Если дату неуказать, то cookie будет считаться «сессионным». Такое cookie удаляетсяпри закрытии браузера. Если дата в прошлом, то cookie будет удален.

• secure - cookie можно передавать только по HTTPS.

Page 5: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 5

Полезные функции для работы с cookie

В JavaScript нет способа просто работать с cookie без дополнительныхфункций.

Поэтому следующие функции или их аналоги просто необходимы:

• function getCookie(name)

• function setCookie(name, value, expdays)

• function deleteCookie(name)

Page 6: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 6

function getCookie

// возвращает cookie

function getCookie(name) {

var i, x, y, ARRcookies = document.cookie.split(";");

for (i = 0; i < ARRcookies.length; i++) {

x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));

y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);

x = x.replace(/^\s+|\s+$/g, "");

if (x == name) {

return unescape(y);

}

}

}

Page 7: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 7

function setCookie

// уcтанавливает cookie

function setCookie(name, value, exdays) {

var exdate = new Date();

exdate.setDate(exdate.getDate() + exdays);

var c_value = escape(value) + ((exdays == null) ? "" :

"; expires=" + exdate.toUTCString());

document.cookie = name + "=" + c_value;

}

Page 8: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 8

function deleteCookie

// удаляет cookie

function deleteCookie(name) {

setCookie(name, null, -1);

}

Page 9: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 9

Аргументы функций

• name - название cookie• value - значение cookie (строка)• expires - количество дней до истечения cookie.

Page 10: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 10

Сторонние cookie

При работе с cookie есть важная тонкость, которая касается внешнихресурсов.

Теоретически, любой ресурс, который загружает браузер, можетпоставить cookie.

Cookie, которые не принадлежат основной странице, называются«сторонними» (3rd party) cookies. Не все браузеры их разрешают.

Как правило, в настройках браузера можно поставить «Блокироватьданные и файлы cookie сторонних сайтов».

Цель этого запрета — защитить посетителей от слежки со сторонырекламодателей, которые вместе с картинкой-баннером присылают икуки, таким образом помечая посетителей.

Page 11: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 11

Ограничения cookie

На Cookie наложены ограничения:

• Имя и значение вместе не должны превышать 4кб.

• Общее количество cookie на домен ограничено 30-50, взависимости от браузера.

• Разные домены 2го уровня полностью изолированы. Но в пределахдоменов 3го уровня куки можно ставить свободно с указаниемdomain.

• Сервер может поставить cookie с дополнительным флагомHttpOnly. Cookie с таким параметром передаётся только взаголовках, оно никак не доступно из JavaScript.

Иногда посетители отключают cookie. Отловить это можно проверкойсвойства navigator.cookieEnabled

Page 12: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 12

Альтернативы cookie

• sessionStorage

• globalStorage

• userData

• Client-side Database

• Local SharedObject

Page 13: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 13

sessionStorage

Этот метод поддерживается Firefox начиная со второй версии. Этоглобальный обьект, который хранится в текущей сессии документа ихранится пока документ открыт, перегружается иливосстанавливается, но открытие нового окна или вкладки с тем жеадресом породит новую сессию.

Пример:

sessionStorage.text = «Hello, World!»;

alert(sessionStorage.text);

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

Page 14: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 14

globalStorage

В связи с тем что HTML5 пока еще развивается, в Firefox присутствуетглобальный объект globalStorage, который позволяет хранитьданные в браузере в течении долгого промежутка времени непривязываясь к сессии, что позволяет пользоваться и манипулироватьсохраненными данными при открытия нового окна, вкладки,закрытия/открытия браузера. Привязка хранилища такого родаосуществляется по домену.

Пример:

// Инициализируем хранилище

storage = globalStorage[“somedomain.com”];

// Записываем значение

storage[“hello”] = “Hello, World!”;

// Выводим значение

alert(storage[“hello”]);

// При необходимости удаляем

delete storage[“hello”];

Такой подход дает возможность сохранить до 5 мегабайт информации наклиенте в определенном домене, и использовать хранилище впределах домена и его субдоменов.

Page 15: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 15

Client-side Database

Разработчики WebKit (Safari) вплотную приблизились к рекомендациямHTML5 и дали возможность создавать на клиенте базу данных.

Page 16: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 16

Работа с графикой

Тег canvas - это элемент HTML 5, который предназначен для созданиярастрового изображения при помощи JavaScript.

<canvas height=‘250' width=‘250' id='example'></canvas>

Page 17: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 17

Элементы работы с canvas

• Прямоугольники. Самой элементарной фигурой которую можно рисоватьявляется прямоугольник. Предусмотрено три функции для отрисовкипрямоугольников.

• strokeRect(x, y, ширина, высота) - рисует прямоугольник• fillRect(x, y, ширина, высота) - рисует закрашенный прямоугольник• clearRect(x, y, ширина, высота) - очищает область размером с

прямоугольник заданного размера

• Линии и дуги. Рисование фигур составленных из линий выполняетсяпоследовательно в несколько шагов: beginPath(); closePath(); stroke();

fill();

• beginPath используется что бы начать серию действий описывающих

отрисовку фигуры. Каждый новый вызов этого метода сбрасывает вседействия предыдущего и начинает рисовать заново.

• closePath является не обязательным действием и по сути оно пытается

завершить рисование проведя линию от текущей позиции к позиции скоторой начали рисовать.

• Завершающий шаг это вызовом метода stroke или fill. Первый обводит

фигуру линиями, а второй заливает фигуру сплошным цветом.

Page 18: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 18

Элементы работы с canvas

• Кривые Бернштейна-Безье

quadraticCurveTo(Px, Py, x, y)

bezierCurveTo(P1x, P1y, P2x, P2y, x, y)

x и y это точки в которые необходимо перейти, а координаты P(Px,Py) в квадратичной кривой это дополнительные точки которыеиспользуются для построения кривой. В кубической кривойсоответственно две дополнительные точки.

Page 19: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 19

Ссылки

http://xiper.net/manuals/canvas/

http://www.html5canvas.ru/

Page 20: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 20

SVG.js

SVG (от англ. Scalable Vector Graphics — масштабируемая векторнаяграфика) — язык разметки масштабируемой векторной графики,созданный Консорциумом Всемирной паутины (W3C) и входящий вподмножество расширяемого языка разметки XML, предназначен дляописания двумерной векторной и смешанной векторно-растровойграфики в формате XML.

SVG.js - легковесная библиотека для управления и анимации SVG.

• Анимация размеров, позиции, трансформации (translation, rotation,skew, scale, matrix), цвета

• Masking и Clipping элементов• Модульная структура, простота написания расширений• Text paths (с поддержкой анимации)• Группировка элементов• Динамичные градиенты• События• Понятная документация

https://github.com/wout/svg.js

Page 21: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 21

Пример. HTML

<!DOCTYPE html> <html> <head>

<title>JavaScript Canvas and Cookie Example</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<link rel="stylesheet" href="css/site.css" type="text/css" />

<script type="text/javascript" src="js/functions.js"> </script>

<script type="text/javascript" src="js/secundomer.js"> </script>

<body>

<div id="page">

<div id="head">

<div id="logo">

<img src="img/logo.png" height="94" width="100" alt="logo">

</div>

<div id="title">JavaScript Canvas and Cookie Example</div>

</div>

<div class="main">

<div class="innermain">

<div id="menu" class="menu">

<a href="#" id="mi1" class="menuitem">Secundomer</a>

</div>

<div id="content" class="content">

<canvas height="250" width="250" id="maincanvas"></canvas>

</div> </div> </div>

<div id="foot">

<p onmouseover="this.className = 'pmouseover'"

onmouseout="this.className = 'pmouseout'">

Move Closer to Change the Style</p>

</div> </div>

Page 22: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 22

Пример. HTML

<script type="text/javascript">

var mi1 = document.getElementById("mi1");

var canv = document.getElementById("maincanvas");

mi1.addEventListener("click", StartSecundomer, false);

canv.addEventListener("click", CanvasClicker, false);

</script>

</body>

</html>

Page 23: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 23

Пример. functions.js

Добавлены функции для работы с cookie:

• function getCookie(name)

• function setCookie(name, value, expdays)

• function deleteCookie(name)

Page 24: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 24

Пример. secundomer.js

var Canvas;

var Interval = new Object();

Secundomer = {

//Initial State

secondSize: 1000,

slowness: 10,

zeroAngle: Math.PI,

xCenter: 0,

yCenter: 0,

radius: 80,

backColor: "rgb(255,255,255)",

arrowColor: "rgb(255,0,0)",

currentColor: "",

ciferbladPath: "./img/ciferblat.png",

canvas: Object(),

//Cookies

currentAngle: Math.PI,

currentSecond: 0

}

Page 25: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 25

Пример. Рисуем циферблат

Secundomer.DrawInitial = function () {

var img = new Image();

img.src = Secundomer.ciferbladPath;

var context = Canvas.getContext("2d");

context.width = Canvas.clientWidth;

context.height = Canvas.clientHeight;

Secundomer.xCenter = Math.floor(context.width / 2);

Secundomer.yCenter = Math.floor(context.height / 2);

Secundomer.radius = Math.floor(context.width * 0.25);

context.drawImage(img, 0, 0, context.width, context.height);

context.stroke();

}

Page 26: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 26

Пример. Рисуем стрелку

Secundomer.DrawArrow = function (canvas) {

Secundomer.currentAngle -=

Math.PI / (60 * Secundomer.slowness);

Secundomer.ChangeColor();

var x = Math.floor(Secundomer.xCenter +

Secundomer.radius * Math.sin(Secundomer.currentAngle));

var y = Math.floor(Secundomer.yCenter +

Secundomer.radius * Math.cos(Secundomer.currentAngle));

//Drawing on Canvas

var context = Canvas.getContext("2d");

context.strokeStyle = Secundomer.currentColor;

context.beginPath();

context.moveTo(Secundomer.xCenter, Secundomer.yCenter);

context.lineTo(x, y);

context.stroke();

}

Page 27: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 27

Пример. Смена цвета стрелки

Secundomer.ChangeColor = function () {

if (Secundomer.currentAngle <=

(Secundomer.zeroAngle - 2 * Math.PI)) {

Secundomer.currentAngle = Secundomer.zeroAngle;

Secundomer.currentSecond = 1 - Secundomer.currentSecond;

if (Secundomer.currentSecond == 0) {

Secundomer.currentColor = Secundomer.arrowColor;

} else {

Secundomer.currentColor = Secundomer.backColor;

}

}

}

Page 28: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 28

Пример. Инициализация на основе cookie

Secundomer.InitializeSecundomer = function () {

var cs = getCookie("currentSecond");

var ca = getCookie("currentAngle");

if (cs != undefined) {

Secundomer.currentSecond = +cs;

} else Secundomer.currentSecond = 0;

if (ca != undefined) {

Secundomer.currentAngle = +ca;

} else Secundomer.currentAngle = Secundomer.zeroAngle;

Canvas = document.getElementById("maincanvas");

}

Page 29: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 29

Пример. Сохранение состояния в cookie

Secundomer.SaveSecundomer = function () {

setCookie("currentAngle", Secundomer.currentAngle, 1);

setCookie("currentSecond", Secundomer.currentSecond, 1);

}

Page 30: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 30

Пример. Обнуление параметров

Secundomer.ResetSecundomer = function () {

Secundomer.currentColor = Secundomer.arrowColor;

Secundomer.currentSecond = 0;

Secundomer.currentAngle = Secundomer.zeroAngle;

Canvas = document.getElementById("maincanvas");

}

Page 31: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 31

Пример. Запуск, остановка, возобновление таймера

function StartSecundomer() {

Secundomer.ResetSecundomer();

Secundomer.DrawInitial();

Interval =

window.setInterval(Secundomer.DrawArrow,

Secundomer.secondSize / Secundomer.slowness);

}

function ResumeSecundomer() {

Secundomer.InitializeSecundomer();

Interval =

window.setInterval(Secundomer.DrawArrow,

Secundomer.secondSize / Secundomer.slowness);

}

function StopSecundomer() {

Secundomer.SaveSecundomer();

window.clearInterval(Interval);

}

Page 32: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 32

Пример. Обработчики меню и клика по canvas

function SecundomerMenuClick() {

StartSecundomer();

}

var stop = true;

function CanvasClicker() {

if (stop) {

StopSecundomer();

stop = false;

}

else {

ResumeSecundomer();

stop = true;

}

}

Page 33: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 33

Пример. Результат

Page 34: JavaScript Базовый. Занятие 07

http://www.slideshare.net/IgorShkulipa 34

Лабораторная работа №4.

Нарисовать игру из Лабораторной работы №3 на canvas с возможностьюсохранения текущего состояния игры в cookie.