Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

Горячие клавиши

Создайте DIV, который при нажатии Ctrl-E превращается в TEXTAREA.
Изменения, внесенные в поле, можно сохранить в DIV сочетанием клавиш Ctrl-S или же отменить нажав Esc. После этого, TEXTAREA снова превращается в DIV.

Содержимое, сохраненное как HTML-теги должно работать.

Посмотрите, как оно должно работать: tutorial/browser/events/hotfield/index.html.

Исходный код тут: tutorial/browser/events/hotfield-src/index.html.

Решение
Решение

Как видно из исходного кода, #view - это DIV, который будет содержать результат, а #area - это редактируемое текстовое поле.

Внешний вид

Так как мы преобразуем DIV в TEXTAREA и обратно, нам нужно сделать их практически одинаковыми с виду:

#view, #area {
  height:150px;
  width:400px;
  font-family:arial;
}

Текстовое поле нужно как-то выделить. Можно добавить границу, но тогда изменится блок: он увеличится в размерах и немного съедет текст.

Для того, чтобы сделать размер #area таким же, как и #view, добавим поля(padding):

#view {  
  /* padding + border = 3px */
  padding: 2px; 
  border:1px solid black; 
}

#area заменяет поля границами:

#area {
  border: 3px groove blue;  
  padding: 0px;

  display:none;
}

По умолчанию, текстовое поле скрыто. Кстати, этот код убирает дополнительную рамку в Chrome/Safari, которая появляется вокруг поля, когда на него попадает фокус:

#area:focus { 
  outline: none; /* убирает рамку в Safari при фокусе */
}

Коды клавиш

Чтобы отследить клавиши, нам нужны их скан-коды, а не символы. Это важно, потому что горячие клавиши должны работать независимо от языковой раскладки. Поэтому, мы будем использовать keydown:

document.onkeydown = function(e) {
  e = e || event;
  if (e.keyCode == 27) { // escape
    cancel();
    return false;
  }

  if ((e.ctrlKey && e.keyCode == 'E'.charCodeAt(0)) && !area.offsetHeight) {
    edit();
    return false;
  }

  if ((e.ctrlKey && e.keyCode == 'S'.charCodeAt(0)) && area.offsetHeight) {
    save();
    return false;
  }
}

В примере выше, offsetHeight используется для того, чтобы проверить, отображается элемент или нет. Это очень надежный способ для всех элементов, кроме TR в некоторых старых браузерах.

В отличие от простой проверки display=='none', этот способ работает с элементом, спрятанным с помощью стилей, а так же для элементов, у которых скрыты родители.

Редактирование

Следующие функции переключают режимы. HTML-код разрешен, поэтому возможна прямая трансформация в TEXTAREA и обратно.

function edit() {
    view.style.display = 'none';
    area.value = view.innerHTML;
    area.style.display = 'block';
    area.focus();
}

function save() {
    area.style.display = 'none';
    view.innerHTML = area.value;
    view.style.display = 'block';
}

function cancel() {
    area.style.display = 'none';
    view.style.display = 'block';
}

Полное решение: tutorial/browser/events/hotfield/index.html.
Чтобы проверить его, сфокусируйтесь на правом iframe, пожалуйста.

#130
Наверх

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!