Выразительный JavaScript (Хавербеке) - страница 208

>    cx.strokeStyle = input.value;

>  });

>  return elt("span", null, "Color: ", input);

>};

При смене значения поля >color значения свойств контекста холста >fillStyle и >strokeStyle заменяются на новое значение.

Настройка размера кисти работает сходным образом.

>controls.brushSize = function(cx) {

>  var select = elt("select");

>  var sizes = [1, 2, 3, 5, 8, 12, 25, 35, 50, 75, 100];

>  sizes.forEach(function(size) {

>    select.appendChild(elt("option", {value: size},

>                           size + " pixels"));

>  });

>  select.addEventListener("change", function() {

>    cx.lineWidth = select.value;

>  });

>  return elt("span", null, "Brush size: ", select);

>};

Код создаёт варианты размеров кистей из массива, и убеждается в том, что свойство холста >lineWidth обновлено при выборе кисти.

Сохранение

Чтобы объяснить, как работает ссылка на сохранение, сначала мне нужно рассказать про URL с данными. В отличие от обычных http: и https:, URL с данными не указывают на ресурс, а содержат весь ресурс в себе. Это URL с данными, содержащий простой HTML документ:

>data:text/html,

Hello!

Такие URL полезны для разных вещей, как, например, включение небольших картинок прямо в файл стилей. Они также позволяют нам ссылаться на создаваемые файлы на стороне клиента, в браузере, не перемещая их сперва на какой-либо сервер.

У элемента холста есть удобный метод >toDataURL, который возвращает URL с данными, содержащий картинку на холсте в виде графического файла. Но нам не следует обновлять ссылку для сохранения при каждом изменении картинки. В случае больших картинок перемещение данных в URL занимает много времени. Вместо этого мы подключаем обновление к ссылке, чтоб она обновляла свой атрибут >href каждый раз, когда она получает фокус с клавиатуры или над ней появляется курсор мыши.

>controls.save = function(cx) {

>  var link = elt("a", {href: "/"}, "Save");

>  function update() {

>    try {

>      link.href = cx.canvas.toDataURL();

>    } catch (e) {

>      if (e instanceof SecurityError)

>        link.href = "javascript:alert("

>          JSON.stringify("Can't save: " + e.toString()) + ")";

>      else

>        throw e;

>    }

>  }

>  link.addEventListener("mouseover", update);

>  link.addEventListener("focus", update);

>  return link;

>};

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

Если вы загрузите большую картинку, некоторые браузеры поперхнутся слишком большим URL с данными, который получится в результате. Для маленьких картинок система работает без проблем.